Add ability to configure sampling rate for input/output video dumps in PC level framework
Bug: b/179986638
Change-Id: I9ab960840e4b8f912abe4fb79cfd9278f4d4562a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/208760
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33350}
diff --git a/api/test/peerconnection_quality_test_fixture.h b/api/test/peerconnection_quality_test_fixture.h
index f370478..8717e8f 100644
--- a/api/test/peerconnection_quality_test_fixture.h
+++ b/api/test/peerconnection_quality_test_fixture.h
@@ -220,11 +220,19 @@
// was captured during the test for this video stream on sender side.
// It is useful when generator is used as input.
absl::optional<std::string> input_dump_file_name;
+ // Used only if |input_dump_file_name| is set. Specifies the module for the
+ // video frames to be dumped. Modulo equals X means every Xth frame will be
+ // written to the dump file. The value must be greater than 0.
+ int input_dump_sampling_modulo = 1;
// If specified this file will be used as output on the receiver side for
// this stream. If multiple streams will be produced by input stream,
// output files will be appended with indexes. The produced files contains
// what was rendered for this video stream on receiver side.
absl::optional<std::string> output_dump_file_name;
+ // Used only if |output_dump_file_name| is set. Specifies the module for the
+ // video frames to be dumped. Modulo equals X means every Xth frame will be
+ // written to the dump file. The value must be greater than 0.
+ int output_dump_sampling_modulo = 1;
// If true will display input and output video on the user's screen.
bool show_on_screen = false;
// If specified, determines a sync group to which this video stream belongs.
diff --git a/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc b/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc
index ebfb416..6d14558 100644
--- a/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc
+++ b/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc
@@ -28,17 +28,23 @@
class VideoWriter final : public rtc::VideoSinkInterface<VideoFrame> {
public:
- VideoWriter(test::VideoFrameWriter* video_writer)
- : video_writer_(video_writer) {}
+ VideoWriter(test::VideoFrameWriter* video_writer, int sampling_modulo)
+ : video_writer_(video_writer), sampling_modulo_(sampling_modulo) {}
~VideoWriter() override = default;
void OnFrame(const VideoFrame& frame) override {
+ if (frames_counter_++ % sampling_modulo_ != 0) {
+ return;
+ }
bool result = video_writer_->WriteFrame(frame);
RTC_CHECK(result) << "Failed to write frame";
}
private:
- test::VideoFrameWriter* video_writer_;
+ test::VideoFrameWriter* const video_writer_;
+ const int sampling_modulo_;
+
+ int64_t frames_counter_ = 0;
};
class AnalyzingFramePreprocessor
@@ -122,7 +128,8 @@
test::VideoFrameWriter* writer =
MaybeCreateVideoWriter(config.input_dump_file_name, config);
if (writer) {
- sinks.push_back(std::make_unique<VideoWriter>(writer));
+ sinks.push_back(std::make_unique<VideoWriter>(
+ writer, config.input_dump_sampling_modulo));
}
if (config.show_on_screen) {
sinks.push_back(absl::WrapUnique(
@@ -225,7 +232,8 @@
test::VideoFrameWriter* writer =
MaybeCreateVideoWriter(config.output_dump_file_name, config);
if (writer) {
- sinks.push_back(std::make_unique<VideoWriter>(writer));
+ sinks.push_back(std::make_unique<VideoWriter>(
+ writer, config.output_dump_sampling_modulo));
}
if (config.show_on_screen) {
sinks.push_back(absl::WrapUnique(
diff --git a/test/pc/e2e/peer_configurer.cc b/test/pc/e2e/peer_configurer.cc
index b5616b5..18570c2 100644
--- a/test/pc/e2e/peer_configurer.cc
+++ b/test/pc/e2e/peer_configurer.cc
@@ -134,6 +134,15 @@
RTC_CHECK(inserted) << "Duplicate video_config.stream_label="
<< video_config.stream_label.value();
+ if (video_config.input_dump_file_name.has_value()) {
+ RTC_CHECK_GT(video_config.input_dump_sampling_modulo, 0)
+ << "video_config.input_dump_sampling_modulo must be greater than 0";
+ }
+ if (video_config.output_dump_file_name.has_value()) {
+ RTC_CHECK_GT(video_config.output_dump_sampling_modulo, 0)
+ << "video_config.input_dump_sampling_modulo must be greater than 0";
+ }
+
// TODO(bugs.webrtc.org/4762): remove this check after synchronization of
// more than two streams is supported.
if (video_config.sync_group.has_value()) {