OLD | NEW |
---|---|
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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
68 Transport* transport, | 68 Transport* transport, |
69 RtpPacketSender* paced_sender, | 69 RtpPacketSender* paced_sender, |
70 FlexfecSender* flexfec_sender, | 70 FlexfecSender* flexfec_sender, |
71 TransportSequenceNumberAllocator* sequence_number_allocator, | 71 TransportSequenceNumberAllocator* sequence_number_allocator, |
72 TransportFeedbackObserver* transport_feedback_observer, | 72 TransportFeedbackObserver* transport_feedback_observer, |
73 BitrateStatisticsObserver* bitrate_callback, | 73 BitrateStatisticsObserver* bitrate_callback, |
74 FrameCountObserver* frame_count_observer, | 74 FrameCountObserver* frame_count_observer, |
75 SendSideDelayObserver* send_side_delay_observer, | 75 SendSideDelayObserver* send_side_delay_observer, |
76 RtcEventLog* event_log, | 76 RtcEventLog* event_log, |
77 SendPacketObserver* send_packet_observer, | 77 SendPacketObserver* send_packet_observer, |
78 RateLimiter* retransmission_rate_limiter) | 78 RateLimiter* retransmission_rate_limiter, |
79 OverheadSizeObserver* overhead_size_observer) | |
79 : clock_(clock), | 80 : clock_(clock), |
80 // TODO(holmer): Remove this conversion? | 81 // TODO(holmer): Remove this conversion? |
81 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), | 82 clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()), |
82 random_(clock_->TimeInMicroseconds()), | 83 random_(clock_->TimeInMicroseconds()), |
83 audio_configured_(audio), | 84 audio_configured_(audio), |
84 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), | 85 audio_(audio ? new RTPSenderAudio(clock, this) : nullptr), |
85 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), | 86 video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)), |
86 paced_sender_(paced_sender), | 87 paced_sender_(paced_sender), |
87 transport_sequence_number_allocator_(sequence_number_allocator), | 88 transport_sequence_number_allocator_(sequence_number_allocator), |
88 transport_feedback_observer_(transport_feedback_observer), | 89 transport_feedback_observer_(transport_feedback_observer), |
(...skipping 20 matching lines...) Expand all Loading... | |
109 remote_ssrc_(0), | 110 remote_ssrc_(0), |
110 sequence_number_forced_(false), | 111 sequence_number_forced_(false), |
111 ssrc_forced_(false), | 112 ssrc_forced_(false), |
112 last_rtp_timestamp_(0), | 113 last_rtp_timestamp_(0), |
113 capture_time_ms_(0), | 114 capture_time_ms_(0), |
114 last_timestamp_time_ms_(0), | 115 last_timestamp_time_ms_(0), |
115 media_has_been_sent_(false), | 116 media_has_been_sent_(false), |
116 last_packet_marker_bit_(false), | 117 last_packet_marker_bit_(false), |
117 csrcs_(), | 118 csrcs_(), |
118 rtx_(kRtxOff), | 119 rtx_(kRtxOff), |
119 retransmission_rate_limiter_(retransmission_rate_limiter) { | 120 transport_overhead_bytes_per_packet_(0), |
121 rtp_overhead_bytes_per_packet_(0), | |
122 retransmission_rate_limiter_(retransmission_rate_limiter), | |
123 overhead_size_observer_(overhead_size_observer) { | |
120 ssrc_ = ssrc_db_->CreateSSRC(); | 124 ssrc_ = ssrc_db_->CreateSSRC(); |
121 RTC_DCHECK(ssrc_ != 0); | 125 RTC_DCHECK(ssrc_ != 0); |
122 ssrc_rtx_ = ssrc_db_->CreateSSRC(); | 126 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
123 RTC_DCHECK(ssrc_rtx_ != 0); | 127 RTC_DCHECK(ssrc_rtx_ != 0); |
124 | 128 |
125 // This random initialization is not intended to be cryptographic strong. | 129 // This random initialization is not intended to be cryptographic strong. |
126 timestamp_offset_ = random_.Rand<uint32_t>(); | 130 timestamp_offset_ = random_.Rand<uint32_t>(); |
127 // Random start, 16 bits. Can't be 0. | 131 // Random start, 16 bits. Can't be 0. |
128 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 132 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
129 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 133 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
554 padding_packet.SetTimestamp(timestamp); | 558 padding_packet.SetTimestamp(timestamp); |
555 padding_packet.SetSsrc(ssrc); | 559 padding_packet.SetSsrc(ssrc); |
556 | 560 |
557 int64_t now_ms = clock_->TimeInMilliseconds(); | 561 int64_t now_ms = clock_->TimeInMilliseconds(); |
558 | 562 |
559 if (capture_time_ms > 0) { | 563 if (capture_time_ms > 0) { |
560 padding_packet.SetExtension<TransmissionOffset>( | 564 padding_packet.SetExtension<TransmissionOffset>( |
561 kTimestampTicksPerMs * (now_ms - capture_time_ms)); | 565 kTimestampTicksPerMs * (now_ms - capture_time_ms)); |
562 } | 566 } |
563 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); | 567 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); |
564 | |
565 PacketOptions options; | 568 PacketOptions options; |
566 bool has_transport_seq_no = | 569 bool has_transport_seq_num = |
567 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); | 570 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); |
568 | |
569 padding_packet.SetPadding(padding_bytes_in_packet, &random_); | 571 padding_packet.SetPadding(padding_bytes_in_packet, &random_); |
570 | 572 |
571 if (has_transport_seq_no && transport_feedback_observer_) | 573 if (has_transport_seq_num) { |
572 transport_feedback_observer_->AddPacket( | 574 AddPacketToTransportFeedback(options.packet_id, padding_packet, |
573 options.packet_id, | 575 probe_cluster_id); |
574 padding_packet.payload_size() + padding_packet.padding_size(), | 576 } |
575 probe_cluster_id); | |
576 | 577 |
577 if (!SendPacketToNetwork(padding_packet, options)) | 578 if (!SendPacketToNetwork(padding_packet, options)) |
578 break; | 579 break; |
579 | 580 |
580 bytes_sent += padding_bytes_in_packet; | 581 bytes_sent += padding_bytes_in_packet; |
581 UpdateRtpStats(padding_packet, over_rtx, false); | 582 UpdateRtpStats(padding_packet, over_rtx, false); |
582 } | 583 } |
583 | 584 |
584 return bytes_sent; | 585 return bytes_sent; |
585 } | 586 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
623 if (!PrepareAndSendPacket(std::move(packet), rtx, true, | 624 if (!PrepareAndSendPacket(std::move(packet), rtx, true, |
624 PacketInfo::kNotAProbe)) | 625 PacketInfo::kNotAProbe)) |
625 return -1; | 626 return -1; |
626 return packet_size; | 627 return packet_size; |
627 } | 628 } |
628 | 629 |
629 bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet, | 630 bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet, |
630 const PacketOptions& options) { | 631 const PacketOptions& options) { |
631 int bytes_sent = -1; | 632 int bytes_sent = -1; |
632 if (transport_) { | 633 if (transport_) { |
634 UpdateRtpOverheadSize(packet); | |
633 bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options) | 635 bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options) |
634 ? static_cast<int>(packet.size()) | 636 ? static_cast<int>(packet.size()) |
635 : -1; | 637 : -1; |
636 if (event_log_ && bytes_sent > 0) { | 638 if (event_log_ && bytes_sent > 0) { |
637 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(), | 639 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(), |
638 packet.size()); | 640 packet.size()); |
639 } | 641 } |
640 } | 642 } |
641 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 643 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
642 "RTPSender::SendPacketToNetwork", "size", packet.size(), | 644 "RTPSender::SendPacketToNetwork", "size", packet.size(), |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
728 packet_to_send = packet_rtx.get(); | 730 packet_to_send = packet_rtx.get(); |
729 } | 731 } |
730 | 732 |
731 int64_t now_ms = clock_->TimeInMilliseconds(); | 733 int64_t now_ms = clock_->TimeInMilliseconds(); |
732 int64_t diff_ms = now_ms - capture_time_ms; | 734 int64_t diff_ms = now_ms - capture_time_ms; |
733 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * | 735 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * |
734 diff_ms); | 736 diff_ms); |
735 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); | 737 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); |
736 | 738 |
737 PacketOptions options; | 739 PacketOptions options; |
738 if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id) && | 740 if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id)) { |
739 transport_feedback_observer_) { | 741 AddPacketToTransportFeedback(options.packet_id, *packet_to_send, |
740 transport_feedback_observer_->AddPacket( | 742 probe_cluster_id); |
741 options.packet_id, | |
742 packet_to_send->payload_size() + packet_to_send->padding_size(), | |
743 probe_cluster_id); | |
744 } | 743 } |
745 | 744 |
746 if (!is_retransmit && !send_over_rtx) { | 745 if (!is_retransmit && !send_over_rtx) { |
747 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 746 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
748 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 747 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
749 packet->Ssrc()); | 748 packet->Ssrc()); |
750 } | 749 } |
751 | 750 |
752 if (!SendPacketToNetwork(*packet_to_send, options)) | 751 if (!SendPacketToNetwork(*packet_to_send, options)) |
753 return false; | 752 return false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
851 corrected_time_ms > last_capture_time_ms_sent_) { | 850 corrected_time_ms > last_capture_time_ms_sent_) { |
852 last_capture_time_ms_sent_ = corrected_time_ms; | 851 last_capture_time_ms_sent_ = corrected_time_ms; |
853 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 852 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
854 "PacedSend", corrected_time_ms, | 853 "PacedSend", corrected_time_ms, |
855 "capture_time_ms", corrected_time_ms); | 854 "capture_time_ms", corrected_time_ms); |
856 } | 855 } |
857 return true; | 856 return true; |
858 } | 857 } |
859 | 858 |
860 PacketOptions options; | 859 PacketOptions options; |
861 if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id) && | 860 if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id)) { |
862 transport_feedback_observer_) { | 861 AddPacketToTransportFeedback(options.packet_id, *packet.get(), |
863 transport_feedback_observer_->AddPacket( | 862 PacketInfo::kNotAProbe); |
864 options.packet_id, packet->payload_size() + packet->padding_size(), | |
865 PacketInfo::kNotAProbe); | |
866 } | 863 } |
867 | 864 |
868 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); | 865 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
869 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), | 866 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
870 packet->Ssrc()); | 867 packet->Ssrc()); |
871 | 868 |
872 bool sent = SendPacketToNetwork(*packet, options); | 869 bool sent = SendPacketToNetwork(*packet, options); |
873 | 870 |
874 if (sent) { | 871 if (sent) { |
875 { | 872 { |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1233 RtpState RTPSender::GetRtxRtpState() const { | 1230 RtpState RTPSender::GetRtxRtpState() const { |
1234 rtc::CritScope lock(&send_critsect_); | 1231 rtc::CritScope lock(&send_critsect_); |
1235 | 1232 |
1236 RtpState state; | 1233 RtpState state; |
1237 state.sequence_number = sequence_number_rtx_; | 1234 state.sequence_number = sequence_number_rtx_; |
1238 state.start_timestamp = timestamp_offset_; | 1235 state.start_timestamp = timestamp_offset_; |
1239 | 1236 |
1240 return state; | 1237 return state; |
1241 } | 1238 } |
1242 | 1239 |
1240 void RTPSender::SetTransportOverhead(int transport_overhead) { | |
minyue-webrtc
2016/11/16 08:48:59
how about
void RTPSender::SetTransportOverheadSiz
michaelt
2016/11/16 09:27:09
SetTransportOverheadSize is used in all the rest o
minyue-webrtc
2016/11/16 12:39:52
I see. After rethinking, I think overhead has a se
michaelt
2016/11/16 13:29:37
Done
minyue-webrtc
2016/11/16 15:13:38
Have you uploaded new patch set?
michaelt
2016/11/17 08:25:53
Now yes :)
| |
1241 if (!overhead_size_observer_) | |
1242 return; | |
1243 int overhead_bytes_per_packet = 0; | |
1244 { | |
1245 rtc::CritScope lock(&send_critsect_); | |
1246 if (rtp_overhead_bytes_per_packet_ == | |
minyue-webrtc
2016/11/16 08:48:59
transport_overhead_bytes_per_packet_?
michaelt
2016/11/16 09:27:09
Oops. I may should write a unit test for this :)
minyue-webrtc
2016/11/16 12:39:52
no need for unittest (too many of these may possib
michaelt
2016/11/16 13:29:37
I already added a test for this. Should I remove i
minyue-webrtc
2016/11/16 15:13:38
Ok. I missed it, can take a look now. I think the
| |
1247 static_cast<size_t>(transport_overhead)) { | |
1248 return; | |
1249 } | |
1250 transport_overhead_bytes_per_packet_ = transport_overhead; | |
1251 overhead_bytes_per_packet = | |
1252 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
1253 } | |
1254 overhead_size_observer_->OnOverheadSizeChanged(overhead_bytes_per_packet); | |
1255 } | |
1256 | |
1257 void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id, | |
minyue-webrtc
2016/11/16 08:48:59
To me, this help function does not bring much more
michaelt
2016/11/16 09:27:09
To me the helper function brings a bit more value
minyue-webrtc
2016/11/16 12:39:52
Acknowledged.
| |
1258 const RtpPacketToSend& packet, | |
1259 int probe_cluster_id) { | |
1260 if (transport_feedback_observer_) { | |
1261 transport_feedback_observer_->AddPacket( | |
1262 packet_id, packet.payload_size() + packet.padding_size(), | |
1263 probe_cluster_id); | |
1264 } | |
1265 } | |
1266 | |
1267 void RTPSender::UpdateRtpOverheadSize(const RtpPacketToSend& packet) { | |
1268 if (!overhead_size_observer_) | |
1269 return; | |
1270 int overhead_bytes_per_packet = 0; | |
1271 { | |
1272 rtc::CritScope lock(&send_critsect_); | |
1273 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { | |
1274 return; | |
1275 } | |
1276 rtp_overhead_bytes_per_packet_ = packet.headers_size(); | |
1277 overhead_bytes_per_packet = | |
1278 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | |
1279 } | |
1280 overhead_size_observer_->OnOverheadSizeChanged(overhead_bytes_per_packet); | |
1281 } | |
1282 | |
1243 } // namespace webrtc | 1283 } // namespace webrtc |
OLD | NEW |