/* * Copyright 2019 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. */ #ifndef TEST_SCENARIO_STATS_COLLECTION_H_ #define TEST_SCENARIO_STATS_COLLECTION_H_ #include #include #include "absl/types/optional.h" #include "call/call.h" #include "rtc_base/thread.h" #include "test/logging/log_writer.h" #include "test/scenario/performance_stats.h" namespace webrtc { namespace test { struct VideoQualityAnalyzerConfig { double psnr_coverage = 1; rtc::Thread* thread = nullptr; }; class VideoLayerAnalyzer { public: void HandleCapturedFrame(const VideoFramePair& sample); void HandleRenderedFrame(const VideoFramePair& sample); void HandleFramePair(VideoFramePair sample, double psnr, RtcEventLogOutput* writer); VideoQualityStats stats_; Timestamp last_capture_time_ = Timestamp::MinusInfinity(); Timestamp last_render_time_ = Timestamp::MinusInfinity(); Timestamp last_freeze_time_ = Timestamp::MinusInfinity(); int skip_count_ = 0; }; class VideoQualityAnalyzer { public: explicit VideoQualityAnalyzer( VideoQualityAnalyzerConfig config = VideoQualityAnalyzerConfig(), std::unique_ptr writer = nullptr); ~VideoQualityAnalyzer(); void HandleFramePair(VideoFramePair sample); std::vector layer_stats() const; VideoQualityStats& stats(); void PrintHeaders(); void PrintFrameInfo(const VideoFramePair& sample); std::function Handler(); private: void HandleFramePair(VideoFramePair sample, double psnr); const VideoQualityAnalyzerConfig config_; std::map layer_analyzers_; const std::unique_ptr writer_; absl::optional cached_; }; class CallStatsCollector { public: void AddStats(Call::Stats sample); CollectedCallStats& stats() { return stats_; } private: CollectedCallStats stats_; }; class AudioReceiveStatsCollector { public: void AddStats(AudioReceiveStreamInterface::Stats sample); CollectedAudioReceiveStats& stats() { return stats_; } private: CollectedAudioReceiveStats stats_; }; class VideoSendStatsCollector { public: void AddStats(VideoSendStream::Stats sample, Timestamp at_time); CollectedVideoSendStats& stats() { return stats_; } private: CollectedVideoSendStats stats_; Timestamp last_update_ = Timestamp::MinusInfinity(); size_t last_fec_bytes_ = 0; }; class VideoReceiveStatsCollector { public: void AddStats(VideoReceiveStreamInterface::Stats sample); CollectedVideoReceiveStats& stats() { return stats_; } private: CollectedVideoReceiveStats stats_; }; struct CallStatsCollectors { CallStatsCollector call; AudioReceiveStatsCollector audio_receive; VideoSendStatsCollector video_send; VideoReceiveStatsCollector video_receive; }; } // namespace test } // namespace webrtc #endif // TEST_SCENARIO_STATS_COLLECTION_H_