xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCPeerConnection+Stats.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker#import "RTCPeerConnection+Private.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import "RTCLegacyStatsReport+Private.h"
14*d9f75844SAndroid Build Coastguard Worker#import "RTCMediaStreamTrack+Private.h"
15*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpReceiver+Private.h"
16*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpSender+Private.h"
17*d9f75844SAndroid Build Coastguard Worker#import "RTCStatisticsReport+Private.h"
18*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h"
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/checks.h"
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Workernamespace webrtc {
23*d9f75844SAndroid Build Coastguard Worker
24*d9f75844SAndroid Build Coastguard Workerclass StatsCollectorCallbackAdapter : public RTCStatsCollectorCallback {
25*d9f75844SAndroid Build Coastguard Worker public:
26*d9f75844SAndroid Build Coastguard Worker  StatsCollectorCallbackAdapter(RTCStatisticsCompletionHandler completion_handler)
27*d9f75844SAndroid Build Coastguard Worker      : completion_handler_(completion_handler) {}
28*d9f75844SAndroid Build Coastguard Worker
29*d9f75844SAndroid Build Coastguard Worker  void OnStatsDelivered(const rtc::scoped_refptr<const RTCStatsReport> &report) override {
30*d9f75844SAndroid Build Coastguard Worker    RTC_DCHECK(completion_handler_);
31*d9f75844SAndroid Build Coastguard Worker    RTC_OBJC_TYPE(RTCStatisticsReport) *statisticsReport =
32*d9f75844SAndroid Build Coastguard Worker        [[RTC_OBJC_TYPE(RTCStatisticsReport) alloc] initWithReport:*report];
33*d9f75844SAndroid Build Coastguard Worker    completion_handler_(statisticsReport);
34*d9f75844SAndroid Build Coastguard Worker    completion_handler_ = nil;
35*d9f75844SAndroid Build Coastguard Worker  }
36*d9f75844SAndroid Build Coastguard Worker
37*d9f75844SAndroid Build Coastguard Worker private:
38*d9f75844SAndroid Build Coastguard Worker  RTCStatisticsCompletionHandler completion_handler_;
39*d9f75844SAndroid Build Coastguard Worker};
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Workerclass StatsObserverAdapter : public StatsObserver {
42*d9f75844SAndroid Build Coastguard Worker public:
43*d9f75844SAndroid Build Coastguard Worker  StatsObserverAdapter(
44*d9f75844SAndroid Build Coastguard Worker      void (^completionHandler)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats)) {
45*d9f75844SAndroid Build Coastguard Worker    completion_handler_ = completionHandler;
46*d9f75844SAndroid Build Coastguard Worker  }
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker  ~StatsObserverAdapter() override { completion_handler_ = nil; }
49*d9f75844SAndroid Build Coastguard Worker
50*d9f75844SAndroid Build Coastguard Worker  void OnComplete(const StatsReports& reports) override {
51*d9f75844SAndroid Build Coastguard Worker    RTC_DCHECK(completion_handler_);
52*d9f75844SAndroid Build Coastguard Worker    NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()];
53*d9f75844SAndroid Build Coastguard Worker    for (const auto* report : reports) {
54*d9f75844SAndroid Build Coastguard Worker      RTC_OBJC_TYPE(RTCLegacyStatsReport) *statsReport =
55*d9f75844SAndroid Build Coastguard Worker          [[RTC_OBJC_TYPE(RTCLegacyStatsReport) alloc] initWithNativeReport:*report];
56*d9f75844SAndroid Build Coastguard Worker      [stats addObject:statsReport];
57*d9f75844SAndroid Build Coastguard Worker    }
58*d9f75844SAndroid Build Coastguard Worker    completion_handler_(stats);
59*d9f75844SAndroid Build Coastguard Worker    completion_handler_ = nil;
60*d9f75844SAndroid Build Coastguard Worker  }
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker private:
63*d9f75844SAndroid Build Coastguard Worker  void (^completion_handler_)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats);
64*d9f75844SAndroid Build Coastguard Worker};
65*d9f75844SAndroid Build Coastguard Worker}  // namespace webrtc
66*d9f75844SAndroid Build Coastguard Worker
67*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCPeerConnection)
68*d9f75844SAndroid Build Coastguard Worker(Stats)
69*d9f75844SAndroid Build Coastguard Worker
70*d9f75844SAndroid Build Coastguard Worker    - (void)statisticsForSender : (RTC_OBJC_TYPE(RTCRtpSender) *)sender completionHandler
71*d9f75844SAndroid Build Coastguard Worker    : (RTCStatisticsCompletionHandler)completionHandler {
72*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector =
73*d9f75844SAndroid Build Coastguard Worker      rtc::make_ref_counted<webrtc::StatsCollectorCallbackAdapter>(completionHandler);
74*d9f75844SAndroid Build Coastguard Worker  self.nativePeerConnection->GetStats(sender.nativeRtpSender, collector);
75*d9f75844SAndroid Build Coastguard Worker}
76*d9f75844SAndroid Build Coastguard Worker
77*d9f75844SAndroid Build Coastguard Worker- (void)statisticsForReceiver:(RTC_OBJC_TYPE(RTCRtpReceiver) *)receiver
78*d9f75844SAndroid Build Coastguard Worker            completionHandler:(RTCStatisticsCompletionHandler)completionHandler {
79*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector =
80*d9f75844SAndroid Build Coastguard Worker      rtc::make_ref_counted<webrtc::StatsCollectorCallbackAdapter>(completionHandler);
81*d9f75844SAndroid Build Coastguard Worker  self.nativePeerConnection->GetStats(receiver.nativeRtpReceiver, collector);
82*d9f75844SAndroid Build Coastguard Worker}
83*d9f75844SAndroid Build Coastguard Worker
84*d9f75844SAndroid Build Coastguard Worker- (void)statisticsWithCompletionHandler:(RTCStatisticsCompletionHandler)completionHandler {
85*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::StatsCollectorCallbackAdapter> collector =
86*d9f75844SAndroid Build Coastguard Worker      rtc::make_ref_counted<webrtc::StatsCollectorCallbackAdapter>(completionHandler);
87*d9f75844SAndroid Build Coastguard Worker  self.nativePeerConnection->GetStats(collector.get());
88*d9f75844SAndroid Build Coastguard Worker}
89*d9f75844SAndroid Build Coastguard Worker
90*d9f75844SAndroid Build Coastguard Worker- (void)statsForTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)mediaStreamTrack
91*d9f75844SAndroid Build Coastguard Worker     statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
92*d9f75844SAndroid Build Coastguard Worker    completionHandler:
93*d9f75844SAndroid Build Coastguard Worker        (void (^)(NSArray<RTC_OBJC_TYPE(RTCLegacyStatsReport) *> *stats))completionHandler {
94*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::StatsObserverAdapter> observer =
95*d9f75844SAndroid Build Coastguard Worker      rtc::make_ref_counted<webrtc::StatsObserverAdapter>(completionHandler);
96*d9f75844SAndroid Build Coastguard Worker  webrtc::PeerConnectionInterface::StatsOutputLevel nativeOutputLevel =
97*d9f75844SAndroid Build Coastguard Worker      [[self class] nativeStatsOutputLevelForLevel:statsOutputLevel];
98*d9f75844SAndroid Build Coastguard Worker  self.nativePeerConnection->GetStats(
99*d9f75844SAndroid Build Coastguard Worker      observer.get(), mediaStreamTrack.nativeTrack.get(), nativeOutputLevel);
100*d9f75844SAndroid Build Coastguard Worker}
101*d9f75844SAndroid Build Coastguard Worker
102*d9f75844SAndroid Build Coastguard Worker@end
103