Replace legacy getStats with standard getStats in the iOS example
Bug: webrtc:12688
Change-Id: I039cdae7647738d5f17b229c1137b72bf4aa7be0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219580
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34063}
diff --git a/examples/objc/AppRTCMobile/ARDAppClient.h b/examples/objc/AppRTCMobile/ARDAppClient.h
index 1fed247..8e124ed 100644
--- a/examples/objc/AppRTCMobile/ARDAppClient.h
+++ b/examples/objc/AppRTCMobile/ARDAppClient.h
@@ -48,7 +48,7 @@
- (void)appClient:(ARDAppClient *)client didError:(NSError *)error;
-- (void)appClient:(ARDAppClient *)client didGetStats:(NSArray *)stats;
+- (void)appClient:(ARDAppClient *)client didGetStats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats;
@optional
- (void)appClient:(ARDAppClient *)client
diff --git a/examples/objc/AppRTCMobile/ARDAppClient.m b/examples/objc/AppRTCMobile/ARDAppClient.m
index ccd5bb0..fa6a960 100644
--- a/examples/objc/AppRTCMobile/ARDAppClient.m
+++ b/examples/objc/AppRTCMobile/ARDAppClient.m
@@ -191,9 +191,8 @@
repeats:YES
timerHandler:^{
ARDAppClient *strongSelf = weakSelf;
- [strongSelf.peerConnection statsForTrack:nil
- statsOutputLevel:RTCStatsOutputLevelDebug
- completionHandler:^(NSArray *stats) {
+ [strongSelf.peerConnection statisticsWithCompletionHandler:^(
+ RTC_OBJC_TYPE(RTCStatisticsReport) * stats) {
dispatch_async(dispatch_get_main_queue(), ^{
ARDAppClient *strongSelf = weakSelf;
[strongSelf.delegate appClient:strongSelf didGetStats:stats];
diff --git a/examples/objc/AppRTCMobile/ARDBitrateTracker.h b/examples/objc/AppRTCMobile/ARDBitrateTracker.h
deleted file mode 100644
index 81ac4b4..0000000
--- a/examples/objc/AppRTCMobile/ARDBitrateTracker.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2015 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 <Foundation/Foundation.h>
-
-/** Class used to estimate bitrate based on byte count. It is expected that
- * byte count is monotonocially increasing. This class tracks the times that
- * byte count is updated, and measures the bitrate based on the byte difference
- * over the interval between updates.
- */
-@interface ARDBitrateTracker : NSObject
-
-/** The bitrate in bits per second. */
-@property(nonatomic, readonly) double bitrate;
-/** The bitrate as a formatted string in bps, Kbps or Mbps. */
-@property(nonatomic, readonly) NSString *bitrateString;
-
-/** Converts the bitrate to a readable format in bps, Kbps or Mbps. */
-+ (NSString *)bitrateStringForBitrate:(double)bitrate;
-/** Updates the tracked bitrate with the new byte count. */
-- (void)updateBitrateWithCurrentByteCount:(NSInteger)byteCount;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDBitrateTracker.m b/examples/objc/AppRTCMobile/ARDBitrateTracker.m
deleted file mode 100644
index 8158229..0000000
--- a/examples/objc/AppRTCMobile/ARDBitrateTracker.m
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2015 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 "ARDBitrateTracker.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-@implementation ARDBitrateTracker {
- CFTimeInterval _prevTime;
- NSInteger _prevByteCount;
-}
-
-@synthesize bitrate = _bitrate;
-
-+ (NSString *)bitrateStringForBitrate:(double)bitrate {
- if (bitrate > 1e6) {
- return [NSString stringWithFormat:@"%.2fMbps", bitrate * 1e-6];
- } else if (bitrate > 1e3) {
- return [NSString stringWithFormat:@"%.0fKbps", bitrate * 1e-3];
- } else {
- return [NSString stringWithFormat:@"%.0fbps", bitrate];
- }
-}
-
-- (NSString *)bitrateString {
- return [[self class] bitrateStringForBitrate:_bitrate];
-}
-
-- (void)updateBitrateWithCurrentByteCount:(NSInteger)byteCount {
- CFTimeInterval currentTime = CACurrentMediaTime();
- if (_prevTime && (byteCount > _prevByteCount)) {
- _bitrate = (byteCount - _prevByteCount) * 8 / (currentTime - _prevTime);
- }
- _prevByteCount = byteCount;
- _prevTime = currentTime;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDStatsBuilder.h b/examples/objc/AppRTCMobile/ARDStatsBuilder.h
index e8224dd..eaffa67 100644
--- a/examples/objc/AppRTCMobile/ARDStatsBuilder.h
+++ b/examples/objc/AppRTCMobile/ARDStatsBuilder.h
@@ -10,10 +10,9 @@
#import <Foundation/Foundation.h>
+#import "sdk/objc/api/peerconnection/RTCStatisticsReport.h"
#import "sdk/objc/base/RTCMacros.h"
-@class RTC_OBJC_TYPE(RTCLegacyStatsReport);
-
/** Class used to accumulate stats information into a single displayable string.
*/
@interface ARDStatsBuilder : NSObject
@@ -22,10 +21,6 @@
* class.
*/
@property(nonatomic, readonly) NSString *statsString;
-
-/** Parses the information in the stats report into an appropriate internal
- * format used to generate the stats string.
- */
-- (void)parseStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport;
+@property(nonatomic) RTC_OBJC_TYPE(RTCStatisticsReport) * stats;
@end
diff --git a/examples/objc/AppRTCMobile/ARDStatsBuilder.m b/examples/objc/AppRTCMobile/ARDStatsBuilder.m
index a74e351..7ebf9fb 100644
--- a/examples/objc/AppRTCMobile/ARDStatsBuilder.m
+++ b/examples/objc/AppRTCMobile/ARDStatsBuilder.m
@@ -13,334 +13,24 @@
#import "sdk/objc/api/peerconnection/RTCLegacyStatsReport.h"
#import "sdk/objc/base/RTCMacros.h"
-#import "ARDBitrateTracker.h"
#import "ARDUtilities.h"
-@implementation ARDStatsBuilder {
- // Connection stats.
- NSString *_connRecvBitrate;
- NSString *_connRtt;
- NSString *_connSendBitrate;
- NSString *_localCandType;
- NSString *_remoteCandType;
- NSString *_transportType;
+@implementation ARDStatsBuilder
- // BWE stats.
- NSString *_actualEncBitrate;
- NSString *_availableRecvBw;
- NSString *_availableSendBw;
- NSString *_targetEncBitrate;
-
- // Video send stats.
- NSString *_videoEncodeMs;
- NSString *_videoInputFps;
- NSString *_videoInputHeight;
- NSString *_videoInputWidth;
- NSString *_videoSendCodec;
- NSString *_videoSendBitrate;
- NSString *_videoSendFps;
- NSString *_videoSendHeight;
- NSString *_videoSendWidth;
-
- // QP stats.
- int _videoQPSum;
- int _framesEncoded;
- int _oldVideoQPSum;
- int _oldFramesEncoded;
-
- // Video receive stats.
- NSString *_videoDecodeMs;
- NSString *_videoDecodedFps;
- NSString *_videoOutputFps;
- NSString *_videoRecvBitrate;
- NSString *_videoRecvFps;
- NSString *_videoRecvHeight;
- NSString *_videoRecvWidth;
-
- // Audio send stats.
- NSString *_audioSendBitrate;
- NSString *_audioSendCodec;
-
- // Audio receive stats.
- NSString *_audioCurrentDelay;
- NSString *_audioExpandRate;
- NSString *_audioRecvBitrate;
- NSString *_audioRecvCodec;
-
- // Bitrate trackers.
- ARDBitrateTracker *_audioRecvBitrateTracker;
- ARDBitrateTracker *_audioSendBitrateTracker;
- ARDBitrateTracker *_connRecvBitrateTracker;
- ARDBitrateTracker *_connSendBitrateTracker;
- ARDBitrateTracker *_videoRecvBitrateTracker;
- ARDBitrateTracker *_videoSendBitrateTracker;
-}
-
-- (instancetype)init {
- if (self = [super init]) {
- _audioSendBitrateTracker = [[ARDBitrateTracker alloc] init];
- _audioRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
- _connSendBitrateTracker = [[ARDBitrateTracker alloc] init];
- _connRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
- _videoSendBitrateTracker = [[ARDBitrateTracker alloc] init];
- _videoRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
- _videoQPSum = 0;
- _framesEncoded = 0;
- }
- return self;
-}
+@synthesize stats = _stats;
- (NSString *)statsString {
NSMutableString *result = [NSMutableString string];
- NSString *systemStatsFormat = @"(cpu)%ld%%\n";
- [result appendString:[NSString stringWithFormat:systemStatsFormat,
- (long)ARDGetCpuUsagePercentage()]];
- // Connection stats.
- NSString *connStatsFormat = @"CN %@ms | %@->%@/%@ | (s)%@ | (r)%@\n";
- [result appendString:[NSString stringWithFormat:connStatsFormat,
- _connRtt,
- _localCandType, _remoteCandType, _transportType,
- _connSendBitrate, _connRecvBitrate]];
+ [result appendFormat:@"(cpu)%ld%%\n", (long)ARDGetCpuUsagePercentage()];
- // Video send stats.
- NSString *videoSendFormat = @"VS (input) %@x%@@%@fps | (sent) %@x%@@%@fps\n"
- "VS (enc) %@/%@ | (sent) %@/%@ | %@ms | %@\n"
- "AvgQP (past %d encoded frames) = %d\n ";
- int avgqp = [self calculateAvgQP];
-
- [result appendString:[NSString stringWithFormat:videoSendFormat,
- _videoInputWidth, _videoInputHeight, _videoInputFps,
- _videoSendWidth, _videoSendHeight, _videoSendFps,
- _actualEncBitrate, _targetEncBitrate,
- _videoSendBitrate, _availableSendBw,
- _videoEncodeMs,
- _videoSendCodec,
- _framesEncoded - _oldFramesEncoded, avgqp]];
-
- // Video receive stats.
- NSString *videoReceiveFormat =
- @"VR (recv) %@x%@@%@fps | (decoded)%@ | (output)%@fps | %@/%@ | %@ms\n";
- [result appendString:[NSString stringWithFormat:videoReceiveFormat,
- _videoRecvWidth, _videoRecvHeight, _videoRecvFps,
- _videoDecodedFps,
- _videoOutputFps,
- _videoRecvBitrate, _availableRecvBw,
- _videoDecodeMs]];
-
- // Audio send stats.
- NSString *audioSendFormat = @"AS %@ | %@\n";
- [result appendString:[NSString stringWithFormat:audioSendFormat,
- _audioSendBitrate, _audioSendCodec]];
-
- // Audio receive stats.
- NSString *audioReceiveFormat = @"AR %@ | %@ | %@ms | (expandrate)%@";
- [result appendString:[NSString stringWithFormat:audioReceiveFormat,
- _audioRecvBitrate, _audioRecvCodec, _audioCurrentDelay,
- _audioExpandRate]];
+ for (NSString *key in _stats.statistics) {
+ RTC_OBJC_TYPE(RTCStatistics) *stat = _stats.statistics[key];
+ [result appendFormat:@"%@\n", stat.description];
+ }
return result;
}
-- (void)parseStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- NSString *reportType = statsReport.type;
- if ([reportType isEqualToString:@"ssrc"] &&
- [statsReport.reportId rangeOfString:@"ssrc"].location != NSNotFound) {
- if ([statsReport.reportId rangeOfString:@"send"].location != NSNotFound) {
- [self parseSendSsrcStatsReport:statsReport];
- }
- if ([statsReport.reportId rangeOfString:@"recv"].location != NSNotFound) {
- [self parseRecvSsrcStatsReport:statsReport];
- }
- } else if ([reportType isEqualToString:@"VideoBwe"]) {
- [self parseBweStatsReport:statsReport];
- } else if ([reportType isEqualToString:@"googCandidatePair"]) {
- [self parseConnectionStatsReport:statsReport];
- }
-}
-
-#pragma mark - Private
-
-- (int)calculateAvgQP {
- int deltaFramesEncoded = _framesEncoded - _oldFramesEncoded;
- int deltaQPSum = _videoQPSum - _oldVideoQPSum;
-
- return deltaFramesEncoded != 0 ? deltaQPSum / deltaFramesEncoded : 0;
-}
-
-- (void)updateBweStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googAvailableSendBandwidth"]) {
- _availableSendBw = [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
- } else if ([key isEqualToString:@"googAvailableReceiveBandwidth"]) {
- _availableRecvBw = [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
- } else if ([key isEqualToString:@"googActualEncBitrate"]) {
- _actualEncBitrate = [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
- } else if ([key isEqualToString:@"googTargetEncBitrate"]) {
- _targetEncBitrate = [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
- }
-}
-
-- (void)parseBweStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateBweStatOfKey:key value:value];
- }];
-}
-
-- (void)updateConnectionStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googRtt"]) {
- _connRtt = value;
- } else if ([key isEqualToString:@"googLocalCandidateType"]) {
- _localCandType = value;
- } else if ([key isEqualToString:@"googRemoteCandidateType"]) {
- _remoteCandType = value;
- } else if ([key isEqualToString:@"googTransportType"]) {
- _transportType = value;
- } else if ([key isEqualToString:@"bytesReceived"]) {
- NSInteger byteCount = value.integerValue;
- [_connRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _connRecvBitrate = _connRecvBitrateTracker.bitrateString;
- } else if ([key isEqualToString:@"bytesSent"]) {
- NSInteger byteCount = value.integerValue;
- [_connSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _connSendBitrate = _connSendBitrateTracker.bitrateString;
- }
-}
-
-- (void)parseConnectionStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- NSString *activeConnection = statsReport.values[@"googActiveConnection"];
- if (![activeConnection isEqualToString:@"true"]) {
- return;
- }
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateConnectionStatOfKey:key value:value];
- }];
-}
-
-- (void)parseSendSsrcStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- NSDictionary *values = statsReport.values;
- if ([values objectForKey:@"googFrameRateSent"]) {
- // Video track.
- [self parseVideoSendStatsReport:statsReport];
- } else if ([values objectForKey:@"audioInputLevel"]) {
- // Audio track.
- [self parseAudioSendStatsReport:statsReport];
- }
-}
-
-- (void)updateAudioSendStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googCodecName"]) {
- _audioSendCodec = value;
- } else if ([key isEqualToString:@"bytesSent"]) {
- NSInteger byteCount = value.integerValue;
- [_audioSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _audioSendBitrate = _audioSendBitrateTracker.bitrateString;
- }
-}
-
-- (void)parseAudioSendStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateAudioSendStatOfKey:key value:value];
- }];
-}
-
-- (void)updateVideoSendStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googCodecName"]) {
- _videoSendCodec = value;
- } else if ([key isEqualToString:@"googFrameHeightInput"]) {
- _videoInputHeight = value;
- } else if ([key isEqualToString:@"googFrameWidthInput"]) {
- _videoInputWidth = value;
- } else if ([key isEqualToString:@"googFrameRateInput"]) {
- _videoInputFps = value;
- } else if ([key isEqualToString:@"googFrameHeightSent"]) {
- _videoSendHeight = value;
- } else if ([key isEqualToString:@"googFrameWidthSent"]) {
- _videoSendWidth = value;
- } else if ([key isEqualToString:@"googFrameRateSent"]) {
- _videoSendFps = value;
- } else if ([key isEqualToString:@"googAvgEncodeMs"]) {
- _videoEncodeMs = value;
- } else if ([key isEqualToString:@"bytesSent"]) {
- NSInteger byteCount = value.integerValue;
- [_videoSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _videoSendBitrate = _videoSendBitrateTracker.bitrateString;
- } else if ([key isEqualToString:@"qpSum"]) {
- _oldVideoQPSum = _videoQPSum;
- _videoQPSum = value.integerValue;
- } else if ([key isEqualToString:@"framesEncoded"]) {
- _oldFramesEncoded = _framesEncoded;
- _framesEncoded = value.integerValue;
- }
-}
-
-- (void)parseVideoSendStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateVideoSendStatOfKey:key value:value];
- }];
-}
-
-- (void)parseRecvSsrcStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- NSDictionary *values = statsReport.values;
- if ([values objectForKey:@"googFrameWidthReceived"]) {
- // Video track.
- [self parseVideoRecvStatsReport:statsReport];
- } else if ([values objectForKey:@"audioOutputLevel"]) {
- // Audio track.
- [self parseAudioRecvStatsReport:statsReport];
- }
-}
-
-- (void)updateAudioRecvStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googCodecName"]) {
- _audioRecvCodec = value;
- } else if ([key isEqualToString:@"bytesReceived"]) {
- NSInteger byteCount = value.integerValue;
- [_audioRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _audioRecvBitrate = _audioRecvBitrateTracker.bitrateString;
- } else if ([key isEqualToString:@"googSpeechExpandRate"]) {
- _audioExpandRate = value;
- } else if ([key isEqualToString:@"googCurrentDelayMs"]) {
- _audioCurrentDelay = value;
- }
-}
-
-- (void)parseAudioRecvStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateAudioRecvStatOfKey:key value:value];
- }];
-}
-
-- (void)updateVideoRecvStatOfKey:(NSString *)key value:(NSString *)value {
- if ([key isEqualToString:@"googFrameHeightReceived"]) {
- _videoRecvHeight = value;
- } else if ([key isEqualToString:@"googFrameWidthReceived"]) {
- _videoRecvWidth = value;
- } else if ([key isEqualToString:@"googFrameRateReceived"]) {
- _videoRecvFps = value;
- } else if ([key isEqualToString:@"googFrameRateDecoded"]) {
- _videoDecodedFps = value;
- } else if ([key isEqualToString:@"googFrameRateOutput"]) {
- _videoOutputFps = value;
- } else if ([key isEqualToString:@"googDecodeMs"]) {
- _videoDecodeMs = value;
- } else if ([key isEqualToString:@"bytesReceived"]) {
- NSInteger byteCount = value.integerValue;
- [_videoRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
- _videoRecvBitrate = _videoRecvBitrateTracker.bitrateString;
- }
-}
-
-- (void)parseVideoRecvStatsReport:(RTC_OBJC_TYPE(RTCLegacyStatsReport) *)statsReport {
- [statsReport.values
- enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
- [self updateVideoRecvStatOfKey:key value:value];
- }];
-}
-
@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDStatsView.h b/examples/objc/AppRTCMobile/ios/ARDStatsView.h
index 9c86364..72207de 100644
--- a/examples/objc/AppRTCMobile/ios/ARDStatsView.h
+++ b/examples/objc/AppRTCMobile/ios/ARDStatsView.h
@@ -10,8 +10,12 @@
#import <UIKit/UIKit.h>
+#import "sdk/objc/base/RTCMacros.h"
+
+@class RTC_OBJC_TYPE(RTCStatisticsReport);
+
@interface ARDStatsView : UIView
-- (void)setStats:(NSArray *)stats;
+- (void)setStats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats;
@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDStatsView.m b/examples/objc/AppRTCMobile/ios/ARDStatsView.m
index bd97d30..867ba5b 100644
--- a/examples/objc/AppRTCMobile/ios/ARDStatsView.m
+++ b/examples/objc/AppRTCMobile/ios/ARDStatsView.m
@@ -34,10 +34,8 @@
return self;
}
-- (void)setStats:(NSArray *)stats {
- for (RTC_OBJC_TYPE(RTCLegacyStatsReport) * report in stats) {
- [_statsBuilder parseStatsReport:report];
- }
+- (void)setStats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats {
+ _statsBuilder.stats = stats;
_statsLabel.text = _statsBuilder.statsString;
}
diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m
index cd26829..a82d90b 100644
--- a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m
+++ b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m
@@ -132,8 +132,7 @@
});
}
-- (void)appClient:(ARDAppClient *)client
- didGetStats:(NSArray *)stats {
+- (void)appClient:(ARDAppClient *)client didGetStats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats {
_videoCallView.statsView.stats = stats;
[_videoCallView setNeedsLayout];
}
diff --git a/examples/objc/AppRTCMobile/ios/broadcast_extension/ARDBroadcastSampleHandler.m b/examples/objc/AppRTCMobile/ios/broadcast_extension/ARDBroadcastSampleHandler.m
index d9c816d..1c276d9 100644
--- a/examples/objc/AppRTCMobile/ios/broadcast_extension/ARDBroadcastSampleHandler.m
+++ b/examples/objc/AppRTCMobile/ios/broadcast_extension/ARDBroadcastSampleHandler.m
@@ -120,7 +120,7 @@
didReceiveRemoteVideoTrack:(RTC_OBJC_TYPE(RTCVideoTrack) *)remoteVideoTrack {
}
-- (void)appClient:(ARDAppClient *)client didGetStats:(NSArray *)stats {
+- (void)appClient:(ARDAppClient *)client didGetStats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats {
}
- (void)appClient:(ARDAppClient *)client didError:(NSError *)error {