Partial frame capture API part 5
Wire up partial video frames in video quality tests
Bug: webrtc:10152
Change-Id: Ifa13bb308258c8d3930a6cfbcc97c95b132cecf3
Reviewed-on: https://webrtc-review.googlesource.com/c/120410
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26549}
diff --git a/api/test/video_quality_test_fixture.h b/api/test/video_quality_test_fixture.h
index 79b6d67..ff92a20 100644
--- a/api/test/video_quality_test_fixture.h
+++ b/api/test/video_quality_test_fixture.h
@@ -60,6 +60,7 @@
std::string clip_name; // "Generator" to generate frames instead.
size_t capture_device_index;
SdpVideoFormat::Parameters sdp_params;
+ bool partial_updates;
} video[2];
struct Audio {
bool enabled;
diff --git a/video/screenshare_loopback.cc b/video/screenshare_loopback.cc
index a153e2f..e552878 100644
--- a/video/screenshare_loopback.cc
+++ b/video/screenshare_loopback.cc
@@ -299,6 +299,11 @@
WEBRTC_DEFINE_bool(help, false, "prints this message");
+WEBRTC_DEFINE_bool(partial_updates,
+ false,
+ "Pass only changed regions from the "
+ "capturer");
+
} // namespace flags
void Loopback() {
@@ -333,7 +338,10 @@
false, // ULPFEC disabled.
false, // FlexFEC disabled.
false, // Automatic scaling disabled.
- ""};
+ "",
+ 0, // capture_device_index.
+ SdpVideoFormat::Parameters(),
+ flags::FLAG_partial_updates};
params.screenshare[0] = {true, flags::GenerateSlides(),
flags::SlideChangeInterval(),
flags::ScrollDuration(), flags::Slides()};
diff --git a/video/video_analyzer.cc b/video/video_analyzer.cc
index 6535133..2d02d9b 100644
--- a/video/video_analyzer.cc
+++ b/video/video_analyzer.cc
@@ -62,14 +62,15 @@
int selected_tl,
bool is_quick_test_enabled,
Clock* clock,
- std::string rtp_dump_name)
+ std::string rtp_dump_name,
+ bool partial_updates)
: transport_(transport),
receiver_(nullptr),
call_(nullptr),
send_stream_(nullptr),
receive_stream_(nullptr),
audio_receive_stream_(nullptr),
- captured_frame_forwarder_(this, clock, duration_frames),
+ captured_frame_forwarder_(this, clock, duration_frames, partial_updates),
test_label_(test_label),
graph_data_output_file_(graph_data_output_file),
graph_title_(graph_title),
@@ -873,13 +874,17 @@
VideoAnalyzer::CapturedFrameForwarder::CapturedFrameForwarder(
VideoAnalyzer* analyzer,
Clock* clock,
- int frames_to_process)
+ int frames_to_process,
+ bool partial_updates)
: analyzer_(analyzer),
send_stream_input_(nullptr),
video_source_(nullptr),
clock_(clock),
captured_frames_(0),
- frames_to_process_(frames_to_process) {}
+ frames_to_process_(frames_to_process) {
+ if (partial_updates)
+ frame_change_extractor_.reset(new FrameChangeExtractor);
+}
void VideoAnalyzer::CapturedFrameForwarder::SetSource(
VideoSourceInterface<VideoFrame>* video_source) {
@@ -898,8 +903,13 @@
analyzer_->AddCapturedFrameForComparison(copy);
rtc::CritScope lock(&crit_);
++captured_frames_;
- if (send_stream_input_ && captured_frames_ <= frames_to_process_)
+ if (captured_frames_ > frames_to_process_)
+ return;
+ if (frame_change_extractor_) {
+ frame_change_extractor_->OnFrame(copy);
+ } else if (send_stream_input_) {
send_stream_input_->OnFrame(copy);
+ }
}
void VideoAnalyzer::CapturedFrameForwarder::AddOrUpdateSink(
@@ -910,6 +920,9 @@
RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink);
send_stream_input_ = sink;
}
+ if (frame_change_extractor_) {
+ frame_change_extractor_->AddOrUpdateSink(sink, wants);
+ }
if (video_source_) {
video_source_->AddOrUpdateSink(this, wants);
}
@@ -920,6 +933,9 @@
rtc::CritScope lock(&crit_);
RTC_DCHECK(sink == send_stream_input_);
send_stream_input_ = nullptr;
+ if (frame_change_extractor_) {
+ frame_change_extractor_->RemoveSink(sink);
+ }
}
} // namespace webrtc
diff --git a/video/video_analyzer.h b/video/video_analyzer.h
index 8caaf14..759b4e9 100644
--- a/video/video_analyzer.h
+++ b/video/video_analyzer.h
@@ -18,6 +18,7 @@
#include "api/video/video_source_interface.h"
#include "rtc_base/time_utils.h"
+#include "test/frame_change_extractor.h"
#include "test/layer_filtering_transport.h"
#include "test/rtp_file_writer.h"
#include "test/statistics.h"
@@ -42,7 +43,8 @@
int selected_tl,
bool is_quick_test_enabled,
Clock* clock,
- std::string rtp_dump_name);
+ std::string rtp_dump_name,
+ bool partial_updates);
~VideoAnalyzer();
virtual void SetReceiver(PacketReceiver* receiver);
@@ -138,7 +140,8 @@
public:
CapturedFrameForwarder(VideoAnalyzer* analyzer,
Clock* clock,
- int frames_to_process);
+ int frames_to_process,
+ bool partial_updates);
void SetSource(rtc::VideoSourceInterface<VideoFrame>* video_source);
private:
@@ -159,6 +162,7 @@
Clock* clock_;
int captured_frames_ RTC_GUARDED_BY(crit_);
int frames_to_process_ RTC_GUARDED_BY(crit_);
+ std::unique_ptr<FrameChangeExtractor> frame_change_extractor_;
};
struct FrameWithPsnr {
diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc
index 809ea38..2f3d2bb 100644
--- a/video/video_quality_test.cc
+++ b/video/video_quality_test.cc
@@ -1090,7 +1090,8 @@
kSendRtxSsrcs[params_.ss[0].selected_stream],
static_cast<size_t>(params_.ss[0].selected_stream),
params.ss[0].selected_sl, params_.video[0].selected_tl,
- is_quick_test_enabled, clock_, params_.logging.rtp_dump_name);
+ is_quick_test_enabled, clock_, params_.logging.rtp_dump_name,
+ params_.video[0].partial_updates);
task_queue_.SendTask([&]() {
analyzer_->SetCall(sender_call_.get());
@@ -1356,6 +1357,15 @@
rtc::VideoSinkWants());
}
ConnectVideoSourcesToStreams();
+ if (params_.video[0].partial_updates) {
+ frame_change_extractor_.reset(new FrameChangeExtractor());
+ frame_change_extractor_->SetSource(video_sources_[0].get());
+ video_send_streams_[0]->SetSource(frame_change_extractor_.get(),
+ degradation_preference_);
+ } else {
+ video_send_streams_[0]->SetSource(video_sources_[0].get(),
+ degradation_preference_);
+ }
}
if (params_.audio.enabled) {
diff --git a/video/video_quality_test.h b/video/video_quality_test.h
index 028dddf..e41d6f2 100644
--- a/video/video_quality_test.h
+++ b/video/video_quality_test.h
@@ -22,6 +22,7 @@
#include "media/engine/internal_decoder_factory.h"
#include "media/engine/internal_encoder_factory.h"
#include "test/call_test.h"
+#include "test/frame_change_extractor.h"
#include "test/frame_generator.h"
#include "test/layer_filtering_transport.h"
#include "video/video_analyzer.h"
@@ -114,6 +115,8 @@
std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
+ std::unique_ptr<FrameChangeExtractor> frame_change_extractor_;
+
int receive_logs_;
int send_logs_;