Index: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc |
index dd19bb2fc798a3cb8fbad0ae6a17c61f8b493520..2450a43d483cc4cf64ad5eb0b04334830b778be2 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc |
@@ -50,9 +50,8 @@ RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSender* rtp_sender) |
video_type_(kRtpVideoGeneric), |
retransmission_settings_(kRetransmitBaseLayer), |
last_rotation_(kVideoRotation_0), |
- fec_enabled_(false), |
red_payload_type_(-1), |
- fec_payload_type_(-1), |
+ ulpfec_payload_type_(-1), |
delta_fec_params_{0, 1, kFecMaskRandom}, |
key_fec_params_{0, 1, kFecMaskRandom}, |
fec_bitrate_(1000, RateStatistics::kBpsScale), |
@@ -139,7 +138,7 @@ void RTPSenderVideo::SendVideoPacketAsRed( |
uint16_t first_fec_sequence_number = |
rtp_sender_->AllocateSequenceNumber(num_fec_packets); |
fec_packets = ulpfec_generator_.GetUlpfecPacketsAsRed( |
- red_payload_type_, fec_payload_type_, first_fec_sequence_number, |
+ red_payload_type_, ulpfec_payload_type_, first_fec_sequence_number, |
media_packet->headers_size()); |
RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); |
if (retransmission_settings_ & kRetransmitFECPackets) |
@@ -179,36 +178,42 @@ void RTPSenderVideo::SendVideoPacketAsRed( |
} |
} |
-void RTPSenderVideo::SetUlpfecConfig(bool enabled, |
- int red_payload_type, |
+void RTPSenderVideo::SetUlpfecConfig(int red_payload_type, |
int ulpfec_payload_type) { |
- RTC_DCHECK(!enabled || red_payload_type > 0); |
+ // Sanity check. Per the definition of UlpfecConfig (see config.h), |
+ // a payload type of -1 means that the corresponding feature is |
+ // turned off. |
+ RTC_DCHECK_GE(red_payload_type, -1); |
RTC_DCHECK_LE(red_payload_type, 127); |
+ RTC_DCHECK_GE(ulpfec_payload_type, -1); |
RTC_DCHECK_LE(ulpfec_payload_type, 127); |
rtc::CritScope cs(&crit_); |
- fec_enabled_ = enabled; |
red_payload_type_ = red_payload_type; |
- fec_payload_type_ = ulpfec_payload_type; |
+ ulpfec_payload_type_ = ulpfec_payload_type; |
+ |
+ // Must not enable ULPFEC without RED. |
+ // TODO(brandtr): We currently support enabling RED without ULPFEC. Change |
+ // this when we have removed the RED/RTX send-side workaround, so that we |
+ // ensure that RED and ULPFEC are only enabled together. |
+ RTC_DCHECK(red_enabled() || !ulpfec_enabled()); |
// Reset FEC rates. |
delta_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; |
key_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom}; |
} |
-void RTPSenderVideo::GetUlpfecConfig(bool* enabled, |
- int* red_payload_type, |
+void RTPSenderVideo::GetUlpfecConfig(int* red_payload_type, |
int* ulpfec_payload_type) const { |
rtc::CritScope cs(&crit_); |
- *enabled = fec_enabled_; |
*red_payload_type = red_payload_type_; |
- *ulpfec_payload_type = fec_payload_type_; |
+ *ulpfec_payload_type = ulpfec_payload_type_; |
} |
size_t RTPSenderVideo::FecPacketOverhead() const { |
rtc::CritScope cs(&crit_); |
size_t overhead = 0; |
- if (red_payload_type_ != -1) { |
+ if (red_enabled()) { |
// Overhead is FEC headers plus RED for FEC header plus anything in RTP |
// header beyond the 12 bytes base header (CSRC list, extensions...) |
// This reason for the header extensions to be included here is that |
@@ -217,7 +222,7 @@ size_t RTPSenderVideo::FecPacketOverhead() const { |
return ulpfec_generator_.MaxPacketOverhead() + kRedForFecHeaderLength + |
(rtp_sender_->RtpHeaderLength() - kRtpHeaderSize); |
} |
- if (fec_enabled_) |
+ if (ulpfec_enabled()) |
overhead += ulpfec_generator_.MaxPacketOverhead(); |
return overhead; |
} |
@@ -227,7 +232,7 @@ void RTPSenderVideo::SetFecParameters(const FecProtectionParams* delta_params, |
rtc::CritScope cs(&crit_); |
RTC_DCHECK(delta_params); |
RTC_DCHECK(key_params); |
- if (fec_enabled_) { |
+ if (ulpfec_enabled()) { |
delta_fec_params_ = *delta_params; |
key_fec_params_ = *key_params; |
} |
@@ -283,7 +288,7 @@ bool RTPSenderVideo::SendVideo(RtpVideoCodecTypes video_type, |
video_header ? &(video_header->codecHeader) : nullptr, frame_type)); |
StorageType storage; |
- int red_payload_type; |
+ bool red_enabled; |
bool first_frame = first_frame_sent_(); |
{ |
rtc::CritScope cs(&crit_); |
@@ -291,7 +296,7 @@ bool RTPSenderVideo::SendVideo(RtpVideoCodecTypes video_type, |
frame_type == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; |
ulpfec_generator_.SetFecParameters(fec_params); |
storage = packetizer->GetStorageType(retransmission_settings_); |
- red_payload_type = red_payload_type_; |
+ red_enabled = this->red_enabled(); |
} |
// TODO(changbin): we currently don't support to configure the codec to |
@@ -318,7 +323,7 @@ bool RTPSenderVideo::SendVideo(RtpVideoCodecTypes video_type, |
if (!rtp_sender_->AssignSequenceNumber(packet.get())) |
return false; |
- if (red_payload_type != -1) { |
+ if (red_enabled) { |
SendVideoPacketAsRed(std::move(packet), storage, |
packetizer->GetProtectionType() == kProtectedPacket); |
} else { |