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..6b95ac1c23520dbe41b6f8d44a34a2b61441b526 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() {} |
@@ -853,6 +854,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 +1015,33 @@ bool RTCPSender::AllVolatileFlagsConsumed() const { |
return true; |
} |
+std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTargetBitrate( |
danilchap
2016/11/29 10:39:31
move this methods to other Builders, after BuildDl
sprang_webrtc
2016/11/29 12:24:01
Done.
|
+ const RtcpContext& ctx) { |
+ RTC_DCHECK(video_bitrate_allocation_); |
+ |
danilchap
2016/11/29 10:39:31
It became more important now to merge different XR
sprang_webrtc
2016/11/29 12:24:01
Agree. I actually had a todo about that here but r
|
+ 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_ = rtc::Optional<BitrateAllocation>(); |
danilchap
2016/11/29 10:39:31
may be video_bitrate_allocation_.reset();
sprang_webrtc
2016/11/29 12:24:01
Done.
Nice, haven't seen that you added this and e
danilchap
2016/11/29 13:13:14
nope, nothing except cl https://codereview.webrtc.
|
+ return std::unique_ptr<rtcp::RtcpPacket>(xr.release()); |
danilchap
2016/11/29 10:39:31
return std::move(xr); should work
alternatively ma
sprang_webrtc
2016/11/29 12:24:01
Done.
|
+} |
+ |
+void RTCPSender::SetVideoBitrateAllocation(const BitrateAllocation& bitrate) { |
+ rtc::CritScope lock(&critical_section_rtcp_sender_); |
+ video_bitrate_allocation_ = rtc::Optional<BitrateAllocation>(bitrate); |
danilchap
2016/11/29 10:39:31
video_bitrate_allocation_.emplace(bitrate); will w
sprang_webrtc
2016/11/29 12:24:01
Done.
|
+} |
+ |
bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) { |
class Sender : public rtcp::RtcpPacket::PacketReadyCallback { |
public: |