xref: /aosp_15_r20/external/webrtc/test/scenario/stats_collection.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2019 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 #ifndef TEST_SCENARIO_STATS_COLLECTION_H_
11*d9f75844SAndroid Build Coastguard Worker #define TEST_SCENARIO_STATS_COLLECTION_H_
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <map>
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
17*d9f75844SAndroid Build Coastguard Worker #include "call/call.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/logging/log_writer.h"
20*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/performance_stats.h"
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
23*d9f75844SAndroid Build Coastguard Worker namespace test {
24*d9f75844SAndroid Build Coastguard Worker 
25*d9f75844SAndroid Build Coastguard Worker struct VideoQualityAnalyzerConfig {
26*d9f75844SAndroid Build Coastguard Worker   double psnr_coverage = 1;
27*d9f75844SAndroid Build Coastguard Worker   rtc::Thread* thread = nullptr;
28*d9f75844SAndroid Build Coastguard Worker };
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker class VideoLayerAnalyzer {
31*d9f75844SAndroid Build Coastguard Worker  public:
32*d9f75844SAndroid Build Coastguard Worker   void HandleCapturedFrame(const VideoFramePair& sample);
33*d9f75844SAndroid Build Coastguard Worker   void HandleRenderedFrame(const VideoFramePair& sample);
34*d9f75844SAndroid Build Coastguard Worker   void HandleFramePair(VideoFramePair sample,
35*d9f75844SAndroid Build Coastguard Worker                        double psnr,
36*d9f75844SAndroid Build Coastguard Worker                        RtcEventLogOutput* writer);
37*d9f75844SAndroid Build Coastguard Worker   VideoQualityStats stats_;
38*d9f75844SAndroid Build Coastguard Worker   Timestamp last_capture_time_ = Timestamp::MinusInfinity();
39*d9f75844SAndroid Build Coastguard Worker   Timestamp last_render_time_ = Timestamp::MinusInfinity();
40*d9f75844SAndroid Build Coastguard Worker   Timestamp last_freeze_time_ = Timestamp::MinusInfinity();
41*d9f75844SAndroid Build Coastguard Worker   int skip_count_ = 0;
42*d9f75844SAndroid Build Coastguard Worker };
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker class VideoQualityAnalyzer {
45*d9f75844SAndroid Build Coastguard Worker  public:
46*d9f75844SAndroid Build Coastguard Worker   explicit VideoQualityAnalyzer(
47*d9f75844SAndroid Build Coastguard Worker       VideoQualityAnalyzerConfig config = VideoQualityAnalyzerConfig(),
48*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<RtcEventLogOutput> writer = nullptr);
49*d9f75844SAndroid Build Coastguard Worker   ~VideoQualityAnalyzer();
50*d9f75844SAndroid Build Coastguard Worker   void HandleFramePair(VideoFramePair sample);
51*d9f75844SAndroid Build Coastguard Worker   std::vector<VideoQualityStats> layer_stats() const;
52*d9f75844SAndroid Build Coastguard Worker   VideoQualityStats& stats();
53*d9f75844SAndroid Build Coastguard Worker   void PrintHeaders();
54*d9f75844SAndroid Build Coastguard Worker   void PrintFrameInfo(const VideoFramePair& sample);
55*d9f75844SAndroid Build Coastguard Worker   std::function<void(const VideoFramePair&)> Handler();
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker  private:
58*d9f75844SAndroid Build Coastguard Worker   void HandleFramePair(VideoFramePair sample, double psnr);
59*d9f75844SAndroid Build Coastguard Worker   const VideoQualityAnalyzerConfig config_;
60*d9f75844SAndroid Build Coastguard Worker   std::map<int, VideoLayerAnalyzer> layer_analyzers_;
61*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<RtcEventLogOutput> writer_;
62*d9f75844SAndroid Build Coastguard Worker   absl::optional<VideoQualityStats> cached_;
63*d9f75844SAndroid Build Coastguard Worker };
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker class CallStatsCollector {
66*d9f75844SAndroid Build Coastguard Worker  public:
67*d9f75844SAndroid Build Coastguard Worker   void AddStats(Call::Stats sample);
stats()68*d9f75844SAndroid Build Coastguard Worker   CollectedCallStats& stats() { return stats_; }
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker  private:
71*d9f75844SAndroid Build Coastguard Worker   CollectedCallStats stats_;
72*d9f75844SAndroid Build Coastguard Worker };
73*d9f75844SAndroid Build Coastguard Worker class AudioReceiveStatsCollector {
74*d9f75844SAndroid Build Coastguard Worker  public:
75*d9f75844SAndroid Build Coastguard Worker   void AddStats(AudioReceiveStreamInterface::Stats sample);
stats()76*d9f75844SAndroid Build Coastguard Worker   CollectedAudioReceiveStats& stats() { return stats_; }
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker  private:
79*d9f75844SAndroid Build Coastguard Worker   CollectedAudioReceiveStats stats_;
80*d9f75844SAndroid Build Coastguard Worker };
81*d9f75844SAndroid Build Coastguard Worker class VideoSendStatsCollector {
82*d9f75844SAndroid Build Coastguard Worker  public:
83*d9f75844SAndroid Build Coastguard Worker   void AddStats(VideoSendStream::Stats sample, Timestamp at_time);
stats()84*d9f75844SAndroid Build Coastguard Worker   CollectedVideoSendStats& stats() { return stats_; }
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker  private:
87*d9f75844SAndroid Build Coastguard Worker   CollectedVideoSendStats stats_;
88*d9f75844SAndroid Build Coastguard Worker   Timestamp last_update_ = Timestamp::MinusInfinity();
89*d9f75844SAndroid Build Coastguard Worker   size_t last_fec_bytes_ = 0;
90*d9f75844SAndroid Build Coastguard Worker };
91*d9f75844SAndroid Build Coastguard Worker class VideoReceiveStatsCollector {
92*d9f75844SAndroid Build Coastguard Worker  public:
93*d9f75844SAndroid Build Coastguard Worker   void AddStats(VideoReceiveStreamInterface::Stats sample);
stats()94*d9f75844SAndroid Build Coastguard Worker   CollectedVideoReceiveStats& stats() { return stats_; }
95*d9f75844SAndroid Build Coastguard Worker 
96*d9f75844SAndroid Build Coastguard Worker  private:
97*d9f75844SAndroid Build Coastguard Worker   CollectedVideoReceiveStats stats_;
98*d9f75844SAndroid Build Coastguard Worker };
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker struct CallStatsCollectors {
101*d9f75844SAndroid Build Coastguard Worker   CallStatsCollector call;
102*d9f75844SAndroid Build Coastguard Worker   AudioReceiveStatsCollector audio_receive;
103*d9f75844SAndroid Build Coastguard Worker   VideoSendStatsCollector video_send;
104*d9f75844SAndroid Build Coastguard Worker   VideoReceiveStatsCollector video_receive;
105*d9f75844SAndroid Build Coastguard Worker };
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker }  // namespace test
108*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
109*d9f75844SAndroid Build Coastguard Worker 
110*d9f75844SAndroid Build Coastguard Worker #endif  // TEST_SCENARIO_STATS_COLLECTION_H_
111