This is a reland of ad5c4accad00e04de08e2b62d366cc1f8e0320a5 It was flaky due to starting ICE signaling before SDP negotiation finished. This was solved by adding an helper for adding ice candidates which will wait until the peer connection is ready if needed. Original change's description: > Adds PeerConnection scenario test framework. > > Bug: webrtc:10839 > Change-Id: If67eeb680d016d66c69d8e761a88c240e4931a5d > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147276 > Commit-Queue: Sebastian Jansson <srte@webrtc.org> > Reviewed-by: Steve Anton <steveanton@webrtc.org> > Reviewed-by: Erik Språng <sprang@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#28754} Bug: webrtc:10839 Change-Id: I6eb8f482561c87e7b0f20d2431d21a41b26c91d5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147877 Reviewed-by: Steve Anton <steveanton@webrtc.org> Commit-Queue: Sebastian Jansson <srte@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28777}
110 lines
3.2 KiB
C++
110 lines
3.2 KiB
C++
/*
|
|
* 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 <map>
|
|
#include <memory>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "call/call.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<RtcEventLogOutput> writer = nullptr);
|
|
~VideoQualityAnalyzer();
|
|
void HandleFramePair(VideoFramePair sample);
|
|
std::vector<VideoQualityStats> layer_stats() const;
|
|
VideoQualityStats& stats();
|
|
void PrintHeaders();
|
|
void PrintFrameInfo(const VideoFramePair& sample);
|
|
std::function<void(const VideoFramePair&)> Handler();
|
|
|
|
private:
|
|
void HandleFramePair(VideoFramePair sample, double psnr);
|
|
const VideoQualityAnalyzerConfig config_;
|
|
std::map<int, VideoLayerAnalyzer> layer_analyzers_;
|
|
const std::unique_ptr<RtcEventLogOutput> writer_;
|
|
absl::optional<VideoQualityStats> cached_;
|
|
};
|
|
|
|
class CallStatsCollector {
|
|
public:
|
|
void AddStats(Call::Stats sample);
|
|
CollectedCallStats& stats() { return stats_; }
|
|
|
|
private:
|
|
CollectedCallStats stats_;
|
|
};
|
|
class AudioReceiveStatsCollector {
|
|
public:
|
|
void AddStats(AudioReceiveStream::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(VideoReceiveStream::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_
|