diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 4f138a6512..6cff621d91 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -392,6 +392,8 @@ if (is_ios || is_mac) { "objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm", "objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h", "objc/Framework/Classes/PeerConnection/RTCIceServer.mm", + "objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h", + "objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm", "objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport+Private.h", "objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport.mm", "objc/Framework/Classes/PeerConnection/RTCMediaConstraints+Private.h", @@ -443,6 +445,7 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h", "objc/Framework/Headers/WebRTC/RTCIceCandidate.h", "objc/Framework/Headers/WebRTC/RTCIceServer.h", + "objc/Framework/Headers/WebRTC/RTCIntervalRange.h", "objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h", "objc/Framework/Headers/WebRTC/RTCMediaConstraints.h", "objc/Framework/Headers/WebRTC/RTCMediaSource.h", @@ -507,6 +510,7 @@ if (is_ios || is_mac) { "objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm", "objc/Framework/UnitTests/RTCIceCandidateTest.mm", "objc/Framework/UnitTests/RTCIceServerTest.mm", + "objc/Framework/UnitTests/RTCIntervalRangeTests.mm", "objc/Framework/UnitTests/RTCMediaConstraintsTest.mm", "objc/Framework/UnitTests/RTCPeerConnectionTest.mm", "objc/Framework/UnitTests/RTCSessionDescriptionTest.mm", @@ -585,6 +589,7 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCFieldTrials.h", "objc/Framework/Headers/WebRTC/RTCIceCandidate.h", "objc/Framework/Headers/WebRTC/RTCIceServer.h", + "objc/Framework/Headers/WebRTC/RTCIntervalRange.h", "objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h", "objc/Framework/Headers/WebRTC/RTCLogging.h", "objc/Framework/Headers/WebRTC/RTCMacros.h", diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm index ad11b30f90..24fcdeff38 100644 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm @@ -13,6 +13,7 @@ #include #import "RTCIceServer+Private.h" +#import "RTCIntervalRange+Private.h" #import "WebRTC/RTCLogging.h" #include "webrtc/rtc_base/rtccertificategenerator.h" @@ -38,6 +39,7 @@ @synthesize shouldPresumeWritableWhenFullyRelayed = _shouldPresumeWritableWhenFullyRelayed; @synthesize iceCheckMinInterval = _iceCheckMinInterval; +@synthesize iceRegatherIntervalRange = _iceRegatherIntervalRange; - (instancetype)init { // Copy defaults. @@ -83,13 +85,18 @@ _iceCheckMinInterval = [NSNumber numberWithInt:*config.ice_check_min_interval]; } + if (config.ice_regather_interval_range) { + const rtc::IntervalRange &nativeIntervalRange = config.ice_regather_interval_range.value(); + _iceRegatherIntervalRange = + [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeIntervalRange]; + } } return self; } - (NSString *)description { return [NSString stringWithFormat: - @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n}\n", + @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n%@\n}\n", _iceServers, [[self class] stringForTransportPolicy:_iceTransportPolicy], [[self class] stringForBundlePolicy:_bundlePolicy], @@ -105,7 +112,8 @@ _iceCandidatePoolSize, _shouldPruneTurnPorts, _shouldPresumeWritableWhenFullyRelayed, - _iceCheckMinInterval]; + _iceCheckMinInterval, + _iceRegatherIntervalRange]; } #pragma mark - Private @@ -159,6 +167,12 @@ nativeConfig->ice_check_min_interval = rtc::Optional(_iceCheckMinInterval.intValue); } + if (_iceRegatherIntervalRange != nil) { + std::unique_ptr nativeIntervalRange( + _iceRegatherIntervalRange.nativeIntervalRange); + nativeConfig->ice_regather_interval_range = + rtc::Optional(*nativeIntervalRange); + } return nativeConfig.release(); } diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h new file mode 100644 index 0000000000..b95841393d --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h @@ -0,0 +1,27 @@ +/* + * Copyright 2017 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 "WebRTC/RTCIntervalRange.h" + +#include "webrtc/rtc_base/timeutils.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCIntervalRange () + +@property(nonatomic, readonly) + std::unique_ptr nativeIntervalRange; + +- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm new file mode 100644 index 0000000000..40f5eb5c2e --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm @@ -0,0 +1,50 @@ +/* + * Copyright 2017 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 "RTCIntervalRange+Private.h" + +#include "webrtc/rtc_base/checks.h" + +@implementation RTCIntervalRange + +@synthesize min = _min; +@synthesize max = _max; + +- (instancetype)init { + return [self initWithMin:0 max:0]; +} + +- (instancetype)initWithMin:(NSInteger)min + max:(NSInteger)max { + RTC_DCHECK_LE(min, max); + if (self = [super init]) { + _min = min; + _max = max; + } + return self; +} + +- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config { + return [self initWithMin:config.min() max:config.max()]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"[%ld, %ld]", (long)_min, (long)_max]; +} + +#pragma mark - Private + +- (std::unique_ptr)nativeIntervalRange { + std::unique_ptr nativeIntervalRange( + new rtc::IntervalRange((int)_min, (int)_max)); + return nativeIntervalRange; +} + +@end diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h index 862a01d4f6..17d79b2ed9 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h @@ -13,6 +13,7 @@ #import @class RTCIceServer; +@class RTCIntervalRange; /** * Represents the ice transport policy. This exposes the same states in C++, @@ -109,6 +110,13 @@ RTC_EXPORT */ @property(nonatomic, copy, nullable) NSNumber *iceCheckMinInterval; +/** ICE Periodic Regathering + * If set, WebRTC will periodically create and propose candidates without + * starting a new ICE generation. The regathering happens continuously with + * interval specified in milliseconds by the uniform distribution [a, b]. + */ +@property(nonatomic, strong, nullable) RTCIntervalRange *iceRegatherIntervalRange; + - (instancetype)init; @end diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h new file mode 100644 index 0000000000..9384b15368 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 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 + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCIntervalRange : NSObject + +@property(nonatomic, readonly) NSInteger min; +@property(nonatomic, readonly) NSInteger max; + +- (instancetype)init; +- (instancetype)initWithMin:(NSInteger)min + max:(NSInteger)max + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h index 772cea12ef..17019a2a64 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h @@ -27,6 +27,7 @@ #import #import #import +#import #import #import #import diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm index df94d4f1fb..4b44fb190c 100644 --- a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm +++ b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm @@ -18,6 +18,7 @@ #import "RTCConfiguration+Private.h" #import "WebRTC/RTCConfiguration.h" #import "WebRTC/RTCIceServer.h" +#import "WebRTC/RTCIntervalRange.h" @interface RTCConfigurationTest : NSObject - (void)testConversionToNativeConfiguration; @@ -29,6 +30,7 @@ - (void)testConversionToNativeConfiguration { NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings]; + RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100]; RTCConfiguration *config = [[RTCConfiguration alloc] init]; config.iceServers = @[ server ]; @@ -47,6 +49,7 @@ config.continualGatheringPolicy = RTCContinualGatheringPolicyGatherContinually; config.shouldPruneTurnPorts = YES; + config.iceRegatherIntervalRange = range; std::unique_ptr nativeConfig([config createNativeConfiguration]); @@ -73,11 +76,14 @@ EXPECT_EQ(webrtc::PeerConnectionInterface::GATHER_CONTINUALLY, nativeConfig->continual_gathering_policy); EXPECT_EQ(true, nativeConfig->prune_turn_ports); + EXPECT_EQ(range.min, nativeConfig->ice_regather_interval_range->min()); + EXPECT_EQ(range.max, nativeConfig->ice_regather_interval_range->max()); } - (void)testNativeConversionToConfiguration { NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings]; + RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100]; RTCConfiguration *config = [[RTCConfiguration alloc] init]; config.iceServers = @[ server ]; @@ -96,6 +102,7 @@ config.continualGatheringPolicy = RTCContinualGatheringPolicyGatherContinually; config.shouldPruneTurnPorts = YES; + config.iceRegatherIntervalRange = range; webrtc::PeerConnectionInterface::RTCConfiguration *nativeConfig = [config createNativeConfiguration]; @@ -121,6 +128,8 @@ newConfig.iceBackupCandidatePairPingInterval); EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy); EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts); + EXPECT_EQ(config.iceRegatherIntervalRange.min, newConfig.iceRegatherIntervalRange.min); + EXPECT_EQ(config.iceRegatherIntervalRange.max, newConfig.iceRegatherIntervalRange.max); } @end diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm new file mode 100644 index 0000000000..b9952219da --- /dev/null +++ b/webrtc/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm @@ -0,0 +1,54 @@ +/* + * Copyright 2017 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 + +#include "webrtc/rtc_base/gunit.h" + +#import "RTCIntervalRange+Private.h" +#import "WebRTC/RTCIntervalRange.h" + +@interface RTCIntervalRangeTest : NSObject +- (void)testConversionToNativeConfiguration; +- (void)testNativeConversionToConfiguration; +@end + +@implementation RTCIntervalRangeTest + +- (void)testConversionToNativeConfiguration { + NSInteger min = 0; + NSInteger max = 100; + RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:min max:max]; + EXPECT_EQ(min, range.min); + EXPECT_EQ(max, range.max); + std::unique_ptr nativeRange = range.nativeIntervalRange; + EXPECT_EQ(min, nativeRange->min()); + EXPECT_EQ(max, nativeRange->max()); +} + +- (void)testNativeConversionToConfiguration { + NSInteger min = 0; + NSInteger max = 100; + rtc::IntervalRange nativeRange((int)min, (int)max); + RTCIntervalRange *range = + [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeRange]; + EXPECT_EQ(min, range.min); + EXPECT_EQ(max, range.max); +} + +@end + +TEST(RTCIntervalRangeTest, NativeConfigurationConversionTest) { + @autoreleasepool { + RTCIntervalRangeTest *test = [[RTCIntervalRangeTest alloc] init]; + [test testConversionToNativeConfiguration]; + [test testNativeConversionToConfiguration]; + } +}