Chromium Code Reviews| 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: |