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 <stdlib.h>  // srand
14#include <algorithm>
15#include <utility>
16
17#include "webrtc/base/checks.h"
18#include "webrtc/base/logging.h"
19#include "webrtc/base/trace_event.h"
20#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
21#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
22#include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h"
23#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
24#include "webrtc/modules/rtp_rtcp/source/time_util.h"
25#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
26#include "webrtc/system_wrappers/include/tick_util.h"
27
28namespace webrtc {
29
30// Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
31static const size_t kMaxPaddingLength = 224;
32static const int kSendSideDelayWindowMs = 1000;
33static const uint32_t kAbsSendTimeFraction = 18;
34
35namespace {
36
37const size_t kRtpHeaderLength = 12;
38const uint16_t kMaxInitRtpSeqNumber = 32767;  // 2^15 -1.
39
40const char* FrameTypeToString(FrameType frame_type) {
41  switch (frame_type) {
42    case kEmptyFrame:
43      return "empty";
44    case kAudioFrameSpeech: return "audio_speech";
45    case kAudioFrameCN: return "audio_cn";
46    case kVideoFrameKey: return "video_key";
47    case kVideoFrameDelta: return "video_delta";
48  }
49  return "";
50}
51
52// TODO(holmer): Merge this with the implementation in
53// remote_bitrate_estimator_abs_send_time.cc.
54uint32_t ConvertMsTo24Bits(int64_t time_ms) {
55  uint32_t time_24_bits =
56      static_cast<uint32_t>(
57          ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) /
58          1000) &
59      0x00FFFFFF;
60  return time_24_bits;
61}
62}  // namespace
63
64class BitrateAggregator {
65 public:
66  explicit BitrateAggregator(BitrateStatisticsObserver* bitrate_callback)
67      : callback_(bitrate_callback),
68        total_bitrate_observer_(*this),
69        retransmit_bitrate_observer_(*this),
70        ssrc_(0) {}
71
72  void OnStatsUpdated() const {
73    if (callback_)
74      callback_->Notify(total_bitrate_observer_.statistics(),
75                        retransmit_bitrate_observer_.statistics(),
76                        ssrc_);
77  }
78
79  Bitrate::Observer* total_bitrate_observer() {
80    return &total_bitrate_observer_;
81  }
82  Bitrate::Observer* retransmit_bitrate_observer() {
83    return &retransmit_bitrate_observer_;
84  }
85
86  void set_ssrc(uint32_t ssrc) { ssrc_ = ssrc; }
87
88 private:
89  // We assume that these observers are called on the same thread, which is
90  // true for RtpSender as they are called on the Process thread.
91  class BitrateObserver : public Bitrate::Observer {
92   public:
93    explicit BitrateObserver(const BitrateAggregator& aggregator)
94        : aggregator_(aggregator) {}
95
96    // Implements Bitrate::Observer.
97    void BitrateUpdated(const BitrateStatistics& stats) override {
98      statistics_ = stats;
99      aggregator_.OnStatsUpdated();
100    }
101
102    BitrateStatistics statistics() const { return statistics_; }
103
104   private:
105    BitrateStatistics statistics_;
106    const BitrateAggregator& aggregator_;
107  };
108
109  BitrateStatisticsObserver* const callback_;
110  BitrateObserver total_bitrate_observer_;
111  BitrateObserver retransmit_bitrate_observer_;
112  uint32_t ssrc_;
113};
114
115RTPSender::RTPSender(
116    bool audio,
117    Clock* clock,
118    Transport* transport,
119    RtpAudioFeedback* audio_feedback,
120    RtpPacketSender* paced_sender,
121    TransportSequenceNumberAllocator* sequence_number_allocator,
122    TransportFeedbackObserver* transport_feedback_observer,
123    BitrateStatisticsObserver* bitrate_callback,
124    FrameCountObserver* frame_count_observer,
125    SendSideDelayObserver* send_side_delay_observer)
126    : clock_(clock),
127      // TODO(holmer): Remove this conversion when we remove the use of
128      // TickTime.
129      clock_delta_ms_(clock_->TimeInMilliseconds() -
130                      TickTime::MillisecondTimestamp()),
131      random_(clock_->TimeInMicroseconds()),
132      bitrates_(new BitrateAggregator(bitrate_callback)),
133      total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()),
134      audio_configured_(audio),
135      audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr),
136      video_(audio ? nullptr : new RTPSenderVideo(clock, this)),
137      paced_sender_(paced_sender),
138      transport_sequence_number_allocator_(sequence_number_allocator),
139      transport_feedback_observer_(transport_feedback_observer),
140      last_capture_time_ms_sent_(0),
141      send_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
142      transport_(transport),
143      sending_media_(true),                      // Default to sending media.
144      max_payload_length_(IP_PACKET_SIZE - 28),  // Default is IP-v4/UDP.
145      packet_over_head_(28),
146      payload_type_(-1),
147      payload_type_map_(),
148      rtp_header_extension_map_(),
149      transmission_time_offset_(0),
150      absolute_send_time_(0),
151      rotation_(kVideoRotation_0),
152      cvo_mode_(kCVONone),
153      transport_sequence_number_(0),
154      // NACK.
155      nack_byte_count_times_(),
156      nack_byte_count_(),
157      nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()),
158      packet_history_(clock),
159      // Statistics
160      statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()),
161      rtp_stats_callback_(NULL),
162      frame_count_observer_(frame_count_observer),
163      send_side_delay_observer_(send_side_delay_observer),
164      // RTP variables
165      start_timestamp_forced_(false),
166      start_timestamp_(0),
167      ssrc_db_(*SSRCDatabase::GetSSRCDatabase()),
168      remote_ssrc_(0),
169      sequence_number_forced_(false),
170      ssrc_forced_(false),
171      timestamp_(0),
172      capture_time_ms_(0),
173      last_timestamp_time_ms_(0),
174      media_has_been_sent_(false),
175      last_packet_marker_bit_(false),
176      csrcs_(),
177      rtx_(kRtxOff),
178      rtx_payload_type_(-1),
179      target_bitrate_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
180      target_bitrate_(0) {
181  memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_));
182  memset(nack_byte_count_, 0, sizeof(nack_byte_count_));
183  // We need to seed the random generator.
184  srand(static_cast<uint32_t>(clock_->TimeInMilliseconds()));
185  ssrc_ = ssrc_db_.CreateSSRC();  // Can't be 0.
186  ssrc_rtx_ = ssrc_db_.CreateSSRC();  // Can't be 0.
187  bitrates_->set_ssrc(ssrc_);
188  // Random start, 16 bits. Can't be 0.
189  sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
190  sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
191}
192
193RTPSender::~RTPSender() {
194  if (remote_ssrc_ != 0) {
195    ssrc_db_.ReturnSSRC(remote_ssrc_);
196  }
197  ssrc_db_.ReturnSSRC(ssrc_);
198
199  SSRCDatabase::ReturnSSRCDatabase();
200  while (!payload_type_map_.empty()) {
201    std::map<int8_t, RtpUtility::Payload*>::iterator it =
202        payload_type_map_.begin();
203    delete it->second;
204    payload_type_map_.erase(it);
205  }
206}
207
208void RTPSender::SetTargetBitrate(uint32_t bitrate) {
209  CriticalSectionScoped cs(target_bitrate_critsect_.get());
210  target_bitrate_ = bitrate;
211}
212
213uint32_t RTPSender::GetTargetBitrate() {
214  CriticalSectionScoped cs(target_bitrate_critsect_.get());
215  return target_bitrate_;
216}
217
218uint16_t RTPSender::ActualSendBitrateKbit() const {
219  return (uint16_t)(total_bitrate_sent_.BitrateNow() / 1000);
220}
221
222uint32_t RTPSender::VideoBitrateSent() const {
223  if (video_) {
224    return video_->VideoBitrateSent();
225  }
226  return 0;
227}
228
229uint32_t RTPSender::FecOverheadRate() const {
230  if (video_) {
231    return video_->FecOverheadRate();
232  }
233  return 0;
234}
235
236uint32_t RTPSender::NackOverheadRate() const {
237  return nack_bitrate_.BitrateLast();
238}
239
240int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) {
241  if (transmission_time_offset > (0x800000 - 1) ||
242      transmission_time_offset < -(0x800000 - 1)) {  // Word24.
243    return -1;
244  }
245  CriticalSectionScoped cs(send_critsect_.get());
246  transmission_time_offset_ = transmission_time_offset;
247  return 0;
248}
249
250int32_t RTPSender::SetAbsoluteSendTime(uint32_t absolute_send_time) {
251  if (absolute_send_time > 0xffffff) {  // UWord24.
252    return -1;
253  }
254  CriticalSectionScoped cs(send_critsect_.get());
255  absolute_send_time_ = absolute_send_time;
256  return 0;
257}
258
259void RTPSender::SetVideoRotation(VideoRotation rotation) {
260  CriticalSectionScoped cs(send_critsect_.get());
261  rotation_ = rotation;
262}
263
264int32_t RTPSender::SetTransportSequenceNumber(uint16_t sequence_number) {
265  CriticalSectionScoped cs(send_critsect_.get());
266  transport_sequence_number_ = sequence_number;
267  return 0;
268}
269
270int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type,
271                                              uint8_t id) {
272  CriticalSectionScoped cs(send_critsect_.get());
273  if (type == kRtpExtensionVideoRotation) {
274    cvo_mode_ = kCVOInactive;
275    return rtp_header_extension_map_.RegisterInactive(type, id);
276  }
277  return rtp_header_extension_map_.Register(type, id);
278}
279
280bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) {
281  CriticalSectionScoped cs(send_critsect_.get());
282  return rtp_header_extension_map_.IsRegistered(type);
283}
284
285int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) {
286  CriticalSectionScoped cs(send_critsect_.get());
287  return rtp_header_extension_map_.Deregister(type);
288}
289
290size_t RTPSender::RtpHeaderExtensionTotalLength() const {
291  CriticalSectionScoped cs(send_critsect_.get());
292  return rtp_header_extension_map_.GetTotalLengthInBytes();
293}
294
295int32_t RTPSender::RegisterPayload(
296    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
297    int8_t payload_number,
298    uint32_t frequency,
299    size_t channels,
300    uint32_t rate) {
301  assert(payload_name);
302  CriticalSectionScoped cs(send_critsect_.get());
303
304  std::map<int8_t, RtpUtility::Payload*>::iterator it =
305      payload_type_map_.find(payload_number);
306
307  if (payload_type_map_.end() != it) {
308    // We already use this payload type.
309    RtpUtility::Payload* payload = it->second;
310    assert(payload);
311
312    // Check if it's the same as we already have.
313    if (RtpUtility::StringCompare(
314            payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) {
315      if (audio_configured_ && payload->audio &&
316          payload->typeSpecific.Audio.frequency == frequency &&
317          (payload->typeSpecific.Audio.rate == rate ||
318           payload->typeSpecific.Audio.rate == 0 || rate == 0)) {
319        payload->typeSpecific.Audio.rate = rate;
320        // Ensure that we update the rate if new or old is zero.
321        return 0;
322      }
323      if (!audio_configured_ && !payload->audio) {
324        return 0;
325      }
326    }
327    return -1;
328  }
329  int32_t ret_val = 0;
330  RtpUtility::Payload* payload = nullptr;
331  if (audio_configured_) {
332    // TODO(mflodman): Change to CreateAudioPayload and make static.
333    ret_val = audio_->RegisterAudioPayload(payload_name, payload_number,
334                                           frequency, channels, rate, &payload);
335  } else {
336    payload = video_->CreateVideoPayload(payload_name, payload_number, rate);
337  }
338  if (payload) {
339    payload_type_map_[payload_number] = payload;
340  }
341  return ret_val;
342}
343
344int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) {
345  CriticalSectionScoped lock(send_critsect_.get());
346
347  std::map<int8_t, RtpUtility::Payload*>::iterator it =
348      payload_type_map_.find(payload_type);
349
350  if (payload_type_map_.end() == it) {
351    return -1;
352  }
353  RtpUtility::Payload* payload = it->second;
354  delete payload;
355  payload_type_map_.erase(it);
356  return 0;
357}
358
359void RTPSender::SetSendPayloadType(int8_t payload_type) {
360  CriticalSectionScoped cs(send_critsect_.get());
361  payload_type_ = payload_type;
362}
363
364int8_t RTPSender::SendPayloadType() const {
365  CriticalSectionScoped cs(send_critsect_.get());
366  return payload_type_;
367}
368
369int RTPSender::SendPayloadFrequency() const {
370  return audio_ != NULL ? audio_->AudioFrequency() : kVideoPayloadTypeFrequency;
371}
372
373int32_t RTPSender::SetMaxPayloadLength(size_t max_payload_length,
374                                       uint16_t packet_over_head) {
375  // Sanity check.
376  RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE)
377      << "Invalid max payload length: " << max_payload_length;
378  CriticalSectionScoped cs(send_critsect_.get());
379  max_payload_length_ = max_payload_length;
380  packet_over_head_ = packet_over_head;
381  return 0;
382}
383
384size_t RTPSender::MaxDataPayloadLength() const {
385  int rtx;
386  {
387    CriticalSectionScoped rtx_lock(send_critsect_.get());
388    rtx = rtx_;
389  }
390  if (audio_configured_) {
391    return max_payload_length_ - RTPHeaderLength();
392  } else {
393    return max_payload_length_ - RTPHeaderLength()  // RTP overhead.
394           - video_->FECPacketOverhead()            // FEC/ULP/RED overhead.
395           - ((rtx) ? 2 : 0);                       // RTX overhead.
396  }
397}
398
399size_t RTPSender::MaxPayloadLength() const {
400  return max_payload_length_;
401}
402
403uint16_t RTPSender::PacketOverHead() const { return packet_over_head_; }
404
405void RTPSender::SetRtxStatus(int mode) {
406  CriticalSectionScoped cs(send_critsect_.get());
407  rtx_ = mode;
408}
409
410int RTPSender::RtxStatus() const {
411  CriticalSectionScoped cs(send_critsect_.get());
412  return rtx_;
413}
414
415void RTPSender::SetRtxSsrc(uint32_t ssrc) {
416  CriticalSectionScoped cs(send_critsect_.get());
417  ssrc_rtx_ = ssrc;
418}
419
420uint32_t RTPSender::RtxSsrc() const {
421  CriticalSectionScoped cs(send_critsect_.get());
422  return ssrc_rtx_;
423}
424
425void RTPSender::SetRtxPayloadType(int payload_type,
426                                  int associated_payload_type) {
427  CriticalSectionScoped cs(send_critsect_.get());
428  RTC_DCHECK_LE(payload_type, 127);
429  RTC_DCHECK_LE(associated_payload_type, 127);
430  if (payload_type < 0) {
431    LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
432    return;
433  }
434
435  rtx_payload_type_map_[associated_payload_type] = payload_type;
436  rtx_payload_type_ = payload_type;
437}
438
439std::pair<int, int> RTPSender::RtxPayloadType() const {
440  CriticalSectionScoped cs(send_critsect_.get());
441  for (const auto& kv : rtx_payload_type_map_) {
442    if (kv.second == rtx_payload_type_) {
443      return std::make_pair(rtx_payload_type_, kv.first);
444    }
445  }
446  return std::make_pair(-1, -1);
447}
448
449int32_t RTPSender::CheckPayloadType(int8_t payload_type,
450                                    RtpVideoCodecTypes* video_type) {
451  CriticalSectionScoped cs(send_critsect_.get());
452
453  if (payload_type < 0) {
454    LOG(LS_ERROR) << "Invalid payload_type " << payload_type;
455    return -1;
456  }
457  if (audio_configured_) {
458    int8_t red_pl_type = -1;
459    if (audio_->RED(&red_pl_type) == 0) {
460      // We have configured RED.
461      if (red_pl_type == payload_type) {
462        // And it's a match...
463        return 0;
464      }
465    }
466  }
467  if (payload_type_ == payload_type) {
468    if (!audio_configured_) {
469      *video_type = video_->VideoCodecType();
470    }
471    return 0;
472  }
473  std::map<int8_t, RtpUtility::Payload*>::iterator it =
474      payload_type_map_.find(payload_type);
475  if (it == payload_type_map_.end()) {
476    LOG(LS_WARNING) << "Payload type " << static_cast<int>(payload_type)
477                    << " not registered.";
478    return -1;
479  }
480  SetSendPayloadType(payload_type);
481  RtpUtility::Payload* payload = it->second;
482  assert(payload);
483  if (!payload->audio && !audio_configured_) {
484    video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType);
485    *video_type = payload->typeSpecific.Video.videoCodecType;
486    video_->SetMaxConfiguredBitrateVideo(payload->typeSpecific.Video.maxRate);
487  }
488  return 0;
489}
490
491RTPSenderInterface::CVOMode RTPSender::ActivateCVORtpHeaderExtension() {
492  if (cvo_mode_ == kCVOInactive) {
493    CriticalSectionScoped cs(send_critsect_.get());
494    if (rtp_header_extension_map_.SetActive(kRtpExtensionVideoRotation, true)) {
495      cvo_mode_ = kCVOActivated;
496    }
497  }
498  return cvo_mode_;
499}
500
501int32_t RTPSender::SendOutgoingData(FrameType frame_type,
502                                    int8_t payload_type,
503                                    uint32_t capture_timestamp,
504                                    int64_t capture_time_ms,
505                                    const uint8_t* payload_data,
506                                    size_t payload_size,
507                                    const RTPFragmentationHeader* fragmentation,
508                                    const RTPVideoHeader* rtp_hdr) {
509  uint32_t ssrc;
510  {
511    // Drop this packet if we're not sending media packets.
512    CriticalSectionScoped cs(send_critsect_.get());
513    ssrc = ssrc_;
514    if (!sending_media_) {
515      return 0;
516    }
517  }
518  RtpVideoCodecTypes video_type = kRtpVideoGeneric;
519  if (CheckPayloadType(payload_type, &video_type) != 0) {
520    LOG(LS_ERROR) << "Don't send data with unknown payload type: "
521                  << static_cast<int>(payload_type) << ".";
522    return -1;
523  }
524
525  int32_t ret_val;
526  if (audio_configured_) {
527    TRACE_EVENT_ASYNC_STEP1("webrtc", "Audio", capture_timestamp,
528                            "Send", "type", FrameTypeToString(frame_type));
529    assert(frame_type == kAudioFrameSpeech || frame_type == kAudioFrameCN ||
530           frame_type == kEmptyFrame);
531
532    ret_val = audio_->SendAudio(frame_type, payload_type, capture_timestamp,
533                                payload_data, payload_size, fragmentation);
534  } else {
535    TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", capture_time_ms,
536                            "Send", "type", FrameTypeToString(frame_type));
537    assert(frame_type != kAudioFrameSpeech && frame_type != kAudioFrameCN);
538
539    if (frame_type == kEmptyFrame)
540      return 0;
541
542    ret_val =
543        video_->SendVideo(video_type, frame_type, payload_type,
544                          capture_timestamp, capture_time_ms, payload_data,
545                          payload_size, fragmentation, rtp_hdr);
546  }
547
548  CriticalSectionScoped cs(statistics_crit_.get());
549  // Note: This is currently only counting for video.
550  if (frame_type == kVideoFrameKey) {
551    ++frame_counts_.key_frames;
552  } else if (frame_type == kVideoFrameDelta) {
553    ++frame_counts_.delta_frames;
554  }
555  if (frame_count_observer_) {
556    frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc);
557  }
558
559  return ret_val;
560}
561
562size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) {
563  {
564    CriticalSectionScoped cs(send_critsect_.get());
565    if ((rtx_ & kRtxRedundantPayloads) == 0)
566      return 0;
567  }
568
569  uint8_t buffer[IP_PACKET_SIZE];
570  int bytes_left = static_cast<int>(bytes_to_send);
571  while (bytes_left > 0) {
572    size_t length = bytes_left;
573    int64_t capture_time_ms;
574    if (!packet_history_.GetBestFittingPacket(buffer, &length,
575                                              &capture_time_ms)) {
576      break;
577    }
578    if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false))
579      break;
580    RtpUtility::RtpHeaderParser rtp_parser(buffer, length);
581    RTPHeader rtp_header;
582    rtp_parser.Parse(&rtp_header);
583    bytes_left -= static_cast<int>(length - rtp_header.headerLength);
584  }
585  return bytes_to_send - bytes_left;
586}
587
588void RTPSender::BuildPaddingPacket(uint8_t* packet,
589                                   size_t header_length,
590                                   size_t padding_length) {
591  packet[0] |= 0x20;  // Set padding bit.
592  int32_t* data = reinterpret_cast<int32_t*>(&(packet[header_length]));
593
594  // Fill data buffer with random data.
595  for (size_t j = 0; j < (padding_length >> 2); ++j) {
596    data[j] = rand();  // NOLINT
597  }
598  // Set number of padding bytes in the last byte of the packet.
599  packet[header_length + padding_length - 1] =
600      static_cast<uint8_t>(padding_length);
601}
602
603size_t RTPSender::SendPadData(size_t bytes,
604                              bool timestamp_provided,
605                              uint32_t timestamp,
606                              int64_t capture_time_ms) {
607  // Always send full padding packets. This is accounted for by the
608  // RtpPacketSender,
609  // which will make sure we don't send too much padding even if a single packet
610  // is larger than requested.
611  size_t padding_bytes_in_packet =
612      std::min(MaxDataPayloadLength(), kMaxPaddingLength);
613  size_t bytes_sent = 0;
614  bool using_transport_seq = rtp_header_extension_map_.IsRegistered(
615                                 kRtpExtensionTransportSequenceNumber) &&
616                             transport_sequence_number_allocator_;
617  for (; bytes > 0; bytes -= padding_bytes_in_packet) {
618    if (bytes < padding_bytes_in_packet)
619      bytes = padding_bytes_in_packet;
620
621    uint32_t ssrc;
622    uint16_t sequence_number;
623    int payload_type;
624    bool over_rtx;
625    {
626      CriticalSectionScoped cs(send_critsect_.get());
627      if (!timestamp_provided) {
628        timestamp = timestamp_;
629        capture_time_ms = capture_time_ms_;
630      }
631      if (rtx_ == kRtxOff) {
632        // Without RTX we can't send padding in the middle of frames.
633        if (!last_packet_marker_bit_)
634          return 0;
635        ssrc = ssrc_;
636        sequence_number = sequence_number_;
637        ++sequence_number_;
638        payload_type = payload_type_;
639        over_rtx = false;
640      } else {
641        // Without abs-send-time a media packet must be sent before padding so
642        // that the timestamps used for estimation are correct.
643        if (!media_has_been_sent_ && !rtp_header_extension_map_.IsRegistered(
644            kRtpExtensionAbsoluteSendTime))
645          return 0;
646        // Only change change the timestamp of padding packets sent over RTX.
647        // Padding only packets over RTP has to be sent as part of a media
648        // frame (and therefore the same timestamp).
649        if (last_timestamp_time_ms_ > 0) {
650          timestamp +=
651              (clock_->TimeInMilliseconds() - last_timestamp_time_ms_) * 90;
652          capture_time_ms +=
653              (clock_->TimeInMilliseconds() - last_timestamp_time_ms_);
654        }
655        ssrc = ssrc_rtx_;
656        sequence_number = sequence_number_rtx_;
657        ++sequence_number_rtx_;
658        payload_type = rtx_payload_type_;
659        over_rtx = true;
660      }
661    }
662
663    uint8_t padding_packet[IP_PACKET_SIZE];
664    size_t header_length =
665        CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp,
666                        sequence_number, std::vector<uint32_t>());
667    BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet);
668    size_t length = padding_bytes_in_packet + header_length;
669    int64_t now_ms = clock_->TimeInMilliseconds();
670
671    RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length);
672    RTPHeader rtp_header;
673    rtp_parser.Parse(&rtp_header);
674
675    if (capture_time_ms > 0) {
676      UpdateTransmissionTimeOffset(
677          padding_packet, length, rtp_header, now_ms - capture_time_ms);
678    }
679
680    UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms);
681
682    PacketOptions options;
683    if (using_transport_seq) {
684      options.packet_id =
685          UpdateTransportSequenceNumber(padding_packet, length, rtp_header);
686    }
687
688    if (using_transport_seq && transport_feedback_observer_) {
689      transport_feedback_observer_->AddPacket(options.packet_id, length, true);
690    }
691
692    if (!SendPacketToNetwork(padding_packet, length, options))
693      break;
694
695    bytes_sent += padding_bytes_in_packet;
696    UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false);
697  }
698
699  return bytes_sent;
700}
701
702void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) {
703  packet_history_.SetStorePacketsStatus(enable, number_to_store);
704}
705
706bool RTPSender::StorePackets() const {
707  return packet_history_.StorePackets();
708}
709
710int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) {
711  size_t length = IP_PACKET_SIZE;
712  uint8_t data_buffer[IP_PACKET_SIZE];
713  int64_t capture_time_ms;
714
715  if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true,
716                                               data_buffer, &length,
717                                               &capture_time_ms)) {
718    // Packet not found.
719    return 0;
720  }
721
722  if (paced_sender_) {
723    RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length);
724    RTPHeader header;
725    if (!rtp_parser.Parse(&header)) {
726      assert(false);
727      return -1;
728    }
729    // Convert from TickTime to Clock since capture_time_ms is based on
730    // TickTime.
731    int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_;
732    paced_sender_->InsertPacket(
733        RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber,
734        corrected_capture_tims_ms, length - header.headerLength, true);
735
736    return length;
737  }
738  int rtx = kRtxOff;
739  {
740    CriticalSectionScoped lock(send_critsect_.get());
741    rtx = rtx_;
742  }
743  if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms,
744                            (rtx & kRtxRetransmitted) > 0, true)) {
745    return -1;
746  }
747  return static_cast<int32_t>(length);
748}
749
750bool RTPSender::SendPacketToNetwork(const uint8_t* packet,
751                                    size_t size,
752                                    const PacketOptions& options) {
753  int bytes_sent = -1;
754  if (transport_) {
755    bytes_sent = transport_->SendRtp(packet, size, options)
756                     ? static_cast<int>(size)
757                     : -1;
758  }
759  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
760                       "RTPSender::SendPacketToNetwork", "size", size, "sent",
761                       bytes_sent);
762  // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.
763  if (bytes_sent <= 0) {
764    LOG(LS_WARNING) << "Transport failed to send packet";
765    return false;
766  }
767  return true;
768}
769
770int RTPSender::SelectiveRetransmissions() const {
771  if (!video_)
772    return -1;
773  return video_->SelectiveRetransmissions();
774}
775
776int RTPSender::SetSelectiveRetransmissions(uint8_t settings) {
777  if (!video_)
778    return -1;
779  video_->SetSelectiveRetransmissions(settings);
780  return 0;
781}
782
783void RTPSender::OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers,
784                               int64_t avg_rtt) {
785  TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
786               "RTPSender::OnReceivedNACK", "num_seqnum",
787               nack_sequence_numbers.size(), "avg_rtt", avg_rtt);
788  const int64_t now = clock_->TimeInMilliseconds();
789  uint32_t bytes_re_sent = 0;
790  uint32_t target_bitrate = GetTargetBitrate();
791
792  // Enough bandwidth to send NACK?
793  if (!ProcessNACKBitRate(now)) {
794    LOG(LS_INFO) << "NACK bitrate reached. Skip sending NACK response. Target "
795                 << target_bitrate;
796    return;
797  }
798
799  for (std::list<uint16_t>::const_iterator it = nack_sequence_numbers.begin();
800      it != nack_sequence_numbers.end(); ++it) {
801    const int32_t bytes_sent = ReSendPacket(*it, 5 + avg_rtt);
802    if (bytes_sent > 0) {
803      bytes_re_sent += bytes_sent;
804    } else if (bytes_sent == 0) {
805      // The packet has previously been resent.
806      // Try resending next packet in the list.
807      continue;
808    } else {
809      // Failed to send one Sequence number. Give up the rest in this nack.
810      LOG(LS_WARNING) << "Failed resending RTP packet " << *it
811                      << ", Discard rest of packets";
812      break;
813    }
814    // Delay bandwidth estimate (RTT * BW).
815    if (target_bitrate != 0 && avg_rtt) {
816      // kbits/s * ms = bits => bits/8 = bytes
817      size_t target_bytes =
818          (static_cast<size_t>(target_bitrate / 1000) * avg_rtt) >> 3;
819      if (bytes_re_sent > target_bytes) {
820        break;  // Ignore the rest of the packets in the list.
821      }
822    }
823  }
824  if (bytes_re_sent > 0) {
825    UpdateNACKBitRate(bytes_re_sent, now);
826  }
827}
828
829bool RTPSender::ProcessNACKBitRate(uint32_t now) {
830  uint32_t num = 0;
831  size_t byte_count = 0;
832  const uint32_t kAvgIntervalMs = 1000;
833  uint32_t target_bitrate = GetTargetBitrate();
834
835  CriticalSectionScoped cs(send_critsect_.get());
836
837  if (target_bitrate == 0) {
838    return true;
839  }
840  for (num = 0; num < NACK_BYTECOUNT_SIZE; ++num) {
841    if ((now - nack_byte_count_times_[num]) > kAvgIntervalMs) {
842      // Don't use data older than 1sec.
843      break;
844    } else {
845      byte_count += nack_byte_count_[num];
846    }
847  }
848  uint32_t time_interval = kAvgIntervalMs;
849  if (num == NACK_BYTECOUNT_SIZE) {
850    // More than NACK_BYTECOUNT_SIZE nack messages has been received
851    // during the last msg_interval.
852    if (nack_byte_count_times_[num - 1] <= now) {
853      time_interval = now - nack_byte_count_times_[num - 1];
854    }
855  }
856  return (byte_count * 8) < (target_bitrate / 1000 * time_interval);
857}
858
859void RTPSender::UpdateNACKBitRate(uint32_t bytes, int64_t now) {
860  CriticalSectionScoped cs(send_critsect_.get());
861  if (bytes == 0)
862    return;
863  nack_bitrate_.Update(bytes);
864  // Save bitrate statistics.
865  // Shift all but first time.
866  for (int i = NACK_BYTECOUNT_SIZE - 2; i >= 0; i--) {
867    nack_byte_count_[i + 1] = nack_byte_count_[i];
868    nack_byte_count_times_[i + 1] = nack_byte_count_times_[i];
869  }
870  nack_byte_count_[0] = bytes;
871  nack_byte_count_times_[0] = now;
872}
873
874// Called from pacer when we can send the packet.
875bool RTPSender::TimeToSendPacket(uint16_t sequence_number,
876                                 int64_t capture_time_ms,
877                                 bool retransmission) {
878  size_t length = IP_PACKET_SIZE;
879  uint8_t data_buffer[IP_PACKET_SIZE];
880  int64_t stored_time_ms;
881
882  if (!packet_history_.GetPacketAndSetSendTime(sequence_number,
883                                               0,
884                                               retransmission,
885                                               data_buffer,
886                                               &length,
887                                               &stored_time_ms)) {
888    // Packet cannot be found. Allow sending to continue.
889    return true;
890  }
891  if (!retransmission && capture_time_ms > 0) {
892    UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds());
893  }
894  int rtx;
895  {
896    CriticalSectionScoped lock(send_critsect_.get());
897    rtx = rtx_;
898  }
899  return PrepareAndSendPacket(data_buffer,
900                              length,
901                              capture_time_ms,
902                              retransmission && (rtx & kRtxRetransmitted) > 0,
903                              retransmission);
904}
905
906bool RTPSender::PrepareAndSendPacket(uint8_t* buffer,
907                                     size_t length,
908                                     int64_t capture_time_ms,
909                                     bool send_over_rtx,
910                                     bool is_retransmit) {
911  uint8_t* buffer_to_send_ptr = buffer;
912
913  RtpUtility::RtpHeaderParser rtp_parser(buffer, length);
914  RTPHeader rtp_header;
915  rtp_parser.Parse(&rtp_header);
916  if (!is_retransmit && rtp_header.markerBit) {
917    TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend",
918                           capture_time_ms);
919  }
920
921  TRACE_EVENT_INSTANT2(
922      TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PrepareAndSendPacket",
923      "timestamp", rtp_header.timestamp, "seqnum", rtp_header.sequenceNumber);
924
925  uint8_t data_buffer_rtx[IP_PACKET_SIZE];
926  if (send_over_rtx) {
927    BuildRtxPacket(buffer, &length, data_buffer_rtx);
928    buffer_to_send_ptr = data_buffer_rtx;
929  }
930
931  int64_t now_ms = clock_->TimeInMilliseconds();
932  int64_t diff_ms = now_ms - capture_time_ms;
933  UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header,
934                               diff_ms);
935  UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms);
936
937  // TODO(sprang): Potentially too much overhead in IsRegistered()?
938  bool using_transport_seq = rtp_header_extension_map_.IsRegistered(
939                                 kRtpExtensionTransportSequenceNumber) &&
940                             transport_sequence_number_allocator_;
941
942  PacketOptions options;
943  if (using_transport_seq) {
944    options.packet_id =
945        UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header);
946  }
947
948  if (using_transport_seq && transport_feedback_observer_) {
949    transport_feedback_observer_->AddPacket(options.packet_id, length, true);
950  }
951
952  bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options);
953  if (ret) {
954    CriticalSectionScoped lock(send_critsect_.get());
955    media_has_been_sent_ = true;
956  }
957  UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx,
958                 is_retransmit);
959  return ret;
960}
961
962void RTPSender::UpdateRtpStats(const uint8_t* buffer,
963                               size_t packet_length,
964                               const RTPHeader& header,
965                               bool is_rtx,
966                               bool is_retransmit) {
967  StreamDataCounters* counters;
968  // Get ssrc before taking statistics_crit_ to avoid possible deadlock.
969  uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC();
970
971  CriticalSectionScoped lock(statistics_crit_.get());
972  if (is_rtx) {
973    counters = &rtx_rtp_stats_;
974  } else {
975    counters = &rtp_stats_;
976  }
977
978  total_bitrate_sent_.Update(packet_length);
979
980  if (counters->first_packet_time_ms == -1) {
981    counters->first_packet_time_ms = clock_->TimeInMilliseconds();
982  }
983  if (IsFecPacket(buffer, header)) {
984    counters->fec.AddPacket(packet_length, header);
985  }
986  if (is_retransmit) {
987    counters->retransmitted.AddPacket(packet_length, header);
988  }
989  counters->transmitted.AddPacket(packet_length, header);
990
991  if (rtp_stats_callback_) {
992    rtp_stats_callback_->DataCountersUpdated(*counters, ssrc);
993  }
994}
995
996bool RTPSender::IsFecPacket(const uint8_t* buffer,
997                            const RTPHeader& header) const {
998  if (!video_) {
999    return false;
1000  }
1001  bool fec_enabled;
1002  uint8_t pt_red;
1003  uint8_t pt_fec;
1004  video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec);
1005  return fec_enabled &&
1006      header.payloadType == pt_red &&
1007      buffer[header.headerLength] == pt_fec;
1008}
1009
1010size_t RTPSender::TimeToSendPadding(size_t bytes) {
1011  if (audio_configured_ || bytes == 0)
1012    return 0;
1013  {
1014    CriticalSectionScoped cs(send_critsect_.get());
1015    if (!sending_media_)
1016      return 0;
1017  }
1018  size_t bytes_sent = TrySendRedundantPayloads(bytes);
1019  if (bytes_sent < bytes)
1020    bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0);
1021  return bytes_sent;
1022}
1023
1024// TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again.
1025int32_t RTPSender::SendToNetwork(uint8_t* buffer,
1026                                 size_t payload_length,
1027                                 size_t rtp_header_length,
1028                                 int64_t capture_time_ms,
1029                                 StorageType storage,
1030                                 RtpPacketSender::Priority priority) {
1031  RtpUtility::RtpHeaderParser rtp_parser(buffer,
1032                                         payload_length + rtp_header_length);
1033  RTPHeader rtp_header;
1034  rtp_parser.Parse(&rtp_header);
1035
1036  int64_t now_ms = clock_->TimeInMilliseconds();
1037
1038  // |capture_time_ms| <= 0 is considered invalid.
1039  // TODO(holmer): This should be changed all over Video Engine so that negative
1040  // time is consider invalid, while 0 is considered a valid time.
1041  if (capture_time_ms > 0) {
1042    UpdateTransmissionTimeOffset(buffer, payload_length + rtp_header_length,
1043                                 rtp_header, now_ms - capture_time_ms);
1044  }
1045
1046  UpdateAbsoluteSendTime(buffer, payload_length + rtp_header_length,
1047                         rtp_header, now_ms);
1048
1049  // Used for NACK and to spread out the transmission of packets.
1050  if (packet_history_.PutRTPPacket(buffer, rtp_header_length + payload_length,
1051                                   capture_time_ms, storage) != 0) {
1052    return -1;
1053  }
1054
1055  if (paced_sender_) {
1056    // Correct offset between implementations of millisecond time stamps in
1057    // TickTime and Clock.
1058    int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_;
1059    paced_sender_->InsertPacket(priority, rtp_header.ssrc,
1060                                rtp_header.sequenceNumber, corrected_time_ms,
1061                                payload_length, false);
1062    if (last_capture_time_ms_sent_ == 0 ||
1063        corrected_time_ms > last_capture_time_ms_sent_) {
1064      last_capture_time_ms_sent_ = corrected_time_ms;
1065      TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
1066                               "PacedSend", corrected_time_ms,
1067                               "capture_time_ms", corrected_time_ms);
1068    }
1069    return 0;
1070  }
1071  if (capture_time_ms > 0) {
1072    UpdateDelayStatistics(capture_time_ms, now_ms);
1073  }
1074
1075  size_t length = payload_length + rtp_header_length;
1076  bool sent = SendPacketToNetwork(buffer, length, PacketOptions());
1077
1078  // Mark the packet as sent in the history even if send failed. Dropping a
1079  // packet here should be treated as any other packet drop so we should be
1080  // ready for a retransmission.
1081  packet_history_.SetSent(rtp_header.sequenceNumber);
1082
1083  if (!sent)
1084    return -1;
1085
1086  {
1087    CriticalSectionScoped lock(send_critsect_.get());
1088    media_has_been_sent_ = true;
1089  }
1090  UpdateRtpStats(buffer, length, rtp_header, false, false);
1091  return 0;
1092}
1093
1094void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
1095  if (!send_side_delay_observer_)
1096    return;
1097
1098  uint32_t ssrc;
1099  int avg_delay_ms = 0;
1100  int max_delay_ms = 0;
1101  {
1102    CriticalSectionScoped lock(send_critsect_.get());
1103    ssrc = ssrc_;
1104  }
1105  {
1106    CriticalSectionScoped cs(statistics_crit_.get());
1107    // TODO(holmer): Compute this iteratively instead.
1108    send_delays_[now_ms] = now_ms - capture_time_ms;
1109    send_delays_.erase(send_delays_.begin(),
1110                       send_delays_.lower_bound(now_ms -
1111                       kSendSideDelayWindowMs));
1112    int num_delays = 0;
1113    for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
1114         it != send_delays_.end(); ++it) {
1115      max_delay_ms = std::max(max_delay_ms, it->second);
1116      avg_delay_ms += it->second;
1117      ++num_delays;
1118    }
1119    if (num_delays == 0)
1120      return;
1121    avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays;
1122  }
1123  send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms,
1124                                                  ssrc);
1125}
1126
1127void RTPSender::ProcessBitrate() {
1128  CriticalSectionScoped cs(send_critsect_.get());
1129  total_bitrate_sent_.Process();
1130  nack_bitrate_.Process();
1131  if (audio_configured_) {
1132    return;
1133  }
1134  video_->ProcessBitrate();
1135}
1136
1137size_t RTPSender::RTPHeaderLength() const {
1138  CriticalSectionScoped lock(send_critsect_.get());
1139  size_t rtp_header_length = kRtpHeaderLength;
1140  rtp_header_length += sizeof(uint32_t) * csrcs_.size();
1141  rtp_header_length += RtpHeaderExtensionTotalLength();
1142  return rtp_header_length;
1143}
1144
1145uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) {
1146  CriticalSectionScoped cs(send_critsect_.get());
1147  uint16_t first_allocated_sequence_number = sequence_number_;
1148  sequence_number_ += packets_to_send;
1149  return first_allocated_sequence_number;
1150}
1151
1152void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats,
1153                                StreamDataCounters* rtx_stats) const {
1154  CriticalSectionScoped lock(statistics_crit_.get());
1155  *rtp_stats = rtp_stats_;
1156  *rtx_stats = rtx_rtp_stats_;
1157}
1158
1159size_t RTPSender::CreateRtpHeader(uint8_t* header,
1160                                  int8_t payload_type,
1161                                  uint32_t ssrc,
1162                                  bool marker_bit,
1163                                  uint32_t timestamp,
1164                                  uint16_t sequence_number,
1165                                  const std::vector<uint32_t>& csrcs) const {
1166  header[0] = 0x80;  // version 2.
1167  header[1] = static_cast<uint8_t>(payload_type);
1168  if (marker_bit) {
1169    header[1] |= kRtpMarkerBitMask;  // Marker bit is set.
1170  }
1171  ByteWriter<uint16_t>::WriteBigEndian(header + 2, sequence_number);
1172  ByteWriter<uint32_t>::WriteBigEndian(header + 4, timestamp);
1173  ByteWriter<uint32_t>::WriteBigEndian(header + 8, ssrc);
1174  int32_t rtp_header_length = kRtpHeaderLength;
1175
1176  if (csrcs.size() > 0) {
1177    uint8_t* ptr = &header[rtp_header_length];
1178    for (size_t i = 0; i < csrcs.size(); ++i) {
1179      ByteWriter<uint32_t>::WriteBigEndian(ptr, csrcs[i]);
1180      ptr += 4;
1181    }
1182    header[0] = (header[0] & 0xf0) | csrcs.size();
1183
1184    // Update length of header.
1185    rtp_header_length += sizeof(uint32_t) * csrcs.size();
1186  }
1187
1188  uint16_t len =
1189      BuildRTPHeaderExtension(header + rtp_header_length, marker_bit);
1190  if (len > 0) {
1191    header[0] |= 0x10;  // Set extension bit.
1192    rtp_header_length += len;
1193  }
1194  return rtp_header_length;
1195}
1196
1197int32_t RTPSender::BuildRTPheader(uint8_t* data_buffer,
1198                                  int8_t payload_type,
1199                                  bool marker_bit,
1200                                  uint32_t capture_timestamp,
1201                                  int64_t capture_time_ms,
1202                                  bool timestamp_provided,
1203                                  bool inc_sequence_number) {
1204  assert(payload_type >= 0);
1205  CriticalSectionScoped cs(send_critsect_.get());
1206
1207  if (timestamp_provided) {
1208    timestamp_ = start_timestamp_ + capture_timestamp;
1209  } else {
1210    // Make a unique time stamp.
1211    // We can't inc by the actual time, since then we increase the risk of back
1212    // timing.
1213    timestamp_++;
1214  }
1215  last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1216  uint32_t sequence_number = sequence_number_++;
1217  capture_time_ms_ = capture_time_ms;
1218  last_packet_marker_bit_ = marker_bit;
1219  return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit,
1220                         timestamp_, sequence_number, csrcs_);
1221}
1222
1223uint16_t RTPSender::BuildRTPHeaderExtension(uint8_t* data_buffer,
1224                                            bool marker_bit) const {
1225  if (rtp_header_extension_map_.Size() <= 0) {
1226    return 0;
1227  }
1228  // RTP header extension, RFC 3550.
1229  //   0                   1                   2                   3
1230  //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1231  //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1232  //  |      defined by profile       |           length              |
1233  //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1234  //  |                        header extension                       |
1235  //  |                             ....                              |
1236  //
1237  const uint32_t kPosLength = 2;
1238  const uint32_t kHeaderLength = kRtpOneByteHeaderLength;
1239
1240  // Add extension ID (0xBEDE).
1241  ByteWriter<uint16_t>::WriteBigEndian(data_buffer,
1242                                       kRtpOneByteHeaderExtensionId);
1243
1244  // Add extensions.
1245  uint16_t total_block_length = 0;
1246
1247  RTPExtensionType type = rtp_header_extension_map_.First();
1248  while (type != kRtpExtensionNone) {
1249    uint8_t block_length = 0;
1250    uint8_t* extension_data = &data_buffer[kHeaderLength + total_block_length];
1251    switch (type) {
1252      case kRtpExtensionTransmissionTimeOffset:
1253        block_length = BuildTransmissionTimeOffsetExtension(extension_data);
1254        break;
1255      case kRtpExtensionAudioLevel:
1256        block_length = BuildAudioLevelExtension(extension_data);
1257        break;
1258      case kRtpExtensionAbsoluteSendTime:
1259        block_length = BuildAbsoluteSendTimeExtension(extension_data);
1260        break;
1261      case kRtpExtensionVideoRotation:
1262        block_length = BuildVideoRotationExtension(extension_data);
1263        break;
1264      case kRtpExtensionTransportSequenceNumber:
1265        block_length = BuildTransportSequenceNumberExtension(
1266            extension_data, transport_sequence_number_);
1267        break;
1268      default:
1269        assert(false);
1270    }
1271    total_block_length += block_length;
1272    type = rtp_header_extension_map_.Next(type);
1273  }
1274  if (total_block_length == 0) {
1275    // No extension added.
1276    return 0;
1277  }
1278  // Add padding elements until we've filled a 32 bit block.
1279  size_t padding_bytes =
1280      RtpUtility::Word32Align(total_block_length) - total_block_length;
1281  if (padding_bytes > 0) {
1282    memset(&data_buffer[kHeaderLength + total_block_length], 0, padding_bytes);
1283    total_block_length += padding_bytes;
1284  }
1285  // Set header length (in number of Word32, header excluded).
1286  ByteWriter<uint16_t>::WriteBigEndian(data_buffer + kPosLength,
1287                                       total_block_length / 4);
1288  // Total added length.
1289  return kHeaderLength + total_block_length;
1290}
1291
1292uint8_t RTPSender::BuildTransmissionTimeOffsetExtension(
1293    uint8_t* data_buffer) const {
1294  // From RFC 5450: Transmission Time Offsets in RTP Streams.
1295  //
1296  // The transmission time is signaled to the receiver in-band using the
1297  // general mechanism for RTP header extensions [RFC5285]. The payload
1298  // of this extension (the transmitted value) is a 24-bit signed integer.
1299  // When added to the RTP timestamp of the packet, it represents the
1300  // "effective" RTP transmission time of the packet, on the RTP
1301  // timescale.
1302  //
1303  // The form of the transmission offset extension block:
1304  //
1305  //    0                   1                   2                   3
1306  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1307  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1308  //   |  ID   | len=2 |              transmission offset              |
1309  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1310
1311  // Get id defined by user.
1312  uint8_t id;
1313  if (rtp_header_extension_map_.GetId(kRtpExtensionTransmissionTimeOffset,
1314                                      &id) != 0) {
1315    // Not registered.
1316    return 0;
1317  }
1318  size_t pos = 0;
1319  const uint8_t len = 2;
1320  data_buffer[pos++] = (id << 4) + len;
1321  ByteWriter<int32_t, 3>::WriteBigEndian(data_buffer + pos,
1322                                         transmission_time_offset_);
1323  pos += 3;
1324  assert(pos == kTransmissionTimeOffsetLength);
1325  return kTransmissionTimeOffsetLength;
1326}
1327
1328uint8_t RTPSender::BuildAudioLevelExtension(uint8_t* data_buffer) const {
1329  // An RTP Header Extension for Client-to-Mixer Audio Level Indication
1330  //
1331  // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
1332  //
1333  // The form of the audio level extension block:
1334  //
1335  //    0                   1
1336  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1337  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1338  //   |  ID   | len=0 |V|   level     |
1339  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1340  //
1341
1342  // Get id defined by user.
1343  uint8_t id;
1344  if (rtp_header_extension_map_.GetId(kRtpExtensionAudioLevel, &id) != 0) {
1345    // Not registered.
1346    return 0;
1347  }
1348  size_t pos = 0;
1349  const uint8_t len = 0;
1350  data_buffer[pos++] = (id << 4) + len;
1351  data_buffer[pos++] = (1 << 7) + 0;     // Voice, 0 dBov.
1352  assert(pos == kAudioLevelLength);
1353  return kAudioLevelLength;
1354}
1355
1356uint8_t RTPSender::BuildAbsoluteSendTimeExtension(uint8_t* data_buffer) const {
1357  // Absolute send time in RTP streams.
1358  //
1359  // The absolute send time is signaled to the receiver in-band using the
1360  // general mechanism for RTP header extensions [RFC5285]. The payload
1361  // of this extension (the transmitted value) is a 24-bit unsigned integer
1362  // containing the sender's current time in seconds as a fixed point number
1363  // with 18 bits fractional part.
1364  //
1365  // The form of the absolute send time extension block:
1366  //
1367  //    0                   1                   2                   3
1368  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1369  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1370  //   |  ID   | len=2 |              absolute send time               |
1371  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1372
1373  // Get id defined by user.
1374  uint8_t id;
1375  if (rtp_header_extension_map_.GetId(kRtpExtensionAbsoluteSendTime,
1376                                      &id) != 0) {
1377    // Not registered.
1378    return 0;
1379  }
1380  size_t pos = 0;
1381  const uint8_t len = 2;
1382  data_buffer[pos++] = (id << 4) + len;
1383  ByteWriter<uint32_t, 3>::WriteBigEndian(data_buffer + pos,
1384                                          absolute_send_time_);
1385  pos += 3;
1386  assert(pos == kAbsoluteSendTimeLength);
1387  return kAbsoluteSendTimeLength;
1388}
1389
1390uint8_t RTPSender::BuildVideoRotationExtension(uint8_t* data_buffer) const {
1391  // Coordination of Video Orientation in RTP streams.
1392  //
1393  // Coordination of Video Orientation consists in signaling of the current
1394  // orientation of the image captured on the sender side to the receiver for
1395  // appropriate rendering and displaying.
1396  //
1397  //    0                   1
1398  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1399  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1400  //   |  ID   | len=0 |0 0 0 0 C F R R|
1401  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1402  //
1403
1404  // Get id defined by user.
1405  uint8_t id;
1406  if (rtp_header_extension_map_.GetId(kRtpExtensionVideoRotation, &id) != 0) {
1407    // Not registered.
1408    return 0;
1409  }
1410  size_t pos = 0;
1411  const uint8_t len = 0;
1412  data_buffer[pos++] = (id << 4) + len;
1413  data_buffer[pos++] = ConvertVideoRotationToCVOByte(rotation_);
1414  assert(pos == kVideoRotationLength);
1415  return kVideoRotationLength;
1416}
1417
1418uint8_t RTPSender::BuildTransportSequenceNumberExtension(
1419    uint8_t* data_buffer,
1420    uint16_t sequence_number) const {
1421  //   0                   1                   2
1422  //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
1423  //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1424  //  |  ID   | L=1   |transport wide sequence number |
1425  //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1426
1427  // Get id defined by user.
1428  uint8_t id;
1429  if (rtp_header_extension_map_.GetId(kRtpExtensionTransportSequenceNumber,
1430                                      &id) != 0) {
1431    // Not registered.
1432    return 0;
1433  }
1434  size_t pos = 0;
1435  const uint8_t len = 1;
1436  data_buffer[pos++] = (id << 4) + len;
1437  ByteWriter<uint16_t>::WriteBigEndian(data_buffer + pos, sequence_number);
1438  pos += 2;
1439  assert(pos == kTransportSequenceNumberLength);
1440  return kTransportSequenceNumberLength;
1441}
1442
1443bool RTPSender::FindHeaderExtensionPosition(RTPExtensionType type,
1444                                            const uint8_t* rtp_packet,
1445                                            size_t rtp_packet_length,
1446                                            const RTPHeader& rtp_header,
1447                                            size_t* position) const {
1448  // Get length until start of header extension block.
1449  int extension_block_pos =
1450      rtp_header_extension_map_.GetLengthUntilBlockStartInBytes(type);
1451  if (extension_block_pos < 0) {
1452    LOG(LS_WARNING) << "Failed to find extension position for " << type
1453                    << " as it is not registered.";
1454    return false;
1455  }
1456
1457  HeaderExtension header_extension(type);
1458
1459  size_t block_pos =
1460      kRtpHeaderLength + rtp_header.numCSRCs + extension_block_pos;
1461  if (rtp_packet_length < block_pos + header_extension.length ||
1462      rtp_header.headerLength < block_pos + header_extension.length) {
1463    LOG(LS_WARNING) << "Failed to find extension position for " << type
1464                    << " as the length is invalid.";
1465    return false;
1466  }
1467
1468  // Verify that header contains extension.
1469  if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) &&
1470        (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) {
1471    LOG(LS_WARNING) << "Failed to find extension position for " << type
1472                    << "as hdr extension not found.";
1473    return false;
1474  }
1475
1476  *position = block_pos;
1477  return true;
1478}
1479
1480RTPSender::ExtensionStatus RTPSender::VerifyExtension(
1481    RTPExtensionType extension_type,
1482    uint8_t* rtp_packet,
1483    size_t rtp_packet_length,
1484    const RTPHeader& rtp_header,
1485    size_t extension_length_bytes,
1486    size_t* extension_offset) const {
1487  // Get id.
1488  uint8_t id = 0;
1489  if (rtp_header_extension_map_.GetId(extension_type, &id) != 0)
1490    return ExtensionStatus::kNotRegistered;
1491
1492  size_t block_pos = 0;
1493  if (!FindHeaderExtensionPosition(extension_type, rtp_packet,
1494                                   rtp_packet_length, rtp_header, &block_pos))
1495    return ExtensionStatus::kError;
1496
1497  // Verify that header contains extension.
1498  if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) &&
1499        (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) {
1500    LOG(LS_WARNING)
1501        << "Failed to update absolute send time, hdr extension not found.";
1502    return ExtensionStatus::kError;
1503  }
1504
1505  // Verify first byte in block.
1506  const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2);
1507  if (rtp_packet[block_pos] != first_block_byte)
1508    return ExtensionStatus::kError;
1509
1510  *extension_offset = block_pos;
1511  return ExtensionStatus::kOk;
1512}
1513
1514void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet,
1515                                             size_t rtp_packet_length,
1516                                             const RTPHeader& rtp_header,
1517                                             int64_t time_diff_ms) const {
1518  size_t offset;
1519  CriticalSectionScoped cs(send_critsect_.get());
1520  switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet,
1521                          rtp_packet_length, rtp_header,
1522                          kTransmissionTimeOffsetLength, &offset)) {
1523    case ExtensionStatus::kNotRegistered:
1524      return;
1525    case ExtensionStatus::kError:
1526      LOG(LS_WARNING) << "Failed to update transmission time offset.";
1527      return;
1528    case ExtensionStatus::kOk:
1529      break;
1530    default:
1531      RTC_NOTREACHED();
1532  }
1533
1534  // Update transmission offset field (converting to a 90 kHz timestamp).
1535  ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1,
1536                                         time_diff_ms * 90);  // RTP timestamp.
1537}
1538
1539bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet,
1540                                 size_t rtp_packet_length,
1541                                 const RTPHeader& rtp_header,
1542                                 bool is_voiced,
1543                                 uint8_t dBov) const {
1544  size_t offset;
1545  CriticalSectionScoped cs(send_critsect_.get());
1546
1547  switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet,
1548                          rtp_packet_length, rtp_header, kAudioLevelLength,
1549                          &offset)) {
1550    case ExtensionStatus::kNotRegistered:
1551      return false;
1552    case ExtensionStatus::kError:
1553      LOG(LS_WARNING) << "Failed to update audio level.";
1554      return false;
1555    case ExtensionStatus::kOk:
1556      break;
1557    default:
1558      RTC_NOTREACHED();
1559  }
1560
1561  rtp_packet[offset + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f);
1562  return true;
1563}
1564
1565bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet,
1566                                    size_t rtp_packet_length,
1567                                    const RTPHeader& rtp_header,
1568                                    VideoRotation rotation) const {
1569  size_t offset;
1570  CriticalSectionScoped cs(send_critsect_.get());
1571
1572  switch (VerifyExtension(kRtpExtensionVideoRotation, rtp_packet,
1573                          rtp_packet_length, rtp_header, kVideoRotationLength,
1574                          &offset)) {
1575    case ExtensionStatus::kNotRegistered:
1576      return false;
1577    case ExtensionStatus::kError:
1578      LOG(LS_WARNING) << "Failed to update CVO.";
1579      return false;
1580    case ExtensionStatus::kOk:
1581      break;
1582    default:
1583      RTC_NOTREACHED();
1584  }
1585
1586  rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation);
1587  return true;
1588}
1589
1590void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet,
1591                                       size_t rtp_packet_length,
1592                                       const RTPHeader& rtp_header,
1593                                       int64_t now_ms) const {
1594  size_t offset;
1595  CriticalSectionScoped cs(send_critsect_.get());
1596
1597  switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet,
1598                          rtp_packet_length, rtp_header,
1599                          kAbsoluteSendTimeLength, &offset)) {
1600    case ExtensionStatus::kNotRegistered:
1601      return;
1602    case ExtensionStatus::kError:
1603      LOG(LS_WARNING) << "Failed to update absolute send time";
1604      return;
1605    case ExtensionStatus::kOk:
1606      break;
1607    default:
1608      RTC_NOTREACHED();
1609  }
1610
1611  // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit
1612  // fractional part).
1613  ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1,
1614                                          ConvertMsTo24Bits(now_ms));
1615}
1616
1617uint16_t RTPSender::UpdateTransportSequenceNumber(
1618    uint8_t* rtp_packet,
1619    size_t rtp_packet_length,
1620    const RTPHeader& rtp_header) const {
1621  size_t offset;
1622  CriticalSectionScoped cs(send_critsect_.get());
1623
1624  switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet,
1625                          rtp_packet_length, rtp_header,
1626                          kTransportSequenceNumberLength, &offset)) {
1627    case ExtensionStatus::kNotRegistered:
1628      return 0;
1629    case ExtensionStatus::kError:
1630      LOG(LS_WARNING) << "Failed to update transport sequence number";
1631      return 0;
1632    case ExtensionStatus::kOk:
1633      break;
1634    default:
1635      RTC_NOTREACHED();
1636  }
1637
1638  uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber();
1639  BuildTransportSequenceNumberExtension(rtp_packet + offset, seq);
1640  return seq;
1641}
1642
1643void RTPSender::SetSendingStatus(bool enabled) {
1644  if (enabled) {
1645    uint32_t frequency_hz = SendPayloadFrequency();
1646    uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz);
1647
1648    // Will be ignored if it's already configured via API.
1649    SetStartTimestamp(RTPtime, false);
1650  } else {
1651    CriticalSectionScoped lock(send_critsect_.get());
1652    if (!ssrc_forced_) {
1653      // Generate a new SSRC.
1654      ssrc_db_.ReturnSSRC(ssrc_);
1655      ssrc_ = ssrc_db_.CreateSSRC();  // Can't be 0.
1656      bitrates_->set_ssrc(ssrc_);
1657    }
1658    // Don't initialize seq number if SSRC passed externally.
1659    if (!sequence_number_forced_ && !ssrc_forced_) {
1660      // Generate a new sequence number.
1661      sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1662    }
1663  }
1664}
1665
1666void RTPSender::SetSendingMediaStatus(bool enabled) {
1667  CriticalSectionScoped cs(send_critsect_.get());
1668  sending_media_ = enabled;
1669}
1670
1671bool RTPSender::SendingMedia() const {
1672  CriticalSectionScoped cs(send_critsect_.get());
1673  return sending_media_;
1674}
1675
1676uint32_t RTPSender::Timestamp() const {
1677  CriticalSectionScoped cs(send_critsect_.get());
1678  return timestamp_;
1679}
1680
1681void RTPSender::SetStartTimestamp(uint32_t timestamp, bool force) {
1682  CriticalSectionScoped cs(send_critsect_.get());
1683  if (force) {
1684    start_timestamp_forced_ = true;
1685    start_timestamp_ = timestamp;
1686  } else {
1687    if (!start_timestamp_forced_) {
1688      start_timestamp_ = timestamp;
1689    }
1690  }
1691}
1692
1693uint32_t RTPSender::StartTimestamp() const {
1694  CriticalSectionScoped cs(send_critsect_.get());
1695  return start_timestamp_;
1696}
1697
1698uint32_t RTPSender::GenerateNewSSRC() {
1699  // If configured via API, return 0.
1700  CriticalSectionScoped cs(send_critsect_.get());
1701
1702  if (ssrc_forced_) {
1703    return 0;
1704  }
1705  ssrc_ = ssrc_db_.CreateSSRC();  // Can't be 0.
1706  bitrates_->set_ssrc(ssrc_);
1707  return ssrc_;
1708}
1709
1710void RTPSender::SetSSRC(uint32_t ssrc) {
1711  // This is configured via the API.
1712  CriticalSectionScoped cs(send_critsect_.get());
1713
1714  if (ssrc_ == ssrc && ssrc_forced_) {
1715    return;  // Since it's same ssrc, don't reset anything.
1716  }
1717  ssrc_forced_ = true;
1718  ssrc_db_.ReturnSSRC(ssrc_);
1719  ssrc_db_.RegisterSSRC(ssrc);
1720  ssrc_ = ssrc;
1721  bitrates_->set_ssrc(ssrc_);
1722  if (!sequence_number_forced_) {
1723    sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1724  }
1725}
1726
1727uint32_t RTPSender::SSRC() const {
1728  CriticalSectionScoped cs(send_critsect_.get());
1729  return ssrc_;
1730}
1731
1732void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
1733  assert(csrcs.size() <= kRtpCsrcSize);
1734  CriticalSectionScoped cs(send_critsect_.get());
1735  csrcs_ = csrcs;
1736}
1737
1738void RTPSender::SetSequenceNumber(uint16_t seq) {
1739  CriticalSectionScoped cs(send_critsect_.get());
1740  sequence_number_forced_ = true;
1741  sequence_number_ = seq;
1742}
1743
1744uint16_t RTPSender::SequenceNumber() const {
1745  CriticalSectionScoped cs(send_critsect_.get());
1746  return sequence_number_;
1747}
1748
1749// Audio.
1750int32_t RTPSender::SendTelephoneEvent(uint8_t key,
1751                                      uint16_t time_ms,
1752                                      uint8_t level) {
1753  if (!audio_configured_) {
1754    return -1;
1755  }
1756  return audio_->SendTelephoneEvent(key, time_ms, level);
1757}
1758
1759int32_t RTPSender::SetAudioPacketSize(uint16_t packet_size_samples) {
1760  if (!audio_configured_) {
1761    return -1;
1762  }
1763  return audio_->SetAudioPacketSize(packet_size_samples);
1764}
1765
1766int32_t RTPSender::SetAudioLevel(uint8_t level_d_bov) {
1767  return audio_->SetAudioLevel(level_d_bov);
1768}
1769
1770int32_t RTPSender::SetRED(int8_t payload_type) {
1771  if (!audio_configured_) {
1772    return -1;
1773  }
1774  return audio_->SetRED(payload_type);
1775}
1776
1777int32_t RTPSender::RED(int8_t *payload_type) const {
1778  if (!audio_configured_) {
1779    return -1;
1780  }
1781  return audio_->RED(payload_type);
1782}
1783
1784RtpVideoCodecTypes RTPSender::VideoCodecType() const {
1785  assert(!audio_configured_ && "Sender is an audio stream!");
1786  return video_->VideoCodecType();
1787}
1788
1789uint32_t RTPSender::MaxConfiguredBitrateVideo() const {
1790  if (audio_configured_) {
1791    return 0;
1792  }
1793  return video_->MaxConfiguredBitrateVideo();
1794}
1795
1796void RTPSender::SetGenericFECStatus(bool enable,
1797                                    uint8_t payload_type_red,
1798                                    uint8_t payload_type_fec) {
1799  RTC_DCHECK(!audio_configured_);
1800  video_->SetGenericFECStatus(enable, payload_type_red, payload_type_fec);
1801}
1802
1803void RTPSender::GenericFECStatus(bool* enable,
1804                                    uint8_t* payload_type_red,
1805                                    uint8_t* payload_type_fec) const {
1806  RTC_DCHECK(!audio_configured_);
1807  video_->GenericFECStatus(enable, payload_type_red, payload_type_fec);
1808}
1809
1810int32_t RTPSender::SetFecParameters(
1811    const FecProtectionParams *delta_params,
1812    const FecProtectionParams *key_params) {
1813  if (audio_configured_) {
1814    return -1;
1815  }
1816  video_->SetFecParameters(delta_params, key_params);
1817  return 0;
1818}
1819
1820void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length,
1821                               uint8_t* buffer_rtx) {
1822  CriticalSectionScoped cs(send_critsect_.get());
1823  uint8_t* data_buffer_rtx = buffer_rtx;
1824  // Add RTX header.
1825  RtpUtility::RtpHeaderParser rtp_parser(
1826      reinterpret_cast<const uint8_t*>(buffer), *length);
1827
1828  RTPHeader rtp_header;
1829  rtp_parser.Parse(&rtp_header);
1830
1831  // Add original RTP header.
1832  memcpy(data_buffer_rtx, buffer, rtp_header.headerLength);
1833
1834  // Replace payload type, if a specific type is set for RTX.
1835  if (rtx_payload_type_ != -1) {
1836    data_buffer_rtx[1] = static_cast<uint8_t>(rtx_payload_type_);
1837    if (rtp_header.markerBit)
1838      data_buffer_rtx[1] |= kRtpMarkerBitMask;
1839  }
1840
1841  // Replace sequence number.
1842  uint8_t* ptr = data_buffer_rtx + 2;
1843  ByteWriter<uint16_t>::WriteBigEndian(ptr, sequence_number_rtx_++);
1844
1845  // Replace SSRC.
1846  ptr += 6;
1847  ByteWriter<uint32_t>::WriteBigEndian(ptr, ssrc_rtx_);
1848
1849  // Add OSN (original sequence number).
1850  ptr = data_buffer_rtx + rtp_header.headerLength;
1851  ByteWriter<uint16_t>::WriteBigEndian(ptr, rtp_header.sequenceNumber);
1852  ptr += 2;
1853
1854  // Add original payload data.
1855  memcpy(ptr, buffer + rtp_header.headerLength,
1856         *length - rtp_header.headerLength);
1857  *length += 2;
1858}
1859
1860void RTPSender::RegisterRtpStatisticsCallback(
1861    StreamDataCountersCallback* callback) {
1862  CriticalSectionScoped cs(statistics_crit_.get());
1863  rtp_stats_callback_ = callback;
1864}
1865
1866StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const {
1867  CriticalSectionScoped cs(statistics_crit_.get());
1868  return rtp_stats_callback_;
1869}
1870
1871uint32_t RTPSender::BitrateSent() const {
1872  return total_bitrate_sent_.BitrateLast();
1873}
1874
1875void RTPSender::SetRtpState(const RtpState& rtp_state) {
1876  SetStartTimestamp(rtp_state.start_timestamp, true);
1877  CriticalSectionScoped lock(send_critsect_.get());
1878  sequence_number_ = rtp_state.sequence_number;
1879  sequence_number_forced_ = true;
1880  timestamp_ = rtp_state.timestamp;
1881  capture_time_ms_ = rtp_state.capture_time_ms;
1882  last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms;
1883  media_has_been_sent_ = rtp_state.media_has_been_sent;
1884}
1885
1886RtpState RTPSender::GetRtpState() const {
1887  CriticalSectionScoped lock(send_critsect_.get());
1888
1889  RtpState state;
1890  state.sequence_number = sequence_number_;
1891  state.start_timestamp = start_timestamp_;
1892  state.timestamp = timestamp_;
1893  state.capture_time_ms = capture_time_ms_;
1894  state.last_timestamp_time_ms = last_timestamp_time_ms_;
1895  state.media_has_been_sent = media_has_been_sent_;
1896
1897  return state;
1898}
1899
1900void RTPSender::SetRtxRtpState(const RtpState& rtp_state) {
1901  CriticalSectionScoped lock(send_critsect_.get());
1902  sequence_number_rtx_ = rtp_state.sequence_number;
1903}
1904
1905RtpState RTPSender::GetRtxRtpState() const {
1906  CriticalSectionScoped lock(send_critsect_.get());
1907
1908  RtpState state;
1909  state.sequence_number = sequence_number_rtx_;
1910  state.start_timestamp = start_timestamp_;
1911
1912  return state;
1913}
1914
1915}  // namespace webrtc
1916