Chromium Code Reviews| 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..6430b3e634e5b9932ddd624a726ecc878fd7a9d7 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" |
| @@ -218,6 +219,13 @@ class VideoAnalyzer : public PacketReceiver, |
| virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } |
| + void SetSource(test::VideoCapturer* video_capturer, bool respectSinkWants) { |
|
sprang_webrtc
2017/06/16 08:57:23
nit: no camelcase
ilnik
2017/06/16 11:22:48
Done.
|
| + if (respectSinkWants) |
| + 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 +789,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); |
| } |
| @@ -901,7 +909,13 @@ class VideoAnalyzer : public PacketReceiver, |
| public rtc::VideoSourceInterface<VideoFrame> { |
| public: |
| explicit CapturedFrameForwarder(VideoAnalyzer* analyzer) |
| - : analyzer_(analyzer), send_stream_input_(nullptr) {} |
| + : analyzer_(analyzer), |
| + send_stream_input_(nullptr), |
| + video_capturer_(nullptr) {} |
| + |
| + void SetSource(test::VideoCapturer* video_capturer) { |
| + video_capturer_ = video_capturer; |
| + } |
| private: |
| void OnFrame(const VideoFrame& video_frame) override { |
| @@ -909,8 +923,9 @@ 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::GetRealTimeClock()->CurrentNtpInMilliseconds()); |
|
sprang_webrtc
2017/06/16 08:57:23
Add a member for the clock instance instead of cal
ilnik
2017/06/16 11:22:48
Done.
|
| copy.set_timestamp(copy.ntp_time_ms() * 90); |
| analyzer_->AddCapturedFrameForComparison(copy); |
| rtc::CritScope lock(&crit_); |
| @@ -924,6 +939,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 +954,7 @@ class VideoAnalyzer : public PacketReceiver, |
| VideoAnalyzer* const analyzer_; |
| rtc::CriticalSection crit_; |
| rtc::VideoSinkInterface<VideoFrame>* send_stream_input_ GUARDED_BY(crit_); |
| + test::VideoCapturer* video_capturer_; |
| }; |
| void AddCapturedFrameForComparison(const VideoFrame& video_frame) { |
| @@ -1237,6 +1256,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 +1338,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 +1449,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 +1597,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)); |
| @@ -1661,8 +1698,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]); |