blob: e2965ebab751c550b31a464eb95566bf6c3710a5 [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_);
31 RTCStatisticsReport *statisticsReport = [[RTCStatisticsReport alloc] initWithReport:*report];
32 completion_handler_(statisticsReport);
33 completion_handler_ = nil;
34 }
35
36 private:
37 RTCStatisticsCompletionHandler completion_handler_;
38};
39
hjonf396f602016-02-11 16:19:06 -080040class StatsObserverAdapter : public StatsObserver {
41 public:
42 StatsObserverAdapter(void (^completionHandler)
hbosbd3dda62016-09-09 01:36:28 -070043 (NSArray<RTCLegacyStatsReport *> *stats)) {
hjonf396f602016-02-11 16:19:06 -080044 completion_handler_ = completionHandler;
45 }
46
Mirko Bonadei17aff352018-07-26 12:20:40 +020047 ~StatsObserverAdapter() override { completion_handler_ = nil; }
hjonf396f602016-02-11 16:19:06 -080048
nissee8abe3e2017-01-18 05:00:34 -080049 void OnComplete(const StatsReports& reports) override {
hjonf396f602016-02-11 16:19:06 -080050 RTC_DCHECK(completion_handler_);
nissee8abe3e2017-01-18 05:00:34 -080051 NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()];
52 for (const auto* report : reports) {
hbosbd3dda62016-09-09 01:36:28 -070053 RTCLegacyStatsReport *statsReport =
54 [[RTCLegacyStatsReport alloc] initWithNativeReport:*report];
hjonf396f602016-02-11 16:19:06 -080055 [stats addObject:statsReport];
56 }
57 completion_handler_(stats);
58 completion_handler_ = nil;
59 }
60
61 private:
hbosbd3dda62016-09-09 01:36:28 -070062 void (^completion_handler_)(NSArray<RTCLegacyStatsReport *> *stats);
hjonf396f602016-02-11 16:19:06 -080063};
64} // namespace webrtc
65
66@implementation RTCPeerConnection (Stats)
67
Peter Hansperse12a1c72019-02-26 16:39:48 +010068- (void)statisticsForSender:(RTCRtpSender *)sender
69 completionHandler:(RTCStatisticsCompletionHandler)completionHandler {
70 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
71 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
72 self.nativePeerConnection->GetStats(sender.nativeRtpSender, collector);
73}
74
75- (void)statisticsForReceiver:(RTCRtpReceiver *)receiver
76 completionHandler:(RTCStatisticsCompletionHandler)completionHandler {
77 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
78 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
79 self.nativePeerConnection->GetStats(receiver.nativeRtpReceiver, collector);
80}
81
Peter Hanspersbed86042019-02-21 17:27:09 +010082- (void)statisticsWithCompletionHandler:(RTCStatisticsCompletionHandler)completionHandler {
83 rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector(
84 new rtc::RefCountedObject<webrtc::StatsCollectorCallbackAdapter>(completionHandler));
85 self.nativePeerConnection->GetStats(collector);
86}
87
hjonf396f602016-02-11 16:19:06 -080088- (void)statsForTrack:(RTCMediaStreamTrack *)mediaStreamTrack
89 statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
90 completionHandler:
hbosbd3dda62016-09-09 01:36:28 -070091 (void (^)(NSArray<RTCLegacyStatsReport *> *stats))completionHandler {
hjonf396f602016-02-11 16:19:06 -080092 rtc::scoped_refptr<webrtc::StatsObserverAdapter> observer(
93 new rtc::RefCountedObject<webrtc::StatsObserverAdapter>
94 (completionHandler));
95 webrtc::PeerConnectionInterface::StatsOutputLevel nativeOutputLevel =
96 [[self class] nativeStatsOutputLevelForLevel:statsOutputLevel];
97 self.nativePeerConnection->GetStats(
98 observer, mediaStreamTrack.nativeTrack, nativeOutputLevel);
99}
100
101@end