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:
committed by
Commit Bot
parent
62b9fb44aa
commit
1f0a84a2ec
@ -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;
|
||||
|
||||
@ -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()};
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user