From 0ab07d67cb59352235d7d2a38df2e12f7fe80865 Mon Sep 17 00:00:00 2001 From: asapersson Date: Wed, 8 Jun 2016 04:59:16 -0700 Subject: [PATCH] Add ObjC API for getting native histograms. BUG= Review-Url: https://codereview.webrtc.org/2036773003 Cr-Commit-Position: refs/heads/master@{#13064} --- webrtc/sdk/BUILD.gn | 5 ++ .../sdk/objc/Framework/Classes/RTCMetrics.mm | 32 +++++++++++++ .../Classes/RTCMetricsSampleInfo+Private.h | 25 ++++++++++ .../Framework/Classes/RTCMetricsSampleInfo.mm | 43 +++++++++++++++++ .../Framework/Headers/WebRTC/RTCMetrics.h | 23 +++++++++ .../Headers/WebRTC/RTCMetricsSampleInfo.h | 48 +++++++++++++++++++ .../objc/Framework/Headers/WebRTC/WebRTC.h | 2 + webrtc/sdk/sdk.gyp | 5 ++ 8 files changed, 183 insertions(+) create mode 100644 webrtc/sdk/objc/Framework/Classes/RTCMetrics.mm create mode 100644 webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo+Private.h create mode 100644 webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo.mm create mode 100644 webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h create mode 100644 webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index f4975f2293..8f0bb8369d 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -36,12 +36,17 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { "objc/Framework/Classes/RTCDispatcher.m", "objc/Framework/Classes/RTCFieldTrials.mm", "objc/Framework/Classes/RTCLogging.mm", + "objc/Framework/Classes/RTCMetrics.mm", + "objc/Framework/Classes/RTCMetricsSampleInfo+Private.h", + "objc/Framework/Classes/RTCMetricsSampleInfo.mm", "objc/Framework/Classes/RTCSSLAdapter.mm", "objc/Framework/Classes/RTCTracing.mm", "objc/Framework/Headers/WebRTC/RTCDispatcher.h", "objc/Framework/Headers/WebRTC/RTCFieldTrials.h", "objc/Framework/Headers/WebRTC/RTCLogging.h", "objc/Framework/Headers/WebRTC/RTCMacros.h", + "objc/Framework/Headers/WebRTC/RTCMetrics.h", + "objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h", "objc/Framework/Headers/WebRTC/RTCSSLAdapter.h", "objc/Framework/Headers/WebRTC/RTCTracing.h", ] diff --git a/webrtc/sdk/objc/Framework/Classes/RTCMetrics.mm b/webrtc/sdk/objc/Framework/Classes/RTCMetrics.mm new file mode 100644 index 0000000000..279a2bec31 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/RTCMetrics.mm @@ -0,0 +1,32 @@ +/* + * 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 "WebRTC/RTCMetrics.h" + +#import "RTCMetricsSampleInfo+Private.h" + +void RTCEnableMetrics() { + webrtc::metrics::Enable(); +} + +NSArray *RTCGetAndResetMetrics() { + std::map> + histograms; + webrtc::metrics::GetAndReset(&histograms); + + NSMutableArray *metrics = + [NSMutableArray arrayWithCapacity:histograms.size()]; + for (auto const &histogram : histograms) { + RTCMetricsSampleInfo *metric = [[RTCMetricsSampleInfo alloc] + initWithNativeSampleInfo:*histogram.second]; + [metrics addObject:metric]; + } + return metrics; +} diff --git a/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo+Private.h b/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo+Private.h new file mode 100644 index 0000000000..00d3fa6930 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo+Private.h @@ -0,0 +1,25 @@ +/* + * 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 "WebRTC/RTCMetricsSampleInfo.h" + +#include "webrtc/system_wrappers/include/metrics_default.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCMetricsSampleInfo () + +/** Initialize an RTCMetricsSampleInfo object from native SampleInfo. */ +- (instancetype)initWithNativeSampleInfo: + (const webrtc::metrics::SampleInfo &)info; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo.mm b/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo.mm new file mode 100644 index 0000000000..628ba9e11c --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/RTCMetricsSampleInfo.mm @@ -0,0 +1,43 @@ +/* + * 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 "RTCMetricsSampleInfo+Private.h" + +#import "NSString+StdString.h" + +@implementation RTCMetricsSampleInfo + +@synthesize name = _name; +@synthesize min = _min; +@synthesize max = _max; +@synthesize bucketCount = _bucketCount; +@synthesize samples = _samples; + +#pragma mark - Private + +- (instancetype)initWithNativeSampleInfo: + (const webrtc::metrics::SampleInfo &)info { + if (self = [super init]) { + _name = [NSString stringForStdString:info.name]; + _min = info.min; + _max = info.max; + _bucketCount = info.bucket_count; + + NSMutableDictionary *samples = + [NSMutableDictionary dictionaryWithCapacity:info.samples.size()]; + for (auto const &sample : info.samples) { + [samples setObject:@(sample.second) forKey:@(sample.first)]; + } + _samples = samples; + } + return self; +} + +@end diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h new file mode 100644 index 0000000000..fa2d48fa07 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h @@ -0,0 +1,23 @@ +/* + * 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 + +#import +#import + +/** + * Enables gathering of metrics (which can be fetched with + * RTCGetAndResetMetrics). Must be called before any other call into WebRTC. + */ +RTC_EXTERN void RTCEnableMetrics(); + +/** Gets and clears native histograms. */ +RTC_EXTERN NSArray *RTCGetAndResetMetrics(); diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h new file mode 100644 index 0000000000..f01bea9b71 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h @@ -0,0 +1,48 @@ +/* + * 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 + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCMetricsSampleInfo : NSObject + +/** + * Example of RTCMetricsSampleInfo: + * name: "WebRTC.Video.InputFramesPerSecond" + * min: 1 + * max: 100 + * bucketCount: 50 + * samples: [29]:2 [30]:1 + */ + +/** The name of the histogram. */ +@property(nonatomic, readonly) NSString *name; + +/** The minimum bucket value. */ +@property(nonatomic, readonly) int min; + +/** The maximum bucket value. */ +@property(nonatomic, readonly) int max; + +/** The number of buckets. */ +@property(nonatomic, readonly) int bucketCount; + +/** A dictionary holding the samples . */ +@property(nonatomic, readonly) NSDictionary *samples; + +- (instancetype)init NS_UNAVAILABLE; + +@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 bf08a0d347..ad23236cfc 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h @@ -25,6 +25,8 @@ #import #import #import +#import +#import #import #import #import diff --git a/webrtc/sdk/sdk.gyp b/webrtc/sdk/sdk.gyp index 133ee31012..7903faa626 100644 --- a/webrtc/sdk/sdk.gyp +++ b/webrtc/sdk/sdk.gyp @@ -37,12 +37,17 @@ 'objc/Framework/Classes/RTCDispatcher.m', 'objc/Framework/Classes/RTCFieldTrials.mm', 'objc/Framework/Classes/RTCLogging.mm', + 'objc/Framework/Classes/RTCMetrics.mm', + 'objc/Framework/Classes/RTCMetricsSampleInfo+Private.h', + 'objc/Framework/Classes/RTCMetricsSampleInfo.mm', 'objc/Framework/Classes/RTCSSLAdapter.mm', 'objc/Framework/Classes/RTCTracing.mm', 'objc/Framework/Headers/WebRTC/RTCDispatcher.h', 'objc/Framework/Headers/WebRTC/RTCFieldTrials.h', 'objc/Framework/Headers/WebRTC/RTCLogging.h', 'objc/Framework/Headers/WebRTC/RTCMacros.h', + 'objc/Framework/Headers/WebRTC/RTCMetrics.h', + 'objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h', 'objc/Framework/Headers/WebRTC/RTCSSLAdapter.h', 'objc/Framework/Headers/WebRTC/RTCTracing.h', ],