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

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

Issue 2491293002: Make FlexFEC packets paceable through RTPSender. (Closed)
Patch Set: Created 4 years, 1 month 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
(...skipping 23 matching lines...) Expand all
34 34
35 namespace { 35 namespace {
36 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. 36 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
37 constexpr size_t kMaxPaddingLength = 224; 37 constexpr size_t kMaxPaddingLength = 224;
38 constexpr int kSendSideDelayWindowMs = 1000; 38 constexpr int kSendSideDelayWindowMs = 1000;
39 constexpr size_t kRtpHeaderLength = 12; 39 constexpr size_t kRtpHeaderLength = 12;
40 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. 40 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1.
41 constexpr uint32_t kTimestampTicksPerMs = 90; 41 constexpr uint32_t kTimestampTicksPerMs = 90;
42 constexpr int kBitrateStatisticsWindowMs = 1000; 42 constexpr int kBitrateStatisticsWindowMs = 1000;
43 43
44 constexpr size_t kFlexfecPacketsToStoreBeforePacing = 50;
brandtr 2016/11/10 13:34:14 Is this a reasonable number? We store up to 600 me
danilchap 2016/11/11 15:26:06 this is initial size of the packet history, buffer
brandtr 2016/11/14 09:48:08 Done.
45
44 const char* FrameTypeToString(FrameType frame_type) { 46 const char* FrameTypeToString(FrameType frame_type) {
45 switch (frame_type) { 47 switch (frame_type) {
46 case kEmptyFrame: 48 case kEmptyFrame:
47 return "empty"; 49 return "empty";
48 case kAudioFrameSpeech: return "audio_speech"; 50 case kAudioFrameSpeech: return "audio_speech";
49 case kAudioFrameCN: return "audio_cn"; 51 case kAudioFrameCN: return "audio_cn";
50 case kVideoFrameKey: return "video_key"; 52 case kVideoFrameKey: return "video_key";
51 case kVideoFrameDelta: return "video_delta"; 53 case kVideoFrameDelta: return "video_delta";
52 } 54 }
53 return ""; 55 return "";
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 transport_sequence_number_allocator_(sequence_number_allocator), 89 transport_sequence_number_allocator_(sequence_number_allocator),
88 transport_feedback_observer_(transport_feedback_observer), 90 transport_feedback_observer_(transport_feedback_observer),
89 last_capture_time_ms_sent_(0), 91 last_capture_time_ms_sent_(0),
90 transport_(transport), 92 transport_(transport),
91 sending_media_(true), // Default to sending media. 93 sending_media_(true), // Default to sending media.
92 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. 94 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP.
93 payload_type_(-1), 95 payload_type_(-1),
94 payload_type_map_(), 96 payload_type_map_(),
95 rtp_header_extension_map_(), 97 rtp_header_extension_map_(),
96 packet_history_(clock), 98 packet_history_(clock),
99 flexfec_packet_history_(clock),
97 // Statistics 100 // Statistics
98 rtp_stats_callback_(nullptr), 101 rtp_stats_callback_(nullptr),
99 total_bitrate_sent_(kBitrateStatisticsWindowMs, 102 total_bitrate_sent_(kBitrateStatisticsWindowMs,
100 RateStatistics::kBpsScale), 103 RateStatistics::kBpsScale),
101 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), 104 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
102 frame_count_observer_(frame_count_observer), 105 frame_count_observer_(frame_count_observer),
103 send_side_delay_observer_(send_side_delay_observer), 106 send_side_delay_observer_(send_side_delay_observer),
104 event_log_(event_log), 107 event_log_(event_log),
105 send_packet_observer_(send_packet_observer), 108 send_packet_observer_(send_packet_observer),
106 bitrate_callback_(bitrate_callback), 109 bitrate_callback_(bitrate_callback),
(...skipping 13 matching lines...) Expand all
120 ssrc_ = ssrc_db_->CreateSSRC(); 123 ssrc_ = ssrc_db_->CreateSSRC();
121 RTC_DCHECK(ssrc_ != 0); 124 RTC_DCHECK(ssrc_ != 0);
122 ssrc_rtx_ = ssrc_db_->CreateSSRC(); 125 ssrc_rtx_ = ssrc_db_->CreateSSRC();
123 RTC_DCHECK(ssrc_rtx_ != 0); 126 RTC_DCHECK(ssrc_rtx_ != 0);
124 127
125 // This random initialization is not intended to be cryptographic strong. 128 // This random initialization is not intended to be cryptographic strong.
126 timestamp_offset_ = random_.Rand<uint32_t>(); 129 timestamp_offset_ = random_.Rand<uint32_t>();
127 // Random start, 16 bits. Can't be 0. 130 // Random start, 16 bits. Can't be 0.
128 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 131 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
129 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 132 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
133
134 // Store FlexFEC packets in the packet history data structure, so they can
135 // be found when paced.
136 if (flexfec_sender) {
137 flexfec_packet_history_.SetStorePacketsStatus(
138 true, kFlexfecPacketsToStoreBeforePacing);
139 }
130 } 140 }
131 141
132 RTPSender::~RTPSender() { 142 RTPSender::~RTPSender() {
133 // TODO(tommi): Use a thread checker to ensure the object is created and 143 // TODO(tommi): Use a thread checker to ensure the object is created and
134 // deleted on the same thread. At the moment this isn't possible due to 144 // deleted on the same thread. At the moment this isn't possible due to
135 // voe::ChannelOwner in voice engine. To reproduce, run: 145 // voe::ChannelOwner in voice engine. To reproduce, run:
136 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus 146 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
137 147
138 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member 148 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
139 // variables but we grab them in all other methods. (what's the design?) 149 // variables but we grab them in all other methods. (what's the design?)
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 } 688 }
679 } 689 }
680 } 690 }
681 691
682 void RTPSender::OnReceivedRtcpReportBlocks( 692 void RTPSender::OnReceivedRtcpReportBlocks(
683 const ReportBlockList& report_blocks) { 693 const ReportBlockList& report_blocks) {
684 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks); 694 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks);
685 } 695 }
686 696
687 // Called from pacer when we can send the packet. 697 // Called from pacer when we can send the packet.
688 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, 698 bool RTPSender::TimeToSendPacket(uint32_t ssrc,
699 uint16_t sequence_number,
689 int64_t capture_time_ms, 700 int64_t capture_time_ms,
690 bool retransmission, 701 bool retransmission,
691 int probe_cluster_id) { 702 int probe_cluster_id) {
692 std::unique_ptr<RtpPacketToSend> packet = 703 std::unique_ptr<RtpPacketToSend> packet;
693 packet_history_.GetPacketAndSetSendTime(sequence_number, 0, 704 rtc::Optional<uint32_t> flexfec_ssrc = FlexfecSsrc();
694 retransmission); 705 if (flexfec_ssrc && ssrc == flexfec_ssrc) {
706 packet = flexfec_packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
707 retransmission);
708 } else {
709 packet = packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
710 retransmission);
711 }
712
695 if (!packet) { 713 if (!packet) {
696 // Packet cannot be found. Allow sending to continue. 714 // Packet cannot be found. Allow sending to continue.
697 return true; 715 return true;
698 } 716 }
699 717
700 return PrepareAndSendPacket( 718 return PrepareAndSendPacket(
701 std::move(packet), 719 std::move(packet),
702 retransmission && (RtxStatus() & kRtxRetransmitted) > 0, retransmission, 720 retransmission && (RtxStatus() & kRtxRetransmitted) > 0, retransmission,
703 probe_cluster_id); 721 probe_cluster_id);
704 } 722 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 } else { 850 } else {
833 BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioTotBitrate_kbps", now_ms, 851 BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioTotBitrate_kbps", now_ms,
834 ActualSendBitrateKbit(), packet->Ssrc()); 852 ActualSendBitrateKbit(), packet->Ssrc());
835 BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioNackBitrate_kbps", now_ms, 853 BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioNackBitrate_kbps", now_ms,
836 NackOverheadRate() / 1000, packet->Ssrc()); 854 NackOverheadRate() / 1000, packet->Ssrc());
837 } 855 }
838 856
839 if (paced_sender_) { 857 if (paced_sender_) {
840 uint16_t seq_no = packet->SequenceNumber(); 858 uint16_t seq_no = packet->SequenceNumber();
841 uint32_t ssrc = packet->Ssrc(); 859 uint32_t ssrc = packet->Ssrc();
860 rtc::Optional<uint32_t> flexfec_ssrc = FlexfecSsrc();
842 // Correct offset between implementations of millisecond time stamps in 861 // Correct offset between implementations of millisecond time stamps in
843 // TickTime and Clock. 862 // TickTime and Clock.
844 int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_; 863 int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_;
845 size_t payload_length = packet->payload_size(); 864 size_t payload_length = packet->payload_size();
846 packet_history_.PutRtpPacket(std::move(packet), storage, false); 865 if (flexfec_ssrc && ssrc == flexfec_ssrc) {
866 flexfec_packet_history_.PutRtpPacket(std::move(packet), storage, false);
867 } else {
868 packet_history_.PutRtpPacket(std::move(packet), storage, false);
869 }
847 870
848 paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms, 871 paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms,
849 payload_length, false); 872 payload_length, false);
850 if (last_capture_time_ms_sent_ == 0 || 873 if (last_capture_time_ms_sent_ == 0 ||
851 corrected_time_ms > last_capture_time_ms_sent_) { 874 corrected_time_ms > last_capture_time_ms_sent_) {
852 last_capture_time_ms_sent_ = corrected_time_ms; 875 last_capture_time_ms_sent_ = corrected_time_ms;
853 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 876 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
854 "PacedSend", corrected_time_ms, 877 "PacedSend", corrected_time_ms,
855 "capture_time_ms", corrected_time_ms); 878 "capture_time_ms", corrected_time_ms);
856 } 879 }
(...skipping 18 matching lines...) Expand all
875 { 898 {
876 rtc::CritScope lock(&send_critsect_); 899 rtc::CritScope lock(&send_critsect_);
877 media_has_been_sent_ = true; 900 media_has_been_sent_ = true;
878 } 901 }
879 UpdateRtpStats(*packet, false, false); 902 UpdateRtpStats(*packet, false, false);
880 } 903 }
881 904
882 // Mark the packet as sent in the history even if send failed. Dropping a 905 // Mark the packet as sent in the history even if send failed. Dropping a
883 // packet here should be treated as any other packet drop so we should be 906 // packet here should be treated as any other packet drop so we should be
884 // ready for a retransmission. 907 // ready for a retransmission.
885 packet_history_.PutRtpPacket(std::move(packet), storage, true); 908 packet_history_.PutRtpPacket(std::move(packet), storage, true);
brandtr 2016/11/10 13:34:14 No need to store FlexFEC packets here, since at th
danilchap 2016/11/10 16:15:13 still need to check ssrc, right now you would stor
brandtr 2016/11/11 10:28:16 Good point, you are right. Right now, I have not
886 909
887 return sent; 910 return sent;
888 } 911 }
889 912
890 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 913 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
891 if (!send_side_delay_observer_ || capture_time_ms <= 0) 914 if (!send_side_delay_observer_ || capture_time_ms <= 0)
892 return; 915 return;
893 916
894 uint32_t ssrc; 917 uint32_t ssrc;
895 int avg_delay_ms = 0; 918 int avg_delay_ms = 0;
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 if (!sequence_number_forced_) { 1105 if (!sequence_number_forced_) {
1083 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1106 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1084 } 1107 }
1085 } 1108 }
1086 1109
1087 uint32_t RTPSender::SSRC() const { 1110 uint32_t RTPSender::SSRC() const {
1088 rtc::CritScope lock(&send_critsect_); 1111 rtc::CritScope lock(&send_critsect_);
1089 return ssrc_; 1112 return ssrc_;
1090 } 1113 }
1091 1114
1115 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
1116 if (video_) {
1117 return video_->FlexfecSsrc();
1118 }
1119 return rtc::Optional<uint32_t>(); // No value.
1120 }
1121
1092 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { 1122 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
1093 assert(csrcs.size() <= kRtpCsrcSize); 1123 assert(csrcs.size() <= kRtpCsrcSize);
1094 rtc::CritScope lock(&send_critsect_); 1124 rtc::CritScope lock(&send_critsect_);
1095 csrcs_ = csrcs; 1125 csrcs_ = csrcs;
1096 } 1126 }
1097 1127
1098 void RTPSender::SetSequenceNumber(uint16_t seq) { 1128 void RTPSender::SetSequenceNumber(uint16_t seq) {
1099 rtc::CritScope lock(&send_critsect_); 1129 rtc::CritScope lock(&send_critsect_);
1100 sequence_number_forced_ = true; 1130 sequence_number_forced_ = true;
1101 sequence_number_ = seq; 1131 sequence_number_ = seq;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 rtc::CritScope lock(&send_critsect_); 1268 rtc::CritScope lock(&send_critsect_);
1239 1269
1240 RtpState state; 1270 RtpState state;
1241 state.sequence_number = sequence_number_rtx_; 1271 state.sequence_number = sequence_number_rtx_;
1242 state.start_timestamp = timestamp_offset_; 1272 state.start_timestamp = timestamp_offset_;
1243 1273
1244 return state; 1274 return state;
1245 } 1275 }
1246 1276
1247 } // namespace webrtc 1277 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.h ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698