Index: webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
index e6cf6695226fcd803558ddf5b4f2b80aae8f2c7a..01c02b736b3733fdd6235a13295cf7797b7a39cc 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
@@ -201,6 +201,7 @@ RTCPSender::RTCPSender( |
builders_[kRtcpXrReceiverReferenceTime] = |
&RTCPSender::BuildReceiverReferenceTime; |
builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr; |
+ builders_[kRtcpTargetBitrate] = &RTCPSender::BuildTargetBitrate; |
} |
RTCPSender::~RTCPSender() {} |
@@ -718,6 +719,30 @@ std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildDlrr( |
return std::unique_ptr<rtcp::RtcpPacket>(xr); |
} |
+std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTargetBitrate( |
+ const RtcpContext& ctx) { |
+ RTC_DCHECK(video_bitrate_allocation_); |
+ |
+ // TODO(sprang): DLRR and TargetBitrate should be sent in the same XR, if |
+ // possible. |
+ std::unique_ptr<rtcp::ExtendedReports> xr(new rtcp::ExtendedReports()); |
+ xr->SetSenderSsrc(ssrc_); |
+ rtcp::TargetBitrate target_bitrate; |
+ |
+ for (int sl = 0; sl < kMaxSpatialLayers; ++sl) { |
+ for (int tl = 0; tl < kMaxTemporalStreams; ++tl) { |
+ uint32_t layer_bitrate_bps = |
+ video_bitrate_allocation_->GetBitrate(sl, tl); |
+ if (layer_bitrate_bps > 0) |
+ target_bitrate.AddTargetBitrate(sl, tl, layer_bitrate_bps / 1000); |
+ } |
+ } |
+ |
+ xr->SetTargetBitrate(target_bitrate); |
+ video_bitrate_allocation_.reset(); |
+ 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.
|
+} |
+ |
std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildVoIPMetric( |
const RtcpContext& context) { |
rtcp::ExtendedReports* xr = new rtcp::ExtendedReports(); |
@@ -853,6 +878,8 @@ void RTCPSender::PrepareReport(const FeedbackState& feedback_state) { |
SetFlag(kRtcpXrReceiverReferenceTime, true); |
if (feedback_state.has_last_xr_rr) |
SetFlag(kRtcpXrDlrrReportBlock, true); |
+ if (video_bitrate_allocation_) |
+ SetFlag(kRtcpTargetBitrate, true); |
// generate next time to send an RTCP report |
uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS; |
@@ -1012,6 +1039,11 @@ bool RTCPSender::AllVolatileFlagsConsumed() const { |
return true; |
} |
+void RTCPSender::SetVideoBitrateAllocation(const BitrateAllocation& bitrate) { |
+ rtc::CritScope lock(&critical_section_rtcp_sender_); |
+ video_bitrate_allocation_.emplace(bitrate); |
+} |
+ |
bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { |
class Sender : public rtcp::RtcpPacket::PacketReadyCallback { |
public: |