From 4cd6221127fb5c1c7719be01162af1ed37d09d90 Mon Sep 17 00:00:00 2001 From: tkchin Date: Thu, 15 Dec 2016 13:17:54 -0800 Subject: [PATCH] iOS: Add trendline filter to field trials. NOTRY=True BUG=webrtc:6902 Review-Url: https://codereview.webrtc.org/2583643002 Cr-Commit-Position: refs/heads/master@{#15643} --- .../objc/AppRTCMobile/ios/ARDAppDelegate.m | 5 ++- .../objc/Framework/Classes/RTCFieldTrials.mm | 37 +++++++++++-------- .../Framework/Headers/WebRTC/RTCFieldTrials.h | 25 +++++++++---- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m b/webrtc/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m index 6081d60c69..31f9fcd03a 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m +++ b/webrtc/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m @@ -25,7 +25,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - RTCInitFieldTrials(RTCFieldTrialOptionsImprovedBitrateEstimate); + NSDictionary *fieldTrials = @{ + kRTCFieldTrialImprovedBitrateEstimateKey: kRTCFieldTrialEnabledValue, + }; + RTCInitFieldTrialDictionary(fieldTrials); RTCInitializeSSL(); RTCSetupInternalTracer(); _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; diff --git a/webrtc/sdk/objc/Framework/Classes/RTCFieldTrials.mm b/webrtc/sdk/objc/Framework/Classes/RTCFieldTrials.mm index 3057a17aed..224f7fd595 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCFieldTrials.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCFieldTrials.mm @@ -16,24 +16,31 @@ #include "webrtc/system_wrappers/include/field_trial_default.h" -static NSString * const kRTCEnableImprovedBitrateEstimateString = - @"WebRTC-ImprovedBitrateEstimate/Enabled/"; -static NSString * const kRTCEnableAudioSendSideBweString = - @"WebRTC-Audio-SendSideBwe/Enabled/"; -static NSString * const kRTCEnableFlexFec03String = - @"WebRTC-FlexFEC-03/Enabled/"; +NSString * const kRTCFieldTrialAudioSendSideBweKey = @"WebRTC-Audio-SendSideBwe"; +NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03"; +NSString * const kRTCFieldTrialImprovedBitrateEstimateKey = @"WebRTC-ImprovedBitrateEstimate"; +NSString * const kRTCFieldTrialTrendlineFilterKey = @"WebRTC-BweTrendlineFilter"; +NSString * const kRTCFieldTrialEnabledValue = @"Enabled"; + static std::unique_ptr gFieldTrialInitString; -void RTCInitFieldTrials(RTCFieldTrialOptions options) { +NSString *RTCFieldTrialTrendlineFilterValue( + size_t windowSize, double smoothingCoeff, double thresholdGain) { + NSString *format = @"Enabled-%zu,%lf,%lf"; + return [NSString stringWithFormat:format, windowSize, smoothingCoeff, thresholdGain]; +} + +void RTCInitFieldTrialDictionary(NSDictionary *fieldTrials) { + if (!fieldTrials) { + RTCLogWarning(@"No fieldTrials provided."); + return; + } + // Assemble the keys and values into the field trial string. + // We don't perform any extra format checking. That should be done by the underlying WebRTC calls. NSMutableString *fieldTrialInitString = [NSMutableString string]; - if (options & RTCFieldTrialOptionsImprovedBitrateEstimate) { - [fieldTrialInitString appendString:kRTCEnableImprovedBitrateEstimateString]; - } - if (options & RTCFieldTrialOptionsAudioSendSideBwe) { - [fieldTrialInitString appendString:kRTCEnableAudioSendSideBweString]; - } - if (options & RTCFieldTrialOptionsFlexFec03) { - [fieldTrialInitString appendString:kRTCEnableFlexFec03String]; + for (NSString *key in fieldTrials) { + NSString *fieldTrialEntry = [NSString stringWithFormat:@"%@/%@/", key, fieldTrials[key]]; + [fieldTrialInitString appendString:fieldTrialEntry]; } size_t len = fieldTrialInitString.length + 1; gFieldTrialInitString.reset(new char[len]); diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h index 504ff7a885..ee997888c1 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h @@ -12,14 +12,23 @@ #import -typedef NS_OPTIONS(NSUInteger, RTCFieldTrialOptions) { - RTCFieldTrialOptionsNone = 0, - RTCFieldTrialOptionsImprovedBitrateEstimate = 1 << 0, - RTCFieldTrialOptionsAudioSendSideBwe = 1 << 1, - RTCFieldTrialOptionsFlexFec03 = 1 << 2, -}; +/** The only valid value for the following if set is kRTCFieldTrialEnabledValue. */ +RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweKey; +RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03Key; +RTC_EXTERN NSString * const kRTCFieldTrialImprovedBitrateEstimateKey; -/** Must be called before any other call into WebRTC. See: +/** The valid value for field trials above. */ +RTC_EXTERN NSString * const kRTCFieldTrialEnabledValue; + +/** Use a string returned by RTCFieldTrialTrendlineFilterValue as the value. */ +RTC_EXTERN NSString * const kRTCFieldTrialTrendlineFilterKey; +/** Returns a valid value for kRTCFieldTrialTrendlineFilterKey. */ +RTC_EXTERN NSString *RTCFieldTrialTrendlineFilterValue( + size_t windowSize, double smoothingCoeff, double thresholdGain); + +/** Initialize field trials using a dictionary mapping field trial keys to their values. See above + * for valid keys and values. + * Must be called before any other call into WebRTC. See: * webrtc/system_wrappers/include/field_trial_default.h */ -RTC_EXTERN void RTCInitFieldTrials(RTCFieldTrialOptions options); +RTC_EXTERN void RTCInitFieldTrialDictionary(NSDictionary *fieldTrials);