blob: 8ded55200efab82affe301566639b929244c03c4 [file] [log] [blame]
hjonf396f602016-02-11 16:19:06 -08001/*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
tkchin9eeb6242016-04-27 01:54:20 -070011#import "RTCPeerConnection+Private.h"
12
hbosbd3dda62016-09-09 01:36:28 -070013#import "RTCLegacyStatsReport+Private.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020014#import "RTCMediaStreamTrack+Private.h"
Peter Hansperse12a1c72019-02-26 16:39:48 +010015#import "RTCRtpReceiver+Private.h"
16#import "RTCRtpSender+Private.h"
Peter Hanspersbed86042019-02-21 17:27:09 +010017#import "RTCStatisticsReport+Private.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020018#import "helpers/NSString+StdString.h"
hjonf396f602016-02-11 16:19:06 -080019
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "rtc_base/checks.h"
hjonf396f602016-02-11 16:19:06 -080021
hjonf396f602016-02-11 16:19:06 -080022namespace webrtc {
23
Peter Hanspersbed86042019-02-21 17:27:09 +010024class StatsCollectorCallbackAdapter : public RTCStatsCollectorCallback {
25 public:
26 StatsCollectorCallbackAdapter(RTCStatisticsCompletionHandler completion_handler)
27 : completion_handler_(completion_handler) {}
28
29 void OnStatsDelivered(const rtc::scoped_refptr<const RTCStatsReport> &report) override {
30 RTC_DCHECK(completion_handler_);
Danilo Bargen87a6e5a2020-05-14 12:41:53 +000031 RTC_OBJC_TYPE(RTCStatisticsReport) *statisticsReport =
32 [[RTC_OBJC_TYPE(RTCStatisticsReport) alloc] initWithReport:*report];
Peter Hanspersbed86042019-02-21 17:27:09 +010033 completion_handler_(statisticsReport);
34 completion_handler_ = nil;
35 }
36
37 private:
38 RTCStatisticsCompletionHandler completion_handler_;
39};
40
hjonf396f602016-02-11 16:19:06 -080041class StatsObserverAdapter : public StatsObserver {
42 public:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020043 StatsObserverAdapter(
44 void (^completionHandler)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats)) {
hjonf396f602016-02-11 16:19:06 -080045 completion_handler_ = completionHandler;
46 }
47
Mirko Bonadei17aff352018-07-26 12:20:40 +020048 ~StatsObserverAdapter() override { completion_handler_ = nil; }
hjonf396f602016-02-11 16:19:06 -080049
nissee8abe3e2017-01-18 05:00:34 -080050 void OnComplete(const StatsReports& reports) override {
hjonf396f602016-02-11 16:19:06 -080051 RTC_DCHECK(completion_handler_);
nissee8abe3e2017-01-18 05:00:34 -080052 NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()];
53 for (const auto* report : reports) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020054 RTC_OBJC_TYPE(RTCLegacyStatsReport) *statsReport =
55 [[RTC_OBJC_TYPE(RTCLegacyStatsReport) alloc] initWithNativeReport:*report];
hjonf396f602016-02-11 16:19:06 -080056 [stats addObject:statsReport];
57 }
58 completion_handler_(stats);
59 completion_handler_ = nil;
60 }
61
62 private:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020063 void (^completion_handler_)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats);
hjonf396f602016-02-11 16:19:06 -080064};
65} // namespace webrtc
66
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020067@implementation RTC_OBJC_TYPE (RTCPeerConnection)
68(Stats)
hjonf396f602016-02-11 16:19:06 -080069
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020070 - (void)statisticsForSender : (RTC_OBJC_TYPE(RTCRtpSender) *)sender completionHandler
71 : (RTCStatisticsCompletionHandler)completionHandler {
Peter Hansperse12a1c72019-02-26 16:39:48 +010072 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
73 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
74 self.nativePeerConnection->GetStats(sender.nativeRtpSender, collector);
75}
76
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020077- (void)statisticsForReceiver:(RTC_OBJC_TYPE(RTCRtpReceiver) *)receiver
Peter Hansperse12a1c72019-02-26 16:39:48 +010078 completionHandler:(RTCStatisticsCompletionHandler)completionHandler {
79 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
80 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
81 self.nativePeerConnection->GetStats(receiver.nativeRtpReceiver, collector);
82}
83
Peter Hanspersbed86042019-02-21 17:27:09 +010084- (void)statisticsWithCompletionHandler:(RTCStatisticsCompletionHandler)completionHandler {
85 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
86 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
87 self.nativePeerConnection->GetStats(collector);
88}
89
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020090- (void)statsForTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)mediaStreamTrack
hjonf396f602016-02-11 16:19:06 -080091 statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
92 completionHandler:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020093 (void (^)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats))completionHandler {
hjonf396f602016-02-11 16:19:06 -080094 rtc::scoped_refptr<webrtc::StatsObserverAdapter> observer(
95 new rtc::RefCountedObject<webrtc::StatsObserverAdapter>
96 (completionHandler));
97 webrtc::PeerConnectionInterface::StatsOutputLevel nativeOutputLevel =
98 [[self class] nativeStatsOutputLevelForLevel:statsOutputLevel];
99 self.nativePeerConnection->GetStats(
100 observer, mediaStreamTrack.nativeTrack, nativeOutputLevel);
101}
102
103@end