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}
This commit is contained in:
Ilya Nikolaevskiy
2019-02-05 14:35:33 +01:00
committed by Commit Bot
parent 62b9fb44aa
commit 1f0a84a2ec
6 changed files with 51 additions and 9 deletions

View File

@ -60,6 +60,7 @@ class VideoQualityTestFixtureInterface {
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;

View File

@ -299,6 +299,11 @@ std::vector<std::string> Slides() {
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 @@ void Loopback() {
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()};

View File

@ -62,14 +62,15 @@ VideoAnalyzer::VideoAnalyzer(test::LayerFilteringTransport* transport,
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::Sample::Sample(int dropped,
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 @@ void VideoAnalyzer::CapturedFrameForwarder::OnFrame(
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 @@ void VideoAnalyzer::CapturedFrameForwarder::AddOrUpdateSink(
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 @@ void VideoAnalyzer::CapturedFrameForwarder::RemoveSink(
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

View File

@ -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 @@ class VideoAnalyzer : public PacketReceiver,
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 @@ class VideoAnalyzer : public PacketReceiver,
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 @@ class VideoAnalyzer : public PacketReceiver,
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 {

View File

@ -1090,7 +1090,8 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) {
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 @@ void VideoQualityTest::RunWithRenderers(const Params& params) {
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) {

View File

@ -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 @@ class VideoQualityTest :
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_;