Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtcp_sender.cc

Issue 2531383002: Wire up BitrateAllocation to be sent as RTCP TargetBitrate (Closed)
Patch Set: Undo crit removal Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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:
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtcp_sender.h ('k') | webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698