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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 void OnPacketReady(uint8_t* data, size_t length) override { | 92 void OnPacketReady(uint8_t* data, size_t length) override { |
93 if (transport_->SendRtcp(data, length)) { | 93 if (transport_->SendRtcp(data, length)) { |
94 bytes_sent_ += length; | 94 bytes_sent_ += length; |
95 if (event_log_) { | 95 if (event_log_) { |
96 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, | 96 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, |
97 length); | 97 length); |
98 } | 98 } |
99 } | 99 } |
100 } | 100 } |
101 | 101 |
102 size_t SendPackets() { | 102 size_t SendPackets(size_t max_payload_length) { |
103 rtcp::CompoundPacket::Build(this); | 103 RTC_DCHECK_LE(max_payload_length, static_cast<size_t>(IP_PACKET_SIZE)); |
104 uint8_t buffer[IP_PACKET_SIZE]; | |
105 BuildExternalBuffer(buffer, max_payload_length, this); | |
104 return bytes_sent_; | 106 return bytes_sent_; |
105 } | 107 } |
106 | 108 |
107 private: | 109 private: |
108 Transport* transport_; | 110 Transport* transport_; |
109 RtcEventLog* const event_log_; | 111 RtcEventLog* const event_log_; |
110 size_t bytes_sent_; | 112 size_t bytes_sent_; |
111 | 113 |
112 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer); | 114 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer); |
113 }; | 115 }; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
161 ssrc_(0), | 163 ssrc_(0), |
162 remote_ssrc_(0), | 164 remote_ssrc_(0), |
163 receive_statistics_(receive_statistics), | 165 receive_statistics_(receive_statistics), |
164 | 166 |
165 sequence_number_fir_(0), | 167 sequence_number_fir_(0), |
166 | 168 |
167 remb_bitrate_(0), | 169 remb_bitrate_(0), |
168 | 170 |
169 tmmbr_help_(), | 171 tmmbr_help_(), |
170 tmmbr_send_(0), | 172 tmmbr_send_(0), |
171 packet_oh_send_(0), | 173 packet_overhead_(28), |
174 max_payload_length_(IP_PACKET_SIZE - packet_overhead_), | |
172 | 175 |
173 app_sub_type_(0), | 176 app_sub_type_(0), |
174 app_name_(0), | 177 app_name_(0), |
175 app_data_(nullptr), | 178 app_data_(nullptr), |
176 app_length_(0), | 179 app_length_(0), |
177 | 180 |
178 xr_send_receiver_reference_time_enabled_(false), | 181 xr_send_receiver_reference_time_enabled_(false), |
179 packet_type_counter_observer_(packet_type_counter_observer) { | 182 packet_type_counter_observer_(packet_type_counter_observer) { |
180 RTC_DCHECK(transport_ != nullptr); | 183 RTC_DCHECK(transport_ != nullptr); |
181 | 184 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 | 273 |
271 void RTCPSender::SetTMMBRStatus(bool enable) { | 274 void RTCPSender::SetTMMBRStatus(bool enable) { |
272 rtc::CritScope lock(&critical_section_rtcp_sender_); | 275 rtc::CritScope lock(&critical_section_rtcp_sender_); |
273 if (enable) { | 276 if (enable) { |
274 SetFlag(RTCPPacketType::kRtcpTmmbr, false); | 277 SetFlag(RTCPPacketType::kRtcpTmmbr, false); |
275 } else { | 278 } else { |
276 ConsumeFlag(RTCPPacketType::kRtcpTmmbr, true); | 279 ConsumeFlag(RTCPPacketType::kRtcpTmmbr, true); |
277 } | 280 } |
278 } | 281 } |
279 | 282 |
283 void RTCPSender::SetMaxPayloadLength(size_t length, uint16_t packet_overhead) { | |
284 rtc::CritScope lock(&critical_section_rtcp_sender_); | |
285 max_payload_length_ = length; | |
286 packet_overhead_ = packet_overhead; | |
287 } | |
288 | |
280 void RTCPSender::SetStartTimestamp(uint32_t start_timestamp) { | 289 void RTCPSender::SetStartTimestamp(uint32_t start_timestamp) { |
281 rtc::CritScope lock(&critical_section_rtcp_sender_); | 290 rtc::CritScope lock(&critical_section_rtcp_sender_); |
282 start_timestamp_ = start_timestamp; | 291 start_timestamp_ = start_timestamp; |
283 } | 292 } |
284 | 293 |
285 void RTCPSender::SetLastRtpTime(uint32_t rtp_timestamp, | 294 void RTCPSender::SetLastRtpTime(uint32_t rtp_timestamp, |
286 int64_t capture_time_ms) { | 295 int64_t capture_time_ms) { |
287 rtc::CritScope lock(&critical_section_rtcp_sender_); | 296 rtc::CritScope lock(&critical_section_rtcp_sender_); |
288 last_rtp_timestamp_ = rtp_timestamp; | 297 last_rtp_timestamp_ = rtp_timestamp; |
289 if (capture_time_ms < 0) { | 298 if (capture_time_ms < 0) { |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
583 | 592 |
584 // holding critical_section_rtcp_sender_ while calling RTCPreceiver which | 593 // holding critical_section_rtcp_sender_ while calling RTCPreceiver which |
585 // will accuire criticalSectionRTCPReceiver_ is a potental deadlock but | 594 // will accuire criticalSectionRTCPReceiver_ is a potental deadlock but |
586 // since RTCPreceiver is not doing the reverse we should be fine | 595 // since RTCPreceiver is not doing the reverse we should be fine |
587 int32_t lengthOfBoundingSet = | 596 int32_t lengthOfBoundingSet = |
588 ctx.feedback_state_.module->BoundingSet(&tmmbrOwner, candidateSet); | 597 ctx.feedback_state_.module->BoundingSet(&tmmbrOwner, candidateSet); |
589 | 598 |
590 if (lengthOfBoundingSet > 0) { | 599 if (lengthOfBoundingSet > 0) { |
591 for (int32_t i = 0; i < lengthOfBoundingSet; i++) { | 600 for (int32_t i = 0; i < lengthOfBoundingSet; i++) { |
592 if (candidateSet->Tmmbr(i) == tmmbr_send_ && | 601 if (candidateSet->Tmmbr(i) == tmmbr_send_ && |
593 candidateSet->PacketOH(i) == packet_oh_send_) { | 602 candidateSet->PacketOH(i) == packet_overhead_) { |
594 // Do not send the same tuple. | 603 // Do not send the same tuple. |
595 return nullptr; | 604 return nullptr; |
596 } | 605 } |
597 } | 606 } |
598 if (!tmmbrOwner) { | 607 if (!tmmbrOwner) { |
599 // use received bounding set as candidate set | 608 // use received bounding set as candidate set |
600 // add current tuple | 609 // add current tuple |
601 candidateSet->SetEntry(lengthOfBoundingSet, tmmbr_send_, packet_oh_send_, | 610 candidateSet->SetEntry(lengthOfBoundingSet, tmmbr_send_, packet_overhead_, |
åsapersson
2016/03/30 10:28:36
Should packet_overhead_ for tmmbr include the RTP
danilchap
2016/03/30 12:38:24
Yes, in fact it should, as well as rtp header exte
| |
602 ssrc_); | 611 ssrc_); |
603 int numCandidates = lengthOfBoundingSet + 1; | 612 int numCandidates = lengthOfBoundingSet + 1; |
604 | 613 |
605 // find bounding set | 614 // find bounding set |
606 TMMBRSet* boundingSet = nullptr; | 615 TMMBRSet* boundingSet = nullptr; |
607 int numBoundingSet = tmmbr_help_.FindTMMBRBoundingSet(boundingSet); | 616 int numBoundingSet = tmmbr_help_.FindTMMBRBoundingSet(boundingSet); |
608 if (numBoundingSet > 0 || numBoundingSet <= numCandidates) | 617 if (numBoundingSet > 0 || numBoundingSet <= numCandidates) |
609 tmmbrOwner = tmmbr_help_.IsOwner(ssrc_, numBoundingSet); | 618 tmmbrOwner = tmmbr_help_.IsOwner(ssrc_, numBoundingSet); |
610 if (!tmmbrOwner) { | 619 if (!tmmbrOwner) { |
611 // Did not enter bounding set, no meaning to send this request. | 620 // Did not enter bounding set, no meaning to send this request. |
612 return nullptr; | 621 return nullptr; |
613 } | 622 } |
614 } | 623 } |
615 } | 624 } |
616 | 625 |
617 if (!tmmbr_send_) | 626 if (!tmmbr_send_) |
618 return nullptr; | 627 return nullptr; |
619 | 628 |
620 rtcp::Tmmbr* tmmbr = new rtcp::Tmmbr(); | 629 rtcp::Tmmbr* tmmbr = new rtcp::Tmmbr(); |
621 tmmbr->From(ssrc_); | 630 tmmbr->From(ssrc_); |
622 rtcp::TmmbItem request; | 631 rtcp::TmmbItem request; |
623 request.set_ssrc(remote_ssrc_); | 632 request.set_ssrc(remote_ssrc_); |
624 request.set_bitrate_bps(tmmbr_send_ * 1000); | 633 request.set_bitrate_bps(tmmbr_send_ * 1000); |
625 request.set_packet_overhead(packet_oh_send_); | 634 request.set_packet_overhead(packet_overhead_); |
626 tmmbr->WithTmmbr(request); | 635 tmmbr->WithTmmbr(request); |
627 | 636 |
628 return std::unique_ptr<rtcp::RtcpPacket>(tmmbr); | 637 return std::unique_ptr<rtcp::RtcpPacket>(tmmbr); |
629 } | 638 } |
630 | 639 |
631 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTMMBN( | 640 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTMMBN( |
632 const RtcpContext& ctx) { | 641 const RtcpContext& ctx) { |
633 TMMBRSet* boundingSet = tmmbr_help_.BoundingSetToSend(); | 642 TMMBRSet* boundingSet = tmmbr_help_.BoundingSetToSend(); |
634 if (boundingSet == nullptr) | 643 if (boundingSet == nullptr) |
635 return nullptr; | 644 return nullptr; |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
802 } | 811 } |
803 | 812 |
804 if (packet_type_counter_observer_ != nullptr) { | 813 if (packet_type_counter_observer_ != nullptr) { |
805 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( | 814 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( |
806 remote_ssrc_, packet_type_counter_); | 815 remote_ssrc_, packet_type_counter_); |
807 } | 816 } |
808 | 817 |
809 RTC_DCHECK(AllVolatileFlagsConsumed()); | 818 RTC_DCHECK(AllVolatileFlagsConsumed()); |
810 } | 819 } |
811 | 820 |
812 size_t bytes_sent = container.SendPackets(); | 821 size_t bytes_sent = container.SendPackets(max_payload_length_); |
813 return bytes_sent == 0 ? -1 : 0; | 822 return bytes_sent == 0 ? -1 : 0; |
814 } | 823 } |
815 | 824 |
816 void RTCPSender::PrepareReport(const std::set<RTCPPacketType>& packetTypes, | 825 void RTCPSender::PrepareReport(const std::set<RTCPPacketType>& packetTypes, |
817 const FeedbackState& feedback_state) { | 826 const FeedbackState& feedback_state) { |
818 // Add all flags as volatile. Non volatile entries will not be overwritten | 827 // Add all flags as volatile. Non volatile entries will not be overwritten |
819 // and all new volatile flags added will be consumed by the end of this call. | 828 // and all new volatile flags added will be consumed by the end of this call. |
820 SetFlags(packetTypes, true); | 829 SetFlags(packetTypes, true); |
821 | 830 |
822 if (packet_type_counter_.first_packet_time_ms == -1) | 831 if (packet_type_counter_.first_packet_time_ms == -1) |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1023 } | 1032 } |
1024 | 1033 |
1025 Transport* const transport_; | 1034 Transport* const transport_; |
1026 RtcEventLog* const event_log_; | 1035 RtcEventLog* const event_log_; |
1027 bool send_failure_; | 1036 bool send_failure_; |
1028 // TODO(terelius): We would like to | 1037 // TODO(terelius): We would like to |
1029 // RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Sender); | 1038 // RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Sender); |
1030 // but we can't because of an incorrect warning (C4822) in MVS 2013. | 1039 // but we can't because of an incorrect warning (C4822) in MVS 2013. |
1031 } sender(transport_, event_log_); | 1040 } sender(transport_, event_log_); |
1032 | 1041 |
1042 RTC_DCHECK_LE(max_payload_length_, static_cast<size_t>(IP_PACKET_SIZE)); | |
1033 uint8_t buffer[IP_PACKET_SIZE]; | 1043 uint8_t buffer[IP_PACKET_SIZE]; |
1034 return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) && | 1044 return packet.BuildExternalBuffer(buffer, max_payload_length_, &sender) && |
1035 !sender.send_failure_; | 1045 !sender.send_failure_; |
1036 } | 1046 } |
1037 | 1047 |
1038 } // namespace webrtc | 1048 } // namespace webrtc |
OLD | NEW |