In logging.cc, use the pointer of the static variable so that it doesn't need a global constructor/exit time destructor. In RTCFieldTrials.mm, store the field trial string as a char pointer instead of a std::unique_ptr to ensure that it is never freed. LSAN will be unhappy with this fix, but WebRTC itself hasn't been tested with LSAN enabled, and any code changed in this CL does not build with build_with_chromium=true, so it shouldn't be a problem. Bug: webrtc:9693, webrtc:11665 Change-Id: Ia28e3534170e0817b815717f6efe862f7b51ef62 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237320 Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Artem Titov <titovartem@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Byoungchan Lee <daniel.l@hpcnt.com> Cr-Commit-Position: refs/heads/main@{#35391}
60 lines
2.5 KiB
Plaintext
60 lines
2.5 KiB
Plaintext
/*
|
|
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#import "RTCFieldTrials.h"
|
|
|
|
#include <memory>
|
|
|
|
#import "base/RTCLogging.h"
|
|
|
|
#include "system_wrappers/include/field_trial.h"
|
|
|
|
NSString * const kRTCFieldTrialAudioSendSideBweKey = @"WebRTC-Audio-SendSideBwe";
|
|
NSString * const kRTCFieldTrialAudioForceNoTWCCKey = @"WebRTC-Audio-ForceNoTWCC";
|
|
NSString * const kRTCFieldTrialAudioForceABWENoTWCCKey = @"WebRTC-Audio-ABWENoTWCC";
|
|
NSString * const kRTCFieldTrialSendSideBweWithOverheadKey = @"WebRTC-SendSideBwe-WithOverhead";
|
|
NSString * const kRTCFieldTrialFlexFec03AdvertisedKey = @"WebRTC-FlexFEC-03-Advertised";
|
|
NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03";
|
|
NSString * const kRTCFieldTrialH264HighProfileKey = @"WebRTC-H264HighProfile";
|
|
NSString * const kRTCFieldTrialMinimizeResamplingOnMobileKey =
|
|
@"WebRTC-Audio-MinimizeResamplingOnMobile";
|
|
NSString *const kRTCFieldTrialUseNWPathMonitor = @"WebRTC-Network-UseNWPathMonitor";
|
|
NSString * const kRTCFieldTrialEnabledValue = @"Enabled";
|
|
|
|
// InitFieldTrialsFromString stores the char*, so the char array must outlive
|
|
// the application.
|
|
static char *gFieldTrialInitString = nullptr;
|
|
|
|
void RTCInitFieldTrialDictionary(NSDictionary<NSString *, NSString *> *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];
|
|
for (NSString *key in fieldTrials) {
|
|
NSString *fieldTrialEntry = [NSString stringWithFormat:@"%@/%@/", key, fieldTrials[key]];
|
|
[fieldTrialInitString appendString:fieldTrialEntry];
|
|
}
|
|
size_t len = fieldTrialInitString.length + 1;
|
|
if (gFieldTrialInitString != nullptr) {
|
|
delete[] gFieldTrialInitString;
|
|
}
|
|
gFieldTrialInitString = new char[len];
|
|
if (![fieldTrialInitString getCString:gFieldTrialInitString
|
|
maxLength:len
|
|
encoding:NSUTF8StringEncoding]) {
|
|
RTCLogError(@"Failed to convert field trial string.");
|
|
return;
|
|
}
|
|
webrtc::field_trial::InitFieldTrialsFromString(gFieldTrialInitString);
|
|
}
|