| 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 2f4d393b83061b49327c9a6364791839199151b1..b30f46c56cd1f9b0183126fe8c79160a78a6067d 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
|
| @@ -42,6 +42,12 @@
|
|
|
| namespace webrtc {
|
|
|
| +namespace {
|
| +const uint32_t kRtcpAnyExtendedReports =
|
| + kRtcpXrVoipMetric | kRtcpXrReceiverReferenceTime | kRtcpXrDlrrReportBlock |
|
| + kRtcpXrTargetBitrate;
|
| +}
|
| +
|
| NACKStringBuilder::NACKStringBuilder()
|
| : stream_(""), count_(0), prevNack_(0), consecutive_(false) {}
|
|
|
| @@ -197,10 +203,7 @@ RTCPSender::RTCPSender(
|
| builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR;
|
| builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN;
|
| builders_[kRtcpNack] = &RTCPSender::BuildNACK;
|
| - builders_[kRtcpXrVoipMetric] = &RTCPSender::BuildVoIPMetric;
|
| - builders_[kRtcpXrReceiverReferenceTime] =
|
| - &RTCPSender::BuildReceiverReferenceTime;
|
| - builders_[kRtcpXrDlrrReportBlock] = &RTCPSender::BuildDlrr;
|
| + builders_[kRtcpAnyExtendedReports] = &RTCPSender::BuildExtendedReports;
|
| }
|
|
|
| RTCPSender::~RTCPSender() {}
|
| @@ -692,44 +695,47 @@ std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildBYE(const RtcpContext& ctx) {
|
| return std::unique_ptr<rtcp::RtcpPacket>(bye);
|
| }
|
|
|
| -std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildReceiverReferenceTime(
|
| +std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildExtendedReports(
|
| const RtcpContext& ctx) {
|
| -
|
| - rtcp::ExtendedReports* xr = new rtcp::ExtendedReports();
|
| + std::unique_ptr<rtcp::ExtendedReports> xr(new rtcp::ExtendedReports());
|
| xr->SetSenderSsrc(ssrc_);
|
|
|
| - rtcp::Rrtr rrtr;
|
| - rrtr.SetNtp(NtpTime(ctx.ntp_sec_, ctx.ntp_frac_));
|
| -
|
| - xr->SetRrtr(rrtr);
|
| -
|
| - // TODO(sprang): Merge XR report sending to contain all of RRTR, DLRR, VOIP?
|
| + if (!sending_ && xr_send_receiver_reference_time_enabled_) {
|
| + rtcp::Rrtr rrtr;
|
| + rrtr.SetNtp(NtpTime(ctx.ntp_sec_, ctx.ntp_frac_));
|
| + xr->SetRrtr(rrtr);
|
| + }
|
|
|
| - return std::unique_ptr<rtcp::RtcpPacket>(xr);
|
| -}
|
| + if (ctx.feedback_state_.has_last_xr_rr) {
|
| + xr->AddDlrrItem(ctx.feedback_state_.last_xr_rr);
|
| + }
|
|
|
| -std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildDlrr(
|
| - const RtcpContext& ctx) {
|
| - rtcp::ExtendedReports* xr = new rtcp::ExtendedReports();
|
| - xr->SetSenderSsrc(ssrc_);
|
| - RTC_DCHECK(ctx.feedback_state_.has_last_xr_rr);
|
| - xr->AddDlrrItem(ctx.feedback_state_.last_xr_rr);
|
| + if (video_bitrate_allocation_) {
|
| + rtcp::TargetBitrate target_bitrate;
|
|
|
| - return std::unique_ptr<rtcp::RtcpPacket>(xr);
|
| -}
|
| + 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);
|
| + }
|
| + }
|
|
|
| -std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildVoIPMetric(
|
| - const RtcpContext& context) {
|
| - rtcp::ExtendedReports* xr = new rtcp::ExtendedReports();
|
| - xr->SetSenderSsrc(ssrc_);
|
| + xr->SetTargetBitrate(target_bitrate);
|
| + video_bitrate_allocation_.reset();
|
| + }
|
|
|
| - rtcp::VoipMetric voip;
|
| - voip.SetMediaSsrc(remote_ssrc_);
|
| - voip.SetVoipMetric(xr_voip_metric_);
|
| + if (xr_voip_metric_) {
|
| + rtcp::VoipMetric voip;
|
| + voip.SetMediaSsrc(remote_ssrc_);
|
| + voip.SetVoipMetric(*xr_voip_metric_);
|
| + xr_voip_metric_.reset();
|
|
|
| - xr->SetVoipMetric(voip);
|
| + xr->SetVoipMetric(voip);
|
| + }
|
|
|
| - return std::unique_ptr<rtcp::RtcpPacket>(xr);
|
| + return std::move(xr);
|
| }
|
|
|
| int32_t RTCPSender::SendRTCP(const FeedbackState& feedback_state,
|
| @@ -794,7 +800,8 @@ int32_t RTCPSender::SendCompoundRTCP(
|
| auto it = report_flags_.begin();
|
| while (it != report_flags_.end()) {
|
| auto builder_it = builders_.find(it->type);
|
| - RTC_DCHECK(builder_it != builders_.end());
|
| + RTC_DCHECK(builder_it != builders_.end())
|
| + << "Could not find builder for packet type " << it->type;
|
| if (it->is_volatile) {
|
| report_flags_.erase(it++);
|
| } else {
|
| @@ -849,10 +856,10 @@ void RTCPSender::PrepareReport(const FeedbackState& feedback_state) {
|
| SetFlag(kRtcpSdes, true);
|
|
|
| if (generate_report) {
|
| - if (!sending_ && xr_send_receiver_reference_time_enabled_)
|
| - SetFlag(kRtcpXrReceiverReferenceTime, true);
|
| - if (feedback_state.has_last_xr_rr)
|
| - SetFlag(kRtcpXrDlrrReportBlock, true);
|
| + if ((!sending_ && xr_send_receiver_reference_time_enabled_) ||
|
| + feedback_state.has_last_xr_rr || video_bitrate_allocation_) {
|
| + SetFlag(kRtcpAnyExtendedReports, true);
|
| + }
|
|
|
| // generate next time to send an RTCP report
|
| uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS;
|
| @@ -959,9 +966,9 @@ int32_t RTCPSender::SetApplicationSpecificData(uint8_t subType,
|
|
|
| int32_t RTCPSender::SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) {
|
| rtc::CritScope lock(&critical_section_rtcp_sender_);
|
| - memcpy(&xr_voip_metric_, VoIPMetric, sizeof(RTCPVoIPMetric));
|
| + xr_voip_metric_.emplace(*VoIPMetric);
|
|
|
| - SetFlag(kRtcpXrVoipMetric, true);
|
| + SetFlag(kRtcpAnyExtendedReports, true);
|
| return 0;
|
| }
|
|
|
| @@ -981,21 +988,26 @@ void RTCPSender::SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) {
|
| SetFlag(kRtcpTmmbn, true);
|
| }
|
|
|
| -void RTCPSender::SetFlag(RTCPPacketType type, bool is_volatile) {
|
| +void RTCPSender::SetFlag(uint32_t type, bool is_volatile) {
|
| report_flags_.insert(ReportFlag(type, is_volatile));
|
| }
|
|
|
| void RTCPSender::SetFlags(const std::set<RTCPPacketType>& types,
|
| bool is_volatile) {
|
| - for (RTCPPacketType type : types)
|
| - SetFlag(type, is_volatile);
|
| + for (RTCPPacketType type : types) {
|
| + if (type & kRtcpAnyExtendedReports) {
|
| + SetFlag(kRtcpAnyExtendedReports, is_volatile);
|
| + } else {
|
| + SetFlag(type, is_volatile);
|
| + }
|
| + }
|
| }
|
|
|
| -bool RTCPSender::IsFlagPresent(RTCPPacketType type) const {
|
| +bool RTCPSender::IsFlagPresent(uint32_t type) const {
|
| return report_flags_.find(ReportFlag(type, false)) != report_flags_.end();
|
| }
|
|
|
| -bool RTCPSender::ConsumeFlag(RTCPPacketType type, bool forced) {
|
| +bool RTCPSender::ConsumeFlag(uint32_t type, bool forced) {
|
| auto it = report_flags_.find(ReportFlag(type, false));
|
| if (it == report_flags_.end())
|
| return false;
|
| @@ -1012,6 +1024,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:
|
|
|