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..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: |