Index: webrtc/media/engine/webrtcvideoengine2.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc |
index 2465aab77801bace77d0fccaf04b492d153306b3..4980153490860bcf26117be084fd8800c682508f 100644 |
--- a/webrtc/media/engine/webrtcvideoengine2.cc |
+++ b/webrtc/media/engine/webrtcvideoengine2.cc |
@@ -43,14 +43,18 @@ using DegradationPreference = webrtc::VideoSendStream::DegradationPreference; |
namespace cricket { |
namespace { |
// If this field trial is enabled, we will enable sending FlexFEC and disable |
-// sending ULPFEC whenever the former has been negotiated. |
-// FlexFEC can only be negotiated when the "flexfec-03" SDP codec is enabled, |
-// which is done by enabling the "WebRTC-FlexFEC-03-Advertised" field trial; see |
-// internalencoderfactory.cc. |
+// sending ULPFEC whenever the former has been negotiated in the SDPs. |
bool IsFlexfecFieldTrialEnabled() { |
return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03"); |
} |
+// If this field trial is enabled, the "flexfec-03" codec may have been |
+// advertised as being supported in the local SDP. That means that we must be |
+// ready to receive FlexFEC packets. See internalencoderfactory.cc. |
+bool IsFlexfecAdvertisedFieldTrialEnabled() { |
+ return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03-Advertised"); |
+} |
+ |
// If this field trial is enabled, we will report VideoContentType RTP extension |
// in capabilities (thus, it will end up in the default SDP and extension will |
// be sent for all key-frames). |
@@ -705,7 +709,7 @@ bool WebRtcVideoChannel2::GetChangedSendParameters( |
} |
// Select one of the remote codecs that will be used as send codec. |
- const rtc::Optional<VideoCodecSettings> selected_send_codec = |
+ rtc::Optional<VideoCodecSettings> selected_send_codec = |
SelectSendVideoCodec(MapCodecs(params.codecs)); |
if (!selected_send_codec) { |
@@ -713,6 +717,15 @@ bool WebRtcVideoChannel2::GetChangedSendParameters( |
return false; |
} |
+ // Never enable sending FlexFEC, unless we are in the experiment. |
+ if (!IsFlexfecFieldTrialEnabled()) { |
+ if (selected_send_codec->flexfec_payload_type != -1) { |
+ LOG(LS_INFO) << "Remote supports flexfec-03, but we will not send since " |
+ << "WebRTC-FlexFEC-03 field trial is not enabled."; |
+ } |
+ selected_send_codec->flexfec_payload_type = -1; |
+ } |
+ |
if (!send_codec_ || *selected_send_codec != *send_codec_) |
changed_params->codec = selected_send_codec; |
@@ -1270,7 +1283,8 @@ void WebRtcVideoChannel2::ConfigureReceiverRtp( |
config->rtp.extensions = recv_rtp_extensions_; |
// TODO(brandtr): Generalize when we add support for multistream protection. |
- if (sp.GetFecFrSsrc(ssrc, &flexfec_config->remote_ssrc)) { |
+ if (IsFlexfecAdvertisedFieldTrialEnabled() && |
+ sp.GetFecFrSsrc(ssrc, &flexfec_config->remote_ssrc)) { |
flexfec_config->protected_media_ssrcs = {ssrc}; |
flexfec_config->local_ssrc = config->rtp.local_ssrc; |
flexfec_config->rtcp_mode = config->rtp.rtcp_mode; |
@@ -1606,7 +1620,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( |
for (uint32_t primary_ssrc : parameters_.config.rtp.ssrcs) { |
if (sp.GetFecFrSsrc(primary_ssrc, &flexfec_ssrc)) { |
if (flexfec_enabled) { |
- LOG(LS_INFO) << "Multiple FlexFEC streams proposed by remote, but " |
+ LOG(LS_INFO) << "Multiple FlexFEC streams in local SDP, but " |
"our implementation only supports a single FlexFEC " |
"stream. Will not enable FlexFEC for proposed " |
"stream with SSRC: " |
@@ -1781,10 +1795,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( |
parameters_.config.encoder_settings.internal_source = false; |
} |
parameters_.config.rtp.ulpfec = codec_settings.ulpfec; |
- if (IsFlexfecFieldTrialEnabled()) { |
- parameters_.config.rtp.flexfec.payload_type = |
- codec_settings.flexfec_payload_type; |
- } |
+ parameters_.config.rtp.flexfec.payload_type = |
+ codec_settings.flexfec_payload_type; |
// Set RTX payload type if RTX is enabled. |
if (!parameters_.config.rtp.rtx.ssrcs.empty()) { |