Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 1945773002: RtpPacketHistory rewritten to use RtpPacket class. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
12 12
13 #include <stdlib.h> // srand
14 #include <algorithm> 13 #include <algorithm>
15 #include <utility> 14 #include <utility>
16 15
17 #include "webrtc/base/checks.h" 16 #include "webrtc/base/checks.h"
18 #include "webrtc/base/logging.h" 17 #include "webrtc/base/logging.h"
19 #include "webrtc/base/trace_event.h" 18 #include "webrtc/base/trace_event.h"
20 #include "webrtc/call.h" 19 #include "webrtc/call.h"
21 #include "webrtc/call/rtc_event_log.h" 20 #include "webrtc/call/rtc_event_log.h"
22 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" 21 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 22 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h"
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
26 #include "webrtc/modules/rtp_rtcp/source/time_util.h" 27 #include "webrtc/modules/rtp_rtcp/source/time_util.h"
27 #include "webrtc/system_wrappers/include/tick_util.h" 28 #include "webrtc/system_wrappers/include/tick_util.h"
28 29
29 namespace webrtc { 30 namespace webrtc {
30 31
32 namespace {
31 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. 33 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
32 static const size_t kMaxPaddingLength = 224; 34 constexpr size_t kMaxPaddingLength = 224;
33 static const int kSendSideDelayWindowMs = 1000; 35 constexpr int kSendSideDelayWindowMs = 1000;
34 static const uint32_t kAbsSendTimeFraction = 18; 36 constexpr size_t kRtpHeaderLength = 12;
35 37 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1.
36 namespace { 38 constexpr uint32_t kTimestampTicksPerMs = 90;
37
38 const size_t kRtpHeaderLength = 12;
39 const uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1.
40 39
41 const char* FrameTypeToString(FrameType frame_type) { 40 const char* FrameTypeToString(FrameType frame_type) {
42 switch (frame_type) { 41 switch (frame_type) {
43 case kEmptyFrame: 42 case kEmptyFrame:
44 return "empty"; 43 return "empty";
45 case kAudioFrameSpeech: return "audio_speech"; 44 case kAudioFrameSpeech: return "audio_speech";
46 case kAudioFrameCN: return "audio_cn"; 45 case kAudioFrameCN: return "audio_cn";
47 case kVideoFrameKey: return "video_key"; 46 case kVideoFrameKey: return "video_key";
48 case kVideoFrameDelta: return "video_delta"; 47 case kVideoFrameDelta: return "video_delta";
49 } 48 }
50 return ""; 49 return "";
51 } 50 }
52 51
53 // TODO(holmer): Merge this with the implementation in 52 void CountPacket(RtpPacketCounter* counter, const RtpPacketToSend& packet) {
54 // remote_bitrate_estimator_abs_send_time.cc. 53 ++counter->packets;
55 uint32_t ConvertMsTo24Bits(int64_t time_ms) { 54 counter->header_bytes += packet.headers_size();
56 uint32_t time_24_bits = 55 counter->padding_bytes += packet.padding_size();
57 static_cast<uint32_t>( 56 counter->payload_bytes += packet.payload_size();
58 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) /
59 1000) &
60 0x00FFFFFF;
61 return time_24_bits;
62 } 57 }
58
63 } // namespace 59 } // namespace
64 60
65 RTPSender::BitrateAggregator::BitrateAggregator( 61 RTPSender::BitrateAggregator::BitrateAggregator(
66 BitrateStatisticsObserver* bitrate_callback) 62 BitrateStatisticsObserver* bitrate_callback)
67 : callback_(bitrate_callback), 63 : callback_(bitrate_callback),
68 total_bitrate_observer_(*this), 64 total_bitrate_observer_(*this),
69 retransmit_bitrate_observer_(*this), 65 retransmit_bitrate_observer_(*this),
70 ssrc_(0) {} 66 ssrc_(0) {}
71 67
72 void RTPSender::BitrateAggregator::OnStatsUpdated() const { 68 void RTPSender::BitrateAggregator::OnStatsUpdated() const {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 timestamp_(0), 158 timestamp_(0),
163 capture_time_ms_(0), 159 capture_time_ms_(0),
164 last_timestamp_time_ms_(0), 160 last_timestamp_time_ms_(0),
165 media_has_been_sent_(false), 161 media_has_been_sent_(false),
166 last_packet_marker_bit_(false), 162 last_packet_marker_bit_(false),
167 csrcs_(), 163 csrcs_(),
168 rtx_(kRtxOff), 164 rtx_(kRtxOff),
169 target_bitrate_(0) { 165 target_bitrate_(0) {
170 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); 166 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_));
171 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); 167 memset(nack_byte_count_, 0, sizeof(nack_byte_count_));
172 // We need to seed the random generator for BuildPaddingPacket() below.
173 // TODO(holmer,tommi): Note that TimeInMilliseconds might return 0 on Mac
174 // early on in the process.
175 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds()));
176 ssrc_ = ssrc_db_->CreateSSRC(); 168 ssrc_ = ssrc_db_->CreateSSRC();
177 RTC_DCHECK(ssrc_ != 0); 169 RTC_DCHECK(ssrc_ != 0);
178 ssrc_rtx_ = ssrc_db_->CreateSSRC(); 170 ssrc_rtx_ = ssrc_db_->CreateSSRC();
179 RTC_DCHECK(ssrc_rtx_ != 0); 171 RTC_DCHECK(ssrc_rtx_ != 0);
180 172
181 bitrates_.set_ssrc(ssrc_); 173 bitrates_.set_ssrc(ssrc_);
182 // Random start, 16 bits. Can't be 0. 174 // Random start, 16 bits. Can't be 0.
183 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 175 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
184 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 176 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
185 } 177 }
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 int rtx; 377 int rtx;
386 { 378 {
387 rtc::CritScope lock(&send_critsect_); 379 rtc::CritScope lock(&send_critsect_);
388 rtx = rtx_; 380 rtx = rtx_;
389 } 381 }
390 if (audio_configured_) { 382 if (audio_configured_) {
391 return max_payload_length_ - RTPHeaderLength(); 383 return max_payload_length_ - RTPHeaderLength();
392 } else { 384 } else {
393 return max_payload_length_ - RTPHeaderLength() // RTP overhead. 385 return max_payload_length_ - RTPHeaderLength() // RTP overhead.
394 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. 386 - video_->FECPacketOverhead() // FEC/ULP/RED overhead.
395 - ((rtx) ? 2 : 0); // RTX overhead. 387 - (rtx ? kRtxHeaderSize : 0); // RTX overhead.
396 } 388 }
397 } 389 }
398 390
399 size_t RTPSender::MaxPayloadLength() const { 391 size_t RTPSender::MaxPayloadLength() const {
400 return max_payload_length_; 392 return max_payload_length_;
401 } 393 }
402 394
403 void RTPSender::SetRtxStatus(int mode) { 395 void RTPSender::SetRtxStatus(int mode) {
404 rtc::CritScope lock(&send_critsect_); 396 rtc::CritScope lock(&send_critsect_);
405 rtx_ = mode; 397 rtx_ = mode;
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 539
548 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { 540 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) {
549 { 541 {
550 rtc::CritScope lock(&send_critsect_); 542 rtc::CritScope lock(&send_critsect_);
551 if (!sending_media_) 543 if (!sending_media_)
552 return 0; 544 return 0;
553 if ((rtx_ & kRtxRedundantPayloads) == 0) 545 if ((rtx_ & kRtxRedundantPayloads) == 0)
554 return 0; 546 return 0;
555 } 547 }
556 548
557 uint8_t buffer[IP_PACKET_SIZE];
558 int bytes_left = static_cast<int>(bytes_to_send); 549 int bytes_left = static_cast<int>(bytes_to_send);
559 while (bytes_left > 0) { 550 while (bytes_left > 0) {
560 size_t length = bytes_left; 551 std::unique_ptr<RtpPacketToSend> packet =
561 int64_t capture_time_ms; 552 packet_history_.GetBestFittingPacket(bytes_left);
562 if (!packet_history_.GetBestFittingPacket(buffer, &length, 553 if (!packet) {
stefan-webrtc 2016/05/09 11:49:23 Remove {}
danilchap 2016/05/09 13:45:22 Done. What is rule of thumb for not having {}?
stefan-webrtc 2016/05/12 12:22:34 I usually go by "if statement <=2 lines, no {}, ot
563 &capture_time_ms)) {
564 break; 554 break;
565 } 555 }
566 if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false)) 556 size_t payload_size = packet->payload_size();
557 if (!PrepareAndSendPacket(std::move(packet), true, false)) {
stefan-webrtc 2016/05/09 11:49:23 Remove {}
danilchap 2016/05/09 13:45:22 Done.
567 break; 558 break;
568 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 559 }
569 RTPHeader rtp_header; 560 bytes_left -= payload_size;
570 rtp_parser.Parse(&rtp_header);
stefan-webrtc 2016/05/09 11:49:23 Woho!
571 bytes_left -= static_cast<int>(length - rtp_header.headerLength);
572 } 561 }
573 return bytes_to_send - bytes_left; 562 return bytes_to_send - bytes_left;
574 } 563 }
575 564
576 void RTPSender::BuildPaddingPacket(uint8_t* packet,
577 size_t header_length,
578 size_t padding_length) {
579 packet[0] |= 0x20; // Set padding bit.
580 int32_t* data = reinterpret_cast<int32_t*>(&(packet[header_length]));
581
582 // Fill data buffer with random data.
583 for (size_t j = 0; j < (padding_length >> 2); ++j) {
584 data[j] = rand(); // NOLINT
585 }
586 // Set number of padding bytes in the last byte of the packet.
587 packet[header_length + padding_length - 1] =
588 static_cast<uint8_t>(padding_length);
589 }
590
591 size_t RTPSender::SendPadData(size_t bytes, 565 size_t RTPSender::SendPadData(size_t bytes,
592 bool timestamp_provided, 566 bool timestamp_provided,
593 uint32_t timestamp, 567 uint32_t timestamp,
594 int64_t capture_time_ms) { 568 int64_t capture_time_ms) {
595 // Always send full padding packets. This is accounted for by the 569 // Always send full padding packets. This is accounted for by the
596 // RtpPacketSender, 570 // RtpPacketSender,
597 // which will make sure we don't send too much padding even if a single packet 571 // which will make sure we don't send too much padding even if a single packet
598 // is larger than requested. 572 // is larger than requested.
599 size_t padding_bytes_in_packet = 573 size_t padding_bytes_in_packet =
600 std::min(MaxDataPayloadLength(), kMaxPaddingLength); 574 std::min(MaxDataPayloadLength(), kMaxPaddingLength);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_); 621 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_);
648 } 622 }
649 ssrc = ssrc_rtx_; 623 ssrc = ssrc_rtx_;
650 sequence_number = sequence_number_rtx_; 624 sequence_number = sequence_number_rtx_;
651 ++sequence_number_rtx_; 625 ++sequence_number_rtx_;
652 payload_type = rtx_payload_type_map_.begin()->second; 626 payload_type = rtx_payload_type_map_.begin()->second;
653 over_rtx = true; 627 over_rtx = true;
654 } 628 }
655 } 629 }
656 630
657 uint8_t padding_packet[IP_PACKET_SIZE]; 631 RtpPacketToSend padding_packet(&rtp_header_extension_map_, IP_PACKET_SIZE);
658 size_t header_length = 632 padding_packet.SetPayloadType(payload_type);
659 CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp, 633 padding_packet.SetMarker(false);
660 sequence_number, std::vector<uint32_t>()); 634 padding_packet.SetSequenceNumber(sequence_number);
661 BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet); 635 padding_packet.SetTimestamp(timestamp);
662 size_t length = padding_bytes_in_packet + header_length; 636 padding_packet.SetSsrc(ssrc);
637
663 int64_t now_ms = clock_->TimeInMilliseconds(); 638 int64_t now_ms = clock_->TimeInMilliseconds();
664 639
665 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); 640 if (capture_time_ms > 0) {
666 RTPHeader rtp_header; 641 padding_packet.SetExtension<TransmissionOffset>(
667 rtp_parser.Parse(&rtp_header); 642 kTimestampTicksPerMs * (now_ms - capture_time_ms));
643 }
644 padding_packet.SetExtension<AbsoluteSendTime>(now_ms);
668 645
669 if (capture_time_ms > 0) { 646 PacketOptions options;
670 UpdateTransmissionTimeOffset( 647 bool has_transport_seq_no =
671 padding_packet, length, rtp_header, now_ms - capture_time_ms); 648 AllocateTransportSequenceNumber(&options.packet_id) &&
649 padding_packet.SetExtension<TransportSequenceNumber>(options.packet_id);
650
651 padding_packet.SetPadding(padding_bytes_in_packet, &random_);
652
653 if (has_transport_seq_no && transport_feedback_observer_) {
654 transport_feedback_observer_->AddPacket(options.packet_id,
655 padding_packet.size(), true);
672 } 656 }
673 657
674 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); 658 if (!SendPacketToNetwork(padding_packet, options))
675
676 PacketOptions options;
677 if (AllocateTransportSequenceNumber(&options.packet_id)) {
678 if (UpdateTransportSequenceNumber(options.packet_id, padding_packet,
679 length, rtp_header)) {
680 if (transport_feedback_observer_)
681 transport_feedback_observer_->AddPacket(options.packet_id, length,
682 true);
683 }
684 }
685
686 if (!SendPacketToNetwork(padding_packet, length, options))
687 break; 659 break;
688 660
689 bytes_sent += padding_bytes_in_packet; 661 bytes_sent += padding_bytes_in_packet;
690 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); 662 UpdateRtpStats(padding_packet, over_rtx, false);
691 } 663 }
692 664
693 return bytes_sent; 665 return bytes_sent;
694 } 666 }
695 667
696 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { 668 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) {
697 packet_history_.SetStorePacketsStatus(enable, number_to_store); 669 packet_history_.SetStorePacketsStatus(enable, number_to_store);
698 } 670 }
699 671
700 bool RTPSender::StorePackets() const { 672 bool RTPSender::StorePackets() const {
701 return packet_history_.StorePackets(); 673 return packet_history_.StorePackets();
702 } 674 }
703 675
704 int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) { 676 int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) {
705 size_t length = IP_PACKET_SIZE; 677 std::unique_ptr<RtpPacketToSend> packet =
706 uint8_t data_buffer[IP_PACKET_SIZE]; 678 packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true);
707 int64_t capture_time_ms; 679 if (!packet) {
708
709 if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true,
710 data_buffer, &length,
711 &capture_time_ms)) {
712 // Packet not found. 680 // Packet not found.
713 return 0; 681 return 0;
714 } 682 }
715 683
716 if (paced_sender_) { 684 if (paced_sender_) {
717 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length);
718 RTPHeader header;
719 if (!rtp_parser.Parse(&header)) {
720 assert(false);
721 return -1;
722 }
723 // Convert from TickTime to Clock since capture_time_ms is based on 685 // Convert from TickTime to Clock since capture_time_ms is based on
724 // TickTime. 686 // TickTime.
725 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; 687 int64_t corrected_capture_tims_ms =
726 paced_sender_->InsertPacket( 688 packet->capture_time_ms() + clock_delta_ms_;
727 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, 689 paced_sender_->InsertPacket(RtpPacketSender::kNormalPriority,
728 corrected_capture_tims_ms, length - header.headerLength, true); 690 packet->Ssrc(), packet->SequenceNumber(),
691 corrected_capture_tims_ms,
692 packet->payload_size(), true);
729 693
730 return length; 694 return packet->size();
731 } 695 }
732 int rtx = kRtxOff; 696 int rtx = kRtxOff;
733 { 697 {
734 rtc::CritScope lock(&send_critsect_); 698 rtc::CritScope lock(&send_critsect_);
735 rtx = rtx_; 699 rtx = rtx_;
736 } 700 }
737 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, 701 int32_t packet_size = static_cast<int32_t>(packet->size());
738 (rtx & kRtxRetransmitted) > 0, true)) { 702 if (!PrepareAndSendPacket(std::move(packet), (rtx & kRtxRetransmitted) > 0,
703 true)) {
739 return -1; 704 return -1;
740 } 705 }
741 return static_cast<int32_t>(length); 706 return packet_size;
742 } 707 }
743 708
744 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, 709 bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet,
745 size_t size,
746 const PacketOptions& options) { 710 const PacketOptions& options) {
747 int bytes_sent = -1; 711 int bytes_sent = -1;
748 if (transport_) { 712 if (transport_) {
749 bytes_sent = transport_->SendRtp(packet, size, options) 713 bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options)
750 ? static_cast<int>(size) 714 ? static_cast<int>(packet.size())
751 : -1; 715 : -1;
752 if (event_log_ && bytes_sent > 0) { 716 if (event_log_ && bytes_sent > 0) {
753 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet, size); 717 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(),
718 packet.size());
754 } 719 }
755 } 720 }
756 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 721 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
757 "RTPSender::SendPacketToNetwork", "size", size, "sent", 722 "RTPSender::SendPacketToNetwork", "size", packet.size(),
758 bytes_sent); 723 "sent", bytes_sent);
759 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. 724 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.
760 if (bytes_sent <= 0) { 725 if (bytes_sent <= 0) {
761 LOG(LS_WARNING) << "Transport failed to send packet"; 726 LOG(LS_WARNING) << "Transport failed to send packet";
762 return false; 727 return false;
763 } 728 }
764 return true; 729 return true;
765 } 730 }
766 731
767 int RTPSender::SelectiveRetransmissions() const { 732 int RTPSender::SelectiveRetransmissions() const {
768 if (!video_) 733 if (!video_)
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; 830 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i];
866 } 831 }
867 nack_byte_count_[0] = bytes; 832 nack_byte_count_[0] = bytes;
868 nack_byte_count_times_[0] = now; 833 nack_byte_count_times_[0] = now;
869 } 834 }
870 835
871 // Called from pacer when we can send the packet. 836 // Called from pacer when we can send the packet.
872 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, 837 bool RTPSender::TimeToSendPacket(uint16_t sequence_number,
873 int64_t capture_time_ms, 838 int64_t capture_time_ms,
874 bool retransmission) { 839 bool retransmission) {
875 size_t length = IP_PACKET_SIZE; 840 std::unique_ptr<RtpPacketToSend> packet =
876 uint8_t data_buffer[IP_PACKET_SIZE]; 841 packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
877 int64_t stored_time_ms; 842 retransmission);
878 843 if (!packet) {
879 if (!packet_history_.GetPacketAndSetSendTime(sequence_number,
880 0,
881 retransmission,
882 data_buffer,
883 &length,
884 &stored_time_ms)) {
885 // Packet cannot be found. Allow sending to continue. 844 // Packet cannot be found. Allow sending to continue.
886 return true; 845 return true;
887 } 846 }
888 847
889 int rtx; 848 int rtx;
890 { 849 {
891 rtc::CritScope lock(&send_critsect_); 850 rtc::CritScope lock(&send_critsect_);
892 rtx = rtx_; 851 rtx = rtx_;
893 } 852 }
894 return PrepareAndSendPacket(data_buffer, 853 return PrepareAndSendPacket(std::move(packet),
895 length,
896 capture_time_ms,
897 retransmission && (rtx & kRtxRetransmitted) > 0, 854 retransmission && (rtx & kRtxRetransmitted) > 0,
898 retransmission); 855 retransmission);
899 } 856 }
900 857
901 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, 858 bool RTPSender::PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
902 size_t length,
903 int64_t capture_time_ms,
904 bool send_over_rtx, 859 bool send_over_rtx,
905 bool is_retransmit) { 860 bool is_retransmit) {
906 uint8_t* buffer_to_send_ptr = buffer; 861 RTC_DCHECK(packet);
862 int64_t capture_time_ms = packet->capture_time_ms();
863 RtpPacketToSend* packet_to_send = packet.get();
907 864
908 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 865 if (!is_retransmit && packet->Marker()) {
909 RTPHeader rtp_header;
910 rtp_parser.Parse(&rtp_header);
911 if (!is_retransmit && rtp_header.markerBit) {
912 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend", 866 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend",
913 capture_time_ms); 867 capture_time_ms);
914 } 868 }
915 869
916 TRACE_EVENT_INSTANT2( 870 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
917 TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PrepareAndSendPacket", 871 "PrepareAndSendPacket", "timestamp", packet->Timestamp(),
918 "timestamp", rtp_header.timestamp, "seqnum", rtp_header.sequenceNumber); 872 "seqnum", packet->SequenceNumber());
919 873
920 uint8_t data_buffer_rtx[IP_PACKET_SIZE]; 874 std::unique_ptr<RtpPacketToSend> packet_rtx;
921 if (send_over_rtx) { 875 if (send_over_rtx) {
922 BuildRtxPacket(buffer, &length, data_buffer_rtx); 876 packet_rtx = BuildRtxPacket(*packet);
923 buffer_to_send_ptr = data_buffer_rtx; 877 RTC_DCHECK(packet_rtx);
878 packet_to_send = packet_rtx.get();
924 } 879 }
925 880
926 int64_t now_ms = clock_->TimeInMilliseconds(); 881 int64_t now_ms = clock_->TimeInMilliseconds();
927 int64_t diff_ms = now_ms - capture_time_ms; 882 int64_t diff_ms = now_ms - capture_time_ms;
928 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, 883 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs *
929 diff_ms); 884 diff_ms);
930 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); 885 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms);
931 886
932 PacketOptions options; 887 PacketOptions options;
933 if (AllocateTransportSequenceNumber(&options.packet_id)) { 888 if (AllocateTransportSequenceNumber(&options.packet_id)) {
934 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr, 889 if (packet_to_send->SetExtension<TransportSequenceNumber>(
935 length, rtp_header)) { 890 options.packet_id)) {
936 if (transport_feedback_observer_) 891 if (transport_feedback_observer_)
937 transport_feedback_observer_->AddPacket(options.packet_id, length, 892 transport_feedback_observer_->AddPacket(options.packet_id,
938 true); 893 packet_to_send->size(), true);
939 } 894 }
940 } 895 }
941 896
942 if (!is_retransmit && !send_over_rtx) { 897 if (!is_retransmit && !send_over_rtx) {
943 UpdateDelayStatistics(capture_time_ms, now_ms); 898 UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
944 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 899 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
900 packet->Ssrc());
945 } 901 }
946 902
947 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 903 if (!SendPacketToNetwork(*packet_to_send, options)) {
stefan-webrtc 2016/05/09 11:49:23 Remove {}
948 if (ret) { 904 return false;
905 }
906 {
949 rtc::CritScope lock(&send_critsect_); 907 rtc::CritScope lock(&send_critsect_);
950 media_has_been_sent_ = true; 908 media_has_been_sent_ = true;
951 } 909 }
952 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, 910 UpdateRtpStats(*packet_to_send, send_over_rtx, is_retransmit);
953 is_retransmit); 911 return true;
954 return ret;
955 } 912 }
956 913
957 void RTPSender::UpdateRtpStats(const uint8_t* buffer, 914 void RTPSender::UpdateRtpStats(const RtpPacketToSend& packet,
958 size_t packet_length,
959 const RTPHeader& header,
960 bool is_rtx, 915 bool is_rtx,
961 bool is_retransmit) { 916 bool is_retransmit) {
962 StreamDataCounters* counters; 917 StreamDataCounters* counters;
963 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. 918 // Get ssrc before taking statistics_crit_ to avoid possible deadlock.
964 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); 919 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC();
965 920
966 rtc::CritScope lock(&statistics_crit_); 921 rtc::CritScope lock(&statistics_crit_);
967 if (is_rtx) { 922 if (is_rtx) {
968 counters = &rtx_rtp_stats_; 923 counters = &rtx_rtp_stats_;
969 } else { 924 } else {
970 counters = &rtp_stats_; 925 counters = &rtp_stats_;
971 } 926 }
972 927
973 total_bitrate_sent_.Update(packet_length); 928 total_bitrate_sent_.Update(packet.size());
974 929
975 if (counters->first_packet_time_ms == -1) { 930 if (counters->first_packet_time_ms == -1) {
976 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); 931 counters->first_packet_time_ms = clock_->TimeInMilliseconds();
977 } 932 }
978 if (IsFecPacket(buffer, header)) { 933 if (IsFecPacket(packet)) {
979 counters->fec.AddPacket(packet_length, header); 934 CountPacket(&counters->fec, packet);
980 } 935 }
981 if (is_retransmit) { 936 if (is_retransmit) {
982 counters->retransmitted.AddPacket(packet_length, header); 937 CountPacket(&counters->retransmitted, packet);
983 } 938 }
984 counters->transmitted.AddPacket(packet_length, header); 939 CountPacket(&counters->transmitted, packet);
985 940
986 if (rtp_stats_callback_) { 941 if (rtp_stats_callback_) {
987 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); 942 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc);
988 } 943 }
989 } 944 }
990 945
991 bool RTPSender::IsFecPacket(const uint8_t* buffer, 946 bool RTPSender::IsFecPacket(const RtpPacketToSend& packet) const {
992 const RTPHeader& header) const {
993 if (!video_) { 947 if (!video_) {
994 return false; 948 return false;
995 } 949 }
996 bool fec_enabled; 950 bool fec_enabled;
997 uint8_t pt_red; 951 uint8_t pt_red;
998 uint8_t pt_fec; 952 uint8_t pt_fec;
999 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); 953 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec);
1000 return fec_enabled && 954 return fec_enabled && packet.PayloadType() == pt_red &&
1001 header.payloadType == pt_red && 955 packet.payload()[0] == pt_fec;
1002 buffer[header.headerLength] == pt_fec;
1003 } 956 }
1004 957
1005 size_t RTPSender::TimeToSendPadding(size_t bytes) { 958 size_t RTPSender::TimeToSendPadding(size_t bytes) {
1006 if (audio_configured_ || bytes == 0) 959 if (audio_configured_ || bytes == 0)
1007 return 0; 960 return 0;
1008 size_t bytes_sent = TrySendRedundantPayloads(bytes); 961 size_t bytes_sent = TrySendRedundantPayloads(bytes);
1009 if (bytes_sent < bytes) 962 if (bytes_sent < bytes)
1010 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); 963 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0);
1011 return bytes_sent; 964 return bytes_sent;
1012 } 965 }
1013 966
1014 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again.
1015 int32_t RTPSender::SendToNetwork(uint8_t* buffer, 967 int32_t RTPSender::SendToNetwork(uint8_t* buffer,
1016 size_t payload_length, 968 size_t payload_length,
1017 size_t rtp_header_length, 969 size_t rtp_header_length,
1018 int64_t capture_time_ms, 970 int64_t capture_time_ms,
1019 StorageType storage, 971 StorageType storage,
1020 RtpPacketSender::Priority priority) { 972 RtpPacketSender::Priority priority) {
1021 size_t length = payload_length + rtp_header_length; 973 size_t length = payload_length + rtp_header_length;
1022 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 974 std::unique_ptr<RtpPacketToSend> packet(
975 new RtpPacketToSend(&rtp_header_extension_map_, length));
976 RTC_CHECK(packet->Parse(buffer, length));
977 packet->set_capture_time_ms(capture_time_ms);
978 return SendToNetwork(std::move(packet), storage, priority) ? 0 : -1;
danilchap 2016/05/09 10:24:57 Here payload_length is ignored and packet->payload
979 }
1023 980
1024 RTPHeader rtp_header; 981 bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
1025 rtp_parser.Parse(&rtp_header); 982 StorageType storage,
1026 983 RtpPacketSender::Priority priority) {
984 RTC_DCHECK(packet);
1027 int64_t now_ms = clock_->TimeInMilliseconds(); 985 int64_t now_ms = clock_->TimeInMilliseconds();
1028 986
1029 // |capture_time_ms| <= 0 is considered invalid. 987 // |capture_time_ms| <= 0 is considered invalid.
1030 // TODO(holmer): This should be changed all over Video Engine so that negative 988 // TODO(holmer): This should be changed all over Video Engine so that negative
1031 // time is consider invalid, while 0 is considered a valid time. 989 // time is consider invalid, while 0 is considered a valid time.
1032 if (capture_time_ms > 0) { 990 if (packet->capture_time_ms() > 0) {
1033 UpdateTransmissionTimeOffset(buffer, length, rtp_header, 991 packet->SetExtension<TransmissionOffset>(
1034 now_ms - capture_time_ms); 992 kTimestampTicksPerMs * (now_ms - packet->capture_time_ms()));
1035 } 993 }
1036 994 packet->SetExtension<AbsoluteSendTime>(now_ms);
1037 UpdateAbsoluteSendTime(buffer, length, rtp_header, now_ms);
1038
1039 // Used for NACK and to spread out the transmission of packets.
1040 if (packet_history_.PutRTPPacket(buffer, length, capture_time_ms, storage) !=
1041 0) {
1042 return -1;
1043 }
1044 995
1045 if (paced_sender_) { 996 if (paced_sender_) {
997 uint16_t seq_no = packet->SequenceNumber();
998 uint32_t ssrc = packet->Ssrc();
1046 // Correct offset between implementations of millisecond time stamps in 999 // Correct offset between implementations of millisecond time stamps in
1047 // TickTime and Clock. 1000 // TickTime and Clock.
1048 int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_; 1001 int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_;
1049 paced_sender_->InsertPacket(priority, rtp_header.ssrc, 1002 size_t payload_length = packet->payload_size();
1050 rtp_header.sequenceNumber, corrected_time_ms, 1003 packet_history_.PutRtpPacket(std::move(packet), storage, false);
1004
1005 paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms,
1051 payload_length, false); 1006 payload_length, false);
danilchap 2016/05/09 10:24:57 This is the only place in this function that cares
1052 if (last_capture_time_ms_sent_ == 0 || 1007 if (last_capture_time_ms_sent_ == 0 ||
1053 corrected_time_ms > last_capture_time_ms_sent_) { 1008 corrected_time_ms > last_capture_time_ms_sent_) {
1054 last_capture_time_ms_sent_ = corrected_time_ms; 1009 last_capture_time_ms_sent_ = corrected_time_ms;
1055 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 1010 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
1056 "PacedSend", corrected_time_ms, 1011 "PacedSend", corrected_time_ms,
1057 "capture_time_ms", corrected_time_ms); 1012 "capture_time_ms", corrected_time_ms);
1058 } 1013 }
1059 return 0; 1014 return true;
1060 } 1015 }
1061 1016
1062 PacketOptions options; 1017 PacketOptions options;
1063 if (AllocateTransportSequenceNumber(&options.packet_id)) { 1018 if (AllocateTransportSequenceNumber(&options.packet_id)) {
1064 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length, 1019 if (packet->SetExtension<TransportSequenceNumber>(options.packet_id)) {
1065 rtp_header)) {
1066 if (transport_feedback_observer_) 1020 if (transport_feedback_observer_)
stefan-webrtc 2016/05/09 11:49:23 {}
danilchap 2016/05/09 13:45:22 Done.
1067 transport_feedback_observer_->AddPacket(options.packet_id, length, 1021 transport_feedback_observer_->AddPacket(options.packet_id,
1068 true); 1022 packet->size(), true);
1069 } 1023 }
1070 } 1024 }
1071 UpdateDelayStatistics(capture_time_ms, now_ms); 1025 UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
1072 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 1026 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
1027 packet->Ssrc());
1073 1028
1074 bool sent = SendPacketToNetwork(buffer, length, options); 1029 bool sent = SendPacketToNetwork(*packet, options);
1030
1031 if (sent) {
1032 {
1033 rtc::CritScope lock(&send_critsect_);
1034 media_has_been_sent_ = true;
1035 }
1036 UpdateRtpStats(*packet, false, false);
1037 }
1075 1038
1076 // Mark the packet as sent in the history even if send failed. Dropping a 1039 // Mark the packet as sent in the history even if send failed. Dropping a
1077 // packet here should be treated as any other packet drop so we should be 1040 // packet here should be treated as any other packet drop so we should be
1078 // ready for a retransmission. 1041 // ready for a retransmission.
1079 packet_history_.SetSent(rtp_header.sequenceNumber); 1042 packet_history_.PutRtpPacket(std::move(packet), storage, true);
1080 1043
1081 if (!sent) 1044 return sent;
1082 return -1;
1083
1084 {
1085 rtc::CritScope lock(&send_critsect_);
1086 media_has_been_sent_ = true;
1087 }
1088 UpdateRtpStats(buffer, length, rtp_header, false, false);
1089 return 0;
1090 } 1045 }
1091 1046
1092 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 1047 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
1093 if (!send_side_delay_observer_ || capture_time_ms <= 0) 1048 if (!send_side_delay_observer_ || capture_time_ms <= 0)
1094 return; 1049 return;
1095 1050
1096 uint32_t ssrc; 1051 uint32_t ssrc;
1097 int avg_delay_ms = 0; 1052 int avg_delay_ms = 0;
1098 int max_delay_ms = 0; 1053 int max_delay_ms = 0;
1099 { 1054 {
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 1459
1505 // Verify first byte in block. 1460 // Verify first byte in block.
1506 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2); 1461 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2);
1507 if (rtp_packet[block_pos] != first_block_byte) 1462 if (rtp_packet[block_pos] != first_block_byte)
1508 return ExtensionStatus::kError; 1463 return ExtensionStatus::kError;
1509 1464
1510 *extension_offset = block_pos; 1465 *extension_offset = block_pos;
1511 return ExtensionStatus::kOk; 1466 return ExtensionStatus::kOk;
1512 } 1467 }
1513 1468
1514 void 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 rtc::CritScope lock(&send_critsect_);
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
1539 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, 1469 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet,
1540 size_t rtp_packet_length, 1470 size_t rtp_packet_length,
1541 const RTPHeader& rtp_header, 1471 const RTPHeader& rtp_header,
1542 bool is_voiced, 1472 bool is_voiced,
1543 uint8_t dBov) const { 1473 uint8_t dBov) const {
1544 size_t offset; 1474 size_t offset;
1545 rtc::CritScope lock(&send_critsect_); 1475 rtc::CritScope lock(&send_critsect_);
1546 1476
1547 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, 1477 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet,
1548 rtp_packet_length, rtp_header, kAudioLevelLength, 1478 rtp_packet_length, rtp_header, kAudioLevelLength,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 case ExtensionStatus::kOk: 1510 case ExtensionStatus::kOk:
1581 break; 1511 break;
1582 default: 1512 default:
1583 RTC_NOTREACHED(); 1513 RTC_NOTREACHED();
1584 } 1514 }
1585 1515
1586 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); 1516 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation);
1587 return true; 1517 return true;
1588 } 1518 }
1589 1519
1590 void 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 rtc::CritScope lock(&send_critsect_);
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
1617 bool RTPSender::UpdateTransportSequenceNumber(
1618 uint16_t sequence_number,
1619 uint8_t* rtp_packet,
1620 size_t rtp_packet_length,
1621 const RTPHeader& rtp_header) const {
1622 size_t offset;
1623 rtc::CritScope lock(&send_critsect_);
1624
1625 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet,
1626 rtp_packet_length, rtp_header,
1627 kTransportSequenceNumberLength, &offset)) {
1628 case ExtensionStatus::kNotRegistered:
1629 return false;
1630 case ExtensionStatus::kError:
1631 LOG(LS_WARNING) << "Failed to update transport sequence number";
1632 return false;
1633 case ExtensionStatus::kOk:
1634 break;
1635 default:
1636 RTC_NOTREACHED();
1637 }
1638
1639 BuildTransportSequenceNumberExtension(rtp_packet + offset, sequence_number);
1640 return true;
1641 }
1642
1643 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const { 1520 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const {
1644 if (!transport_sequence_number_allocator_) 1521 if (!transport_sequence_number_allocator_)
1645 return false; 1522 return false;
1646 1523
1647 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1524 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1648 return true; 1525 return true;
1649 } 1526 }
1650 1527
1651 void RTPSender::SetSendingStatus(bool enabled) { 1528 void RTPSender::SetSendingStatus(bool enabled) {
1652 if (enabled) { 1529 if (enabled) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1813 int32_t RTPSender::SetFecParameters( 1690 int32_t RTPSender::SetFecParameters(
1814 const FecProtectionParams *delta_params, 1691 const FecProtectionParams *delta_params,
1815 const FecProtectionParams *key_params) { 1692 const FecProtectionParams *key_params) {
1816 if (audio_configured_) { 1693 if (audio_configured_) {
1817 return -1; 1694 return -1;
1818 } 1695 }
1819 video_->SetFecParameters(delta_params, key_params); 1696 video_->SetFecParameters(delta_params, key_params);
1820 return 0; 1697 return 0;
1821 } 1698 }
1822 1699
1823 void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, 1700 std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket(
1824 uint8_t* buffer_rtx) { 1701 const RtpPacketToSend& packet) {
1825 rtc::CritScope lock(&send_critsect_); 1702 // TODO(danilchap): Create rtx packet with extra capacity for SRTP
1826 uint8_t* data_buffer_rtx = buffer_rtx; 1703 // when transport interface would be updated to take buffer class.
1827 // Add RTX header. 1704 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
1828 RtpUtility::RtpHeaderParser rtp_parser( 1705 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
1829 reinterpret_cast<const uint8_t*>(buffer), *length); 1706 // Add original RTP header.
1707 rtx_packet->CopyHeaderFrom(packet);
1830 1708
1831 RTPHeader rtp_header; 1709 {
1832 rtp_parser.Parse(&rtp_header); 1710 rtc::CritScope lock(&send_critsect_);
1711 // Replace payload type, if a specific type is set for RTX.
1712 auto kv = rtx_payload_type_map_.find(packet.PayloadType());
1833 1713
1834 // Add original RTP header. 1714 // Use rtx mapping associated with media codec if we can't find one,
1835 memcpy(data_buffer_rtx, buffer, rtp_header.headerLength); 1715 // assume it's red.
1716 // TODO(holmer): Remove once old Chrome versions don't rely on this.
1717 if (kv == rtx_payload_type_map_.end())
1718 kv = rtx_payload_type_map_.find(payload_type_);
1719 if (kv != rtx_payload_type_map_.end())
1720 rtx_packet->SetPayloadType(kv->second);
1836 1721
1837 // Replace payload type, if a specific type is set for RTX. 1722 // Replace sequence number.
1838 auto kv = rtx_payload_type_map_.find(rtp_header.payloadType); 1723 rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
1839 // Use rtx mapping associated with media codec if we can't find one, assuming
1840 // it's red.
1841 // TODO(holmer): Remove once old Chrome versions don't rely on this.
1842 if (kv == rtx_payload_type_map_.end())
1843 kv = rtx_payload_type_map_.find(payload_type_);
1844 if (kv != rtx_payload_type_map_.end())
1845 data_buffer_rtx[1] = kv->second;
1846 if (rtp_header.markerBit)
1847 data_buffer_rtx[1] |= kRtpMarkerBitMask;
1848 1724
1849 // Replace sequence number. 1725 // Replace SSRC.
1850 uint8_t* ptr = data_buffer_rtx + 2; 1726 rtx_packet->SetSsrc(ssrc_rtx_);
1851 ByteWriter<uint16_t>::WriteBigEndian(ptr, sequence_number_rtx_++); 1727 }
1852 1728
1853 // Replace SSRC. 1729 uint8_t* rtx_payload =
1854 ptr += 6; 1730 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
1855 ByteWriter<uint32_t>::WriteBigEndian(ptr, ssrc_rtx_); 1731 RTC_DCHECK(rtx_payload);
1856
1857 // Add OSN (original sequence number). 1732 // Add OSN (original sequence number).
1858 ptr = data_buffer_rtx + rtp_header.headerLength; 1733 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
1859 ByteWriter<uint16_t>::WriteBigEndian(ptr, rtp_header.sequenceNumber);
1860 ptr += 2;
1861 1734
1862 // Add original payload data. 1735 // Add original payload data.
1863 memcpy(ptr, buffer + rtp_header.headerLength, 1736 memcpy(rtx_payload + kRtxHeaderSize, packet.payload(), packet.payload_size());
1864 *length - rtp_header.headerLength); 1737
1865 *length += 2; 1738 return rtx_packet;
1866 } 1739 }
1867 1740
1868 void RTPSender::RegisterRtpStatisticsCallback( 1741 void RTPSender::RegisterRtpStatisticsCallback(
1869 StreamDataCountersCallback* callback) { 1742 StreamDataCountersCallback* callback) {
1870 rtc::CritScope cs(&statistics_crit_); 1743 rtc::CritScope cs(&statistics_crit_);
1871 rtp_stats_callback_ = callback; 1744 rtp_stats_callback_ = callback;
1872 } 1745 }
1873 1746
1874 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { 1747 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const {
1875 rtc::CritScope cs(&statistics_crit_); 1748 rtc::CritScope cs(&statistics_crit_);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 rtc::CritScope lock(&send_critsect_); 1786 rtc::CritScope lock(&send_critsect_);
1914 1787
1915 RtpState state; 1788 RtpState state;
1916 state.sequence_number = sequence_number_rtx_; 1789 state.sequence_number = sequence_number_rtx_;
1917 state.start_timestamp = start_timestamp_; 1790 state.start_timestamp = start_timestamp_;
1918 1791
1919 return state; 1792 return state;
1920 } 1793 }
1921 1794
1922 } // namespace webrtc 1795 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698