Split FlexFEC field trial in two.

- The "flexfec-03" codec is advertised in the SDP whenever the
  "WebRTC-FlexFEC-03-Advertised" field trial is enabled.
- Sending FlexFEC packets is enabled whenever the "flexfec-03" codec is
  negotiated, and the "WebRTC-FlexFEC-03" field trial is enabled.

After this CL, the number of calls to
WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec during renegotiation
will be reduced for cases when only one endpoint has the "WebRTC-FlexFEC-03"
field trial enabled.

BUG=webrtc:5654

Review-Url: https://codereview.webrtc.org/2716733005
Cr-Commit-Position: refs/heads/master@{#16925}
This commit is contained in:
brandtr
2017-02-28 15:43:10 -08:00
committed by Commit bot
parent 2892244801
commit 340e3fd59f
5 changed files with 24 additions and 20 deletions

View File

@ -21,10 +21,13 @@ namespace cricket {
namespace { namespace {
const char kFlexfecFieldTrialName[] = "WebRTC-FlexFEC-03"; // If this field trial is enabled, the "flexfec-03" codec will be advertised
// as being supported by the InternalEncoderFactory. This means that
bool IsFlexfecFieldTrialEnabled() { // "flexfec-03" will appear in the default local SDP, and we therefore need to
return webrtc::field_trial::IsEnabled(kFlexfecFieldTrialName); // be ready to receive FlexFEC packets from the remote.
bool IsFlexfecAdvertisedFieldTrialEnabled() {
return webrtc::field_trial::FindFullName("WebRTC-FlexFEC-03-Advertised") ==
"Enabled";
} }
} // namespace } // namespace
@ -46,7 +49,7 @@ InternalEncoderFactory::InternalEncoderFactory() {
supported_codecs_.push_back(cricket::VideoCodec(kRedCodecName)); supported_codecs_.push_back(cricket::VideoCodec(kRedCodecName));
supported_codecs_.push_back(cricket::VideoCodec(kUlpfecCodecName)); supported_codecs_.push_back(cricket::VideoCodec(kUlpfecCodecName));
if (IsFlexfecFieldTrialEnabled()) { if (IsFlexfecAdvertisedFieldTrialEnabled()) {
cricket::VideoCodec flexfec_codec(kFlexfecCodecName); cricket::VideoCodec flexfec_codec(kFlexfecCodecName);
// This value is currently arbitrarily set to 10 seconds. (The unit // This value is currently arbitrarily set to 10 seconds. (The unit
// is microseconds.) This parameter MUST be present in the SDP, but // is microseconds.) This parameter MUST be present in the SDP, but

View File

@ -41,16 +41,11 @@
namespace cricket { namespace cricket {
namespace { namespace {
// Three things happen when the FlexFEC field trial is enabled: // If this field trial is enabled, we will enable sending FlexFEC and disable
// 1) FlexFEC is exposed in the default codec list, eventually showing up // sending ULPFEC whenever the former has been negotiated. Receiving FlexFEC
// in the default SDP. (See InternalEncoderFactory ctor.) // is enabled whenever FlexFEC has been negotiated.
// 2) FlexFEC send parameters are set in the VideoSendStream config.
// 3) FlexFEC receive parameters are set in the FlexfecReceiveStream config,
// and the corresponding object is instantiated.
const char kFlexfecFieldTrialName[] = "WebRTC-FlexFEC-03";
bool IsFlexfecFieldTrialEnabled() { bool IsFlexfecFieldTrialEnabled() {
return webrtc::field_trial::IsEnabled(kFlexfecFieldTrialName); return webrtc::field_trial::FindFullName("WebRTC-FlexFEC-03") == "Enabled";
} }
// Wrap cricket::WebRtcVideoEncoderFactory as a webrtc::VideoEncoderFactory. // Wrap cricket::WebRtcVideoEncoderFactory as a webrtc::VideoEncoderFactory.
@ -1556,7 +1551,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
&parameters_.config.rtp.rtx.ssrcs); &parameters_.config.rtp.rtx.ssrcs);
// FlexFEC. // FlexFEC SSRCs.
// TODO(brandtr): This code needs to be generalized when we add support for // TODO(brandtr): This code needs to be generalized when we add support for
// multistream protection. // multistream protection.
if (IsFlexfecFieldTrialEnabled()) { if (IsFlexfecFieldTrialEnabled()) {
@ -1731,8 +1726,10 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
parameters_.config.encoder_settings.internal_source = false; parameters_.config.encoder_settings.internal_source = false;
} }
parameters_.config.rtp.ulpfec = codec_settings.ulpfec; parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
parameters_.config.rtp.flexfec.payload_type = if (IsFlexfecFieldTrialEnabled()) {
codec_settings.flexfec_payload_type; parameters_.config.rtp.flexfec.payload_type =
codec_settings.flexfec_payload_type;
}
// Set RTX payload type if RTX is enabled. // Set RTX payload type if RTX is enabled.
if (!parameters_.config.rtp.rtx.ssrcs.empty()) { if (!parameters_.config.rtp.rtx.ssrcs.empty()) {
@ -2313,7 +2310,7 @@ void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RecreateWebRtcStream() {
call_->DestroyFlexfecReceiveStream(flexfec_stream_); call_->DestroyFlexfecReceiveStream(flexfec_stream_);
flexfec_stream_ = nullptr; flexfec_stream_ = nullptr;
} }
if (IsFlexfecFieldTrialEnabled() && flexfec_config_.IsCompleteAndEnabled()) { if (flexfec_config_.IsCompleteAndEnabled()) {
flexfec_stream_ = call_->CreateFlexfecReceiveStream(flexfec_config_); flexfec_stream_ = call_->CreateFlexfecReceiveStream(flexfec_config_);
flexfec_stream_->Start(); flexfec_stream_->Start();
} }

View File

@ -781,7 +781,7 @@ TEST_F(WebRtcVideoEngine2Test,
// FlexFEC is active with field trial. // FlexFEC is active with field trial.
webrtc::test::ScopedFieldTrials override_field_trials_( webrtc::test::ScopedFieldTrials override_field_trials_(
"WebRTC-FlexFEC-03/Enabled/"); "WebRTC-FlexFEC-03-Advertised/Enabled/");
const std::vector<VideoCodec> codecs_after = engine_.codecs(); const std::vector<VideoCodec> codecs_after = engine_.codecs();
EXPECT_NE(codecs_after.end(), EXPECT_NE(codecs_after.end(),
std::find_if(codecs_after.begin(), codecs_after.end(), is_flexfec)); std::find_if(codecs_after.begin(), codecs_after.end(), is_flexfec));
@ -2400,7 +2400,9 @@ TEST_F(WebRtcVideoChannel2Test, FlexfecCodecWithSsrcNotExposedByDefault) {
class WebRtcVideoChannel2FlexfecTest : public WebRtcVideoChannel2Test { class WebRtcVideoChannel2FlexfecTest : public WebRtcVideoChannel2Test {
public: public:
WebRtcVideoChannel2FlexfecTest() WebRtcVideoChannel2FlexfecTest()
: WebRtcVideoChannel2Test("WebRTC-FlexFEC-03/Enabled/") {} : WebRtcVideoChannel2Test(
"WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/") {
}
}; };
// TODO(brandtr): Merge into "non-field trial" test when FlexFEC is enabled // TODO(brandtr): Merge into "non-field trial" test when FlexFEC is enabled

View File

@ -18,6 +18,7 @@
NSString * const kRTCFieldTrialAudioSendSideBweKey = @"WebRTC-Audio-SendSideBwe"; NSString * const kRTCFieldTrialAudioSendSideBweKey = @"WebRTC-Audio-SendSideBwe";
NSString * const kRTCFieldTrialSendSideBweWithOverheadKey = @"WebRTC-SendSideBwe-WithOverhead"; NSString * const kRTCFieldTrialSendSideBweWithOverheadKey = @"WebRTC-SendSideBwe-WithOverhead";
NSString * const kRTCFieldTrialFlexFec03AdvertisedKey = @"WebRTC-FlexFEC-03-Advertised";
NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03"; NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03";
NSString * const kRTCFieldTrialImprovedBitrateEstimateKey = @"WebRTC-ImprovedBitrateEstimate"; NSString * const kRTCFieldTrialImprovedBitrateEstimateKey = @"WebRTC-ImprovedBitrateEstimate";
NSString * const kRTCFieldTrialMedianSlopeFilterKey = @"WebRTC-BweMedianSlopeFilter"; NSString * const kRTCFieldTrialMedianSlopeFilterKey = @"WebRTC-BweMedianSlopeFilter";

View File

@ -15,6 +15,7 @@
/** The only valid value for the following if set is kRTCFieldTrialEnabledValue. */ /** The only valid value for the following if set is kRTCFieldTrialEnabledValue. */
RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweKey; RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweKey;
RTC_EXTERN NSString * const kRTCFieldTrialSendSideBweWithOverheadKey; RTC_EXTERN NSString * const kRTCFieldTrialSendSideBweWithOverheadKey;
RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03AdvertisedKey;
RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03Key; RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03Key;
RTC_EXTERN NSString * const kRTCFieldTrialImprovedBitrateEstimateKey; RTC_EXTERN NSString * const kRTCFieldTrialImprovedBitrateEstimateKey;
RTC_EXTERN NSString * const kRTCFieldTrialH264HighProfileKey; RTC_EXTERN NSString * const kRTCFieldTrialH264HighProfileKey;