Index: webrtc/video/video_quality_test.cc |
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
index 76c743c8063bbc253141a17c9ec3ad4b2caa9c06..65aea64e4d67ba242feb8a22a4dde754c6c090c3 100644 |
--- a/webrtc/video/video_quality_test.cc |
+++ b/webrtc/video/video_quality_test.cc |
@@ -29,6 +29,7 @@ |
#include "webrtc/call/call.h" |
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
#include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
+#include "webrtc/media/engine/webrtcvideoengine.h" |
#include "webrtc/modules/audio_mixer/audio_mixer_impl.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_format.h" |
@@ -147,12 +148,13 @@ class VideoAnalyzer : public PacketReceiver, |
size_t selected_stream, |
int selected_sl, |
int selected_tl, |
- bool is_quick_test_enabled) |
+ bool is_quick_test_enabled, |
+ Clock* clock) |
: transport_(transport), |
receiver_(nullptr), |
send_stream_(nullptr), |
receive_stream_(nullptr), |
- captured_frame_forwarder_(this), |
+ captured_frame_forwarder_(this, clock), |
test_label_(test_label), |
graph_data_output_file_(graph_data_output_file), |
graph_title_(graph_title), |
@@ -218,6 +220,13 @@ class VideoAnalyzer : public PacketReceiver, |
virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } |
+ void SetSource(test::VideoCapturer* video_capturer, bool respect_sink_wants) { |
+ if (respect_sink_wants) |
+ captured_frame_forwarder_.SetSource(video_capturer); |
+ rtc::VideoSinkWants wants; |
+ video_capturer->AddOrUpdateSink(InputInterface(), wants); |
+ } |
+ |
void SetSendStream(VideoSendStream* stream) { |
rtc::CritScope lock(&crit_); |
RTC_DCHECK(!send_stream_); |
@@ -781,7 +790,7 @@ class VideoAnalyzer : public PacketReceiver, |
// Perform expensive psnr and ssim calculations while not holding lock. |
double psnr = -1.0; |
double ssim = -1.0; |
- if (comparison.reference) { |
+ if (comparison.reference && !comparison.dropped) { |
psnr = I420PSNR(&*comparison.reference, &*comparison.render); |
ssim = I420SSIM(&*comparison.reference, &*comparison.render); |
} |
@@ -900,8 +909,15 @@ class VideoAnalyzer : public PacketReceiver, |
class CapturedFrameForwarder : public rtc::VideoSinkInterface<VideoFrame>, |
public rtc::VideoSourceInterface<VideoFrame> { |
public: |
- explicit CapturedFrameForwarder(VideoAnalyzer* analyzer) |
- : analyzer_(analyzer), send_stream_input_(nullptr) {} |
+ explicit CapturedFrameForwarder(VideoAnalyzer* analyzer, Clock* clock) |
+ : analyzer_(analyzer), |
+ send_stream_input_(nullptr), |
+ video_capturer_(nullptr), |
+ clock_(clock) {} |
+ |
+ void SetSource(test::VideoCapturer* video_capturer) { |
+ video_capturer_ = video_capturer; |
+ } |
private: |
void OnFrame(const VideoFrame& video_frame) override { |
@@ -909,8 +925,8 @@ class VideoAnalyzer : public PacketReceiver, |
// Frames from the capturer does not have a rtp timestamp. |
// Create one so it can be used for comparison. |
RTC_DCHECK_EQ(0, video_frame.timestamp()); |
- if (copy.ntp_time_ms() == 0) |
- copy.set_ntp_time_ms(rtc::TimeMillis()); |
+ if (video_frame.ntp_time_ms() == 0) |
+ copy.set_ntp_time_ms(clock_->CurrentNtpInMilliseconds()); |
copy.set_timestamp(copy.ntp_time_ms() * 90); |
analyzer_->AddCapturedFrameForComparison(copy); |
rtc::CritScope lock(&crit_); |
@@ -924,6 +940,9 @@ class VideoAnalyzer : public PacketReceiver, |
rtc::CritScope lock(&crit_); |
RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink); |
send_stream_input_ = sink; |
+ if (video_capturer_) { |
+ video_capturer_->AddOrUpdateSink(this, wants); |
+ } |
} |
// Called by |send_stream_| when |send_stream_.SetSource()| is called. |
@@ -936,6 +955,8 @@ class VideoAnalyzer : public PacketReceiver, |
VideoAnalyzer* const analyzer_; |
rtc::CriticalSection crit_; |
rtc::VideoSinkInterface<VideoFrame>* send_stream_input_ GUARDED_BY(crit_); |
+ test::VideoCapturer* video_capturer_; |
+ Clock* clock_; |
}; |
void AddCapturedFrameForComparison(const VideoFrame& video_frame) { |
@@ -1237,6 +1258,7 @@ void VideoQualityTest::FillScalabilitySettings( |
params->ss.streams.push_back(stream); |
} |
params->ss.selected_stream = selected_stream; |
+ params->ss.infer_streams = false; |
params->ss.num_spatial_layers = num_spatial_layers ? num_spatial_layers : 1; |
params->ss.selected_sl = selected_sl; |
@@ -1318,8 +1340,15 @@ void VideoQualityTest::SetupVideo(Transport* send_transport, |
video_encoder_config_.max_bitrate_bps += |
params_.ss.streams[i].max_bitrate_bps; |
} |
- video_encoder_config_.video_stream_factory = |
- new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams); |
+ if (params_.ss.infer_streams) { |
+ video_encoder_config_.video_stream_factory = |
+ new rtc::RefCountedObject<cricket::EncoderStreamFactory>( |
+ params_.video.codec, params_.ss.streams[0].max_qp, |
+ params_.video.fps, params_.screenshare.enabled, true); |
+ } else { |
+ video_encoder_config_.video_stream_factory = |
+ new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams); |
+ } |
video_encoder_config_.spatial_layers = params_.ss.spatial_layers; |
@@ -1422,9 +1451,15 @@ void VideoQualityTest::SetupThumbnails(Transport* send_transport, |
params_.video.suspend_below_min_bitrate; |
thumbnail_encoder_config.number_of_streams = 1; |
thumbnail_encoder_config.max_bitrate_bps = 50000; |
- thumbnail_encoder_config.video_stream_factory = |
- new rtc::RefCountedObject<VideoStreamFactory>( |
- std::vector<webrtc::VideoStream>{DefaultThumbnailStream()}); |
+ if (params_.ss.infer_streams) { |
+ thumbnail_encoder_config.video_stream_factory = |
+ new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams); |
+ } else { |
+ thumbnail_encoder_config.video_stream_factory = |
+ new rtc::RefCountedObject<cricket::EncoderStreamFactory>( |
+ params_.video.codec, params_.ss.streams[0].max_qp, |
+ params_.video.fps, params_.screenshare.enabled, true); |
+ } |
thumbnail_encoder_config.spatial_layers = params_.ss.spatial_layers; |
VideoReceiveStream::Config thumbnail_receive_config(send_transport); |
@@ -1564,7 +1599,11 @@ void VideoQualityTest::CreateCapturer() { |
EXPECT_TRUE(frame_generator_capturer->Init()); |
video_capturer_.reset(frame_generator_capturer); |
} else { |
- if (params_.video.clip_name.empty()) { |
+ if (params_.video.clip_name == "Generator") { |
+ video_capturer_.reset(test::FrameGeneratorCapturer::Create( |
+ static_cast<int>(params_.video.width), |
+ static_cast<int>(params_.video.height), params_.video.fps, clock_)); |
+ } else if (params_.video.clip_name.empty()) { |
video_capturer_.reset(test::VcmCapturer::Create( |
params_.video.width, params_.video.height, params_.video.fps, |
params_.video.capture_device_index)); |
@@ -1630,7 +1669,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
kVideoSendSsrcs[params_.ss.selected_stream], |
kSendRtxSsrcs[params_.ss.selected_stream], |
static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl, |
- params_.video.selected_tl, is_quick_test_enabled); |
+ params_.video.selected_tl, is_quick_test_enabled, clock_); |
analyzer.SetReceiver(receiver_call_->Receiver()); |
send_transport.SetReceiver(&analyzer); |
recv_transport.SetReceiver(sender_call_->Receiver()); |
@@ -1661,8 +1700,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
CreateCapturer(); |
- rtc::VideoSinkWants wants; |
- video_capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants); |
+ analyzer.SetSource(video_capturer_.get(), params_.ss.infer_streams); |
StartEncodedFrameLogs(video_send_stream_); |
StartEncodedFrameLogs(video_receive_streams_[0]); |