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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
194 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; | 194 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; |
195 builders_[kRtcpBye] = &RTCPSender::BuildBYE; | 195 builders_[kRtcpBye] = &RTCPSender::BuildBYE; |
196 builders_[kRtcpApp] = &RTCPSender::BuildAPP; | 196 builders_[kRtcpApp] = &RTCPSender::BuildAPP; |
197 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; | 197 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; |
198 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; | 198 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; |
199 builders_[kRtcpNack] = &RTCPSender::BuildNACK; | 199 builders_[kRtcpNack] = &RTCPSender::BuildNACK; |
200 builders_[kRtcpXrVoipMetric] = &RTCPSender::BuildVoIPMetric; | 200 builders_[kRtcpXrVoipMetric] = &RTCPSender::BuildVoIPMetric; |
201 builders_[kRtcpXrReceiverReferenceTime] = | 201 builders_[kRtcpXrReceiverReferenceTime] = |
202 &RTCPSender::BuildReceiverReferenceTime; | 202 &RTCPSender::BuildReceiverReferenceTime; |
203 builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr; | 203 builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr; |
204 builders_[kRtcpTargetBitrate] = &RTCPSender::BuildTargetBitrate; | |
204 } | 205 } |
205 | 206 |
206 RTCPSender::~RTCPSender() {} | 207 RTCPSender::~RTCPSender() {} |
207 | 208 |
208 RtcpMode RTCPSender::Status() const { | 209 RtcpMode RTCPSender::Status() const { |
209 rtc::CritScope lock(&critical_section_rtcp_sender_); | 210 rtc::CritScope lock(&critical_section_rtcp_sender_); |
210 return method_; | 211 return method_; |
211 } | 212 } |
212 | 213 |
213 void RTCPSender::SetRTCPStatus(RtcpMode new_method) { | 214 void RTCPSender::SetRTCPStatus(RtcpMode new_method) { |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildDlrr( | 712 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildDlrr( |
712 const RtcpContext& ctx) { | 713 const RtcpContext& ctx) { |
713 rtcp::ExtendedReports* xr = new rtcp::ExtendedReports(); | 714 rtcp::ExtendedReports* xr = new rtcp::ExtendedReports(); |
714 xr->SetSenderSsrc(ssrc_); | 715 xr->SetSenderSsrc(ssrc_); |
715 RTC_DCHECK(ctx.feedback_state_.has_last_xr_rr); | 716 RTC_DCHECK(ctx.feedback_state_.has_last_xr_rr); |
716 xr->AddDlrrItem(ctx.feedback_state_.last_xr_rr); | 717 xr->AddDlrrItem(ctx.feedback_state_.last_xr_rr); |
717 | 718 |
718 return std::unique_ptr<rtcp::RtcpPacket>(xr); | 719 return std::unique_ptr<rtcp::RtcpPacket>(xr); |
719 } | 720 } |
720 | 721 |
722 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTargetBitrate( | |
723 const RtcpContext& ctx) { | |
724 RTC_DCHECK(video_bitrate_allocation_); | |
725 | |
726 // TODO(sprang): DLRR and TargetBitrate should be sent in the same XR, if | |
727 // possible. | |
728 std::unique_ptr<rtcp::ExtendedReports> xr(new rtcp::ExtendedReports()); | |
729 xr->SetSenderSsrc(ssrc_); | |
730 rtcp::TargetBitrate target_bitrate; | |
731 | |
732 for (int sl = 0; sl < kMaxSpatialLayers; ++sl) { | |
733 for (int tl = 0; tl < kMaxTemporalStreams; ++tl) { | |
734 uint32_t layer_bitrate_bps = | |
735 video_bitrate_allocation_->GetBitrate(sl, tl); | |
736 if (layer_bitrate_bps > 0) | |
737 target_bitrate.AddTargetBitrate(sl, tl, layer_bitrate_bps / 1000); | |
738 } | |
739 } | |
740 | |
741 xr->SetTargetBitrate(target_bitrate); | |
742 video_bitrate_allocation_.reset(); | |
743 return std::unique_ptr<rtcp::RtcpPacket>(std::move(xr)); | |
danilchap
2016/11/29 13:13:14
return std::move(xr); should work,
no need for ex
sprang_webrtc
2016/11/29 13:34:54
Done.
| |
744 } | |
745 | |
721 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildVoIPMetric( | 746 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildVoIPMetric( |
722 const RtcpContext& context) { | 747 const RtcpContext& context) { |
723 rtcp::ExtendedReports* xr = new rtcp::ExtendedReports(); | 748 rtcp::ExtendedReports* xr = new rtcp::ExtendedReports(); |
724 xr->SetSenderSsrc(ssrc_); | 749 xr->SetSenderSsrc(ssrc_); |
725 | 750 |
726 rtcp::VoipMetric voip; | 751 rtcp::VoipMetric voip; |
727 voip.SetMediaSsrc(remote_ssrc_); | 752 voip.SetMediaSsrc(remote_ssrc_); |
728 voip.SetVoipMetric(xr_voip_metric_); | 753 voip.SetVoipMetric(xr_voip_metric_); |
729 | 754 |
730 xr->SetVoipMetric(voip); | 755 xr->SetVoipMetric(voip); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
846 } | 871 } |
847 | 872 |
848 if (IsFlagPresent(kRtcpSr) || (IsFlagPresent(kRtcpRr) && !cname_.empty())) | 873 if (IsFlagPresent(kRtcpSr) || (IsFlagPresent(kRtcpRr) && !cname_.empty())) |
849 SetFlag(kRtcpSdes, true); | 874 SetFlag(kRtcpSdes, true); |
850 | 875 |
851 if (generate_report) { | 876 if (generate_report) { |
852 if (!sending_ && xr_send_receiver_reference_time_enabled_) | 877 if (!sending_ && xr_send_receiver_reference_time_enabled_) |
853 SetFlag(kRtcpXrReceiverReferenceTime, true); | 878 SetFlag(kRtcpXrReceiverReferenceTime, true); |
854 if (feedback_state.has_last_xr_rr) | 879 if (feedback_state.has_last_xr_rr) |
855 SetFlag(kRtcpXrDlrrReportBlock, true); | 880 SetFlag(kRtcpXrDlrrReportBlock, true); |
881 if (video_bitrate_allocation_) | |
882 SetFlag(kRtcpTargetBitrate, true); | |
856 | 883 |
857 // generate next time to send an RTCP report | 884 // generate next time to send an RTCP report |
858 uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS; | 885 uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS; |
859 | 886 |
860 if (!audio_) { | 887 if (!audio_) { |
861 if (sending_) { | 888 if (sending_) { |
862 // Calculate bandwidth for video; 360 / send bandwidth in kbit/s. | 889 // Calculate bandwidth for video; 360 / send bandwidth in kbit/s. |
863 uint32_t send_bitrate_kbit = feedback_state.send_bitrate / 1000; | 890 uint32_t send_bitrate_kbit = feedback_state.send_bitrate / 1000; |
864 if (send_bitrate_kbit != 0) | 891 if (send_bitrate_kbit != 0) |
865 minIntervalMs = 360000 / send_bitrate_kbit; | 892 minIntervalMs = 360000 / send_bitrate_kbit; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1005 } | 1032 } |
1006 | 1033 |
1007 bool RTCPSender::AllVolatileFlagsConsumed() const { | 1034 bool RTCPSender::AllVolatileFlagsConsumed() const { |
1008 for (const ReportFlag& flag : report_flags_) { | 1035 for (const ReportFlag& flag : report_flags_) { |
1009 if (flag.is_volatile) | 1036 if (flag.is_volatile) |
1010 return false; | 1037 return false; |
1011 } | 1038 } |
1012 return true; | 1039 return true; |
1013 } | 1040 } |
1014 | 1041 |
1042 void RTCPSender::SetVideoBitrateAllocation(const BitrateAllocation& bitrate) { | |
1043 rtc::CritScope lock(&critical_section_rtcp_sender_); | |
1044 video_bitrate_allocation_.emplace(bitrate); | |
1045 } | |
1046 | |
1015 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { | 1047 bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { |
1016 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { | 1048 class Sender : public rtcp::RtcpPacket::PacketReadyCallback { |
1017 public: | 1049 public: |
1018 Sender(Transport* transport, RtcEventLog* event_log) | 1050 Sender(Transport* transport, RtcEventLog* event_log) |
1019 : transport_(transport), event_log_(event_log), send_failure_(false) {} | 1051 : transport_(transport), event_log_(event_log), send_failure_(false) {} |
1020 | 1052 |
1021 void OnPacketReady(uint8_t* data, size_t length) override { | 1053 void OnPacketReady(uint8_t* data, size_t length) override { |
1022 if (transport_->SendRtcp(data, length)) { | 1054 if (transport_->SendRtcp(data, length)) { |
1023 if (event_log_) { | 1055 if (event_log_) { |
1024 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, | 1056 event_log_->LogRtcpPacket(kOutgoingPacket, MediaType::ANY, data, |
(...skipping 12 matching lines...) Expand all Loading... | |
1037 // but we can't because of an incorrect warning (C4822) in MVS 2013. | 1069 // but we can't because of an incorrect warning (C4822) in MVS 2013. |
1038 } sender(transport_, event_log_); | 1070 } sender(transport_, event_log_); |
1039 | 1071 |
1040 RTC_DCHECK_LE(max_payload_length_, static_cast<size_t>(IP_PACKET_SIZE)); | 1072 RTC_DCHECK_LE(max_payload_length_, static_cast<size_t>(IP_PACKET_SIZE)); |
1041 uint8_t buffer[IP_PACKET_SIZE]; | 1073 uint8_t buffer[IP_PACKET_SIZE]; |
1042 return packet.BuildExternalBuffer(buffer, max_payload_length_, &sender) && | 1074 return packet.BuildExternalBuffer(buffer, max_payload_length_, &sender) && |
1043 !sender.send_failure_; | 1075 !sender.send_failure_; |
1044 } | 1076 } |
1045 | 1077 |
1046 } // namespace webrtc | 1078 } // namespace webrtc |
OLD | NEW |