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

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

Issue 2531383002: Wire up BitrateAllocation to be sent as RTCP TargetBitrate (Closed)
Patch Set: Addressed comments Created 4 years 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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698