| Index: webrtc/video/video_quality_test.cc
|
| diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
|
| index 0e23373ac61e3038816e523fa193f07a04a3c713..b754d295485342a208420502be117e28ab1ee87e 100644
|
| --- a/webrtc/video/video_quality_test.cc
|
| +++ b/webrtc/video/video_quality_test.cc
|
| @@ -137,8 +137,8 @@ class VideoAnalyzer : public PacketReceiver,
|
| const std::string& graph_title,
|
| uint32_t ssrc_to_analyze,
|
| uint32_t rtx_ssrc_to_analyze,
|
| - uint32_t selected_width,
|
| - uint32_t selected_height,
|
| + uint32_t selected_stream_width,
|
| + uint32_t selected_stream_height,
|
| bool is_quick_test_enabled)
|
| : transport_(transport),
|
| receiver_(nullptr),
|
| @@ -150,8 +150,8 @@ class VideoAnalyzer : public PacketReceiver,
|
| graph_title_(graph_title),
|
| ssrc_to_analyze_(ssrc_to_analyze),
|
| rtx_ssrc_to_analyze_(rtx_ssrc_to_analyze),
|
| - selected_width_(selected_width),
|
| - selected_height_(selected_height),
|
| + selected_stream_width_(selected_stream_width),
|
| + selected_stream_height_(selected_stream_height),
|
| pre_encode_proxy_(this),
|
| encode_timing_proxy_(this),
|
| frames_to_process_(duration_frames),
|
| @@ -232,7 +232,6 @@ class VideoAnalyzer : public PacketReceiver,
|
| if (RtpHeaderParser::IsRtcp(packet, length)) {
|
| return receiver_->DeliverPacket(media_type, packet, length, packet_time);
|
| }
|
| -
|
| RtpUtility::RtpHeaderParser parser(packet, length);
|
| RTPHeader header;
|
| parser.Parse(&header);
|
| @@ -274,8 +273,8 @@ class VideoAnalyzer : public PacketReceiver,
|
| void PostEncodeFrameCallback(const EncodedFrame& encoded_frame) {
|
| rtc::CritScope lock(&crit_);
|
| if (!first_sent_timestamp_ &&
|
| - encoded_frame.encoded_width_ == selected_width_ &&
|
| - encoded_frame.encoded_height_ == selected_height_) {
|
| + encoded_frame.encoded_width_ == selected_stream_width_ &&
|
| + encoded_frame.encoded_height_ == selected_stream_height_) {
|
| first_sent_timestamp_ = rtc::Optional<uint32_t>(encoded_frame.timestamp_);
|
| }
|
| }
|
| @@ -289,6 +288,7 @@ class VideoAnalyzer : public PacketReceiver,
|
|
|
| int64_t current_time =
|
| Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
|
| +
|
| bool result = transport_->SendRtp(packet, length, options);
|
| {
|
| rtc::CritScope lock(&crit_);
|
| @@ -857,8 +857,8 @@ class VideoAnalyzer : public PacketReceiver,
|
| const std::string graph_title_;
|
| const uint32_t ssrc_to_analyze_;
|
| const uint32_t rtx_ssrc_to_analyze_;
|
| - const uint32_t selected_width_;
|
| - const uint32_t selected_height_;
|
| + const uint32_t selected_stream_width_;
|
| + const uint32_t selected_stream_height_;
|
| PreEncodeProxy pre_encode_proxy_;
|
| OnEncodeTimingProxy encode_timing_proxy_;
|
| std::vector<Sample> samples_ GUARDED_BY(comparison_lock_);
|
| @@ -1206,25 +1206,67 @@ void VideoQualityTest::SetupVideo(Transport* send_transport,
|
| }
|
| }
|
|
|
| -void VideoQualityTest::SetupScreenshare() {
|
| - RTC_CHECK(params_.screenshare.enabled);
|
| -
|
| - // Fill out codec settings.
|
| - video_encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
|
| - degradation_preference_ =
|
| - VideoSendStream::DegradationPreference::kMaintainResolution;
|
| - if (params_.video.codec == "VP8") {
|
| - VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
|
| - vp8_settings.denoisingOn = false;
|
| - vp8_settings.frameDroppingOn = false;
|
| - vp8_settings.numberOfTemporalLayers =
|
| - static_cast<unsigned char>(params_.video.num_temporal_layers);
|
| - video_encoder_config_.encoder_specific_settings = new rtc::RefCountedObject<
|
| - VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
|
| - } else if (params_.video.codec == "VP9") {
|
| +void VideoQualityTest::SetupScreenshareOrSVC() {
|
| + if (params_.screenshare.enabled) {
|
| + // Fill out codec settings.
|
| + video_encoder_config_.content_type =
|
| + VideoEncoderConfig::ContentType::kScreen;
|
| + degradation_preference_ =
|
| + VideoSendStream::DegradationPreference::kMaintainResolution;
|
| + if (params_.video.codec == "VP8") {
|
| + VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
|
| + vp8_settings.denoisingOn = false;
|
| + vp8_settings.frameDroppingOn = false;
|
| + vp8_settings.numberOfTemporalLayers =
|
| + static_cast<unsigned char>(params_.video.num_temporal_layers);
|
| + video_encoder_config_.encoder_specific_settings =
|
| + new rtc::RefCountedObject<
|
| + VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
|
| + } else if (params_.video.codec == "VP9") {
|
| + VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
|
| + vp9_settings.denoisingOn = false;
|
| + vp9_settings.frameDroppingOn = false;
|
| + vp9_settings.numberOfTemporalLayers =
|
| + static_cast<unsigned char>(params_.video.num_temporal_layers);
|
| + vp9_settings.numberOfSpatialLayers =
|
| + static_cast<unsigned char>(params_.ss.num_spatial_layers);
|
| + video_encoder_config_.encoder_specific_settings =
|
| + new rtc::RefCountedObject<
|
| + VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
|
| + }
|
| + // Setup frame generator.
|
| + const size_t kWidth = 1850;
|
| + const size_t kHeight = 1110;
|
| + std::vector<std::string> slides;
|
| + slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv"));
|
| + slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv"));
|
| + slides.push_back(test::ResourcePath("photo_1850_1110", "yuv"));
|
| + slides.push_back(test::ResourcePath("difficult_photo_1850_1110", "yuv"));
|
| +
|
| + if (params_.screenshare.scroll_duration == 0) {
|
| + // Cycle image every slide_change_interval seconds.
|
| + frame_generator_.reset(test::FrameGenerator::CreateFromYuvFile(
|
| + slides, kWidth, kHeight,
|
| + params_.screenshare.slide_change_interval * params_.video.fps));
|
| + } else {
|
| + RTC_CHECK_LE(params_.video.width, kWidth);
|
| + RTC_CHECK_LE(params_.video.height, kHeight);
|
| + RTC_CHECK_GT(params_.screenshare.slide_change_interval, 0);
|
| + const int kPauseDurationMs = (params_.screenshare.slide_change_interval -
|
| + params_.screenshare.scroll_duration) *
|
| + 1000;
|
| + RTC_CHECK_LE(params_.screenshare.scroll_duration,
|
| + params_.screenshare.slide_change_interval);
|
| +
|
| + frame_generator_.reset(
|
| + test::FrameGenerator::CreateScrollingInputFromYuvFiles(
|
| + clock_, slides, kWidth, kHeight, params_.video.width,
|
| + params_.video.height, params_.screenshare.scroll_duration * 1000,
|
| + kPauseDurationMs));
|
| + }
|
| + } else if (params_.ss.num_spatial_layers > 1) { // For non-screenshare case.
|
| + RTC_CHECK(params_.video.codec == "VP9");
|
| VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
|
| - vp9_settings.denoisingOn = false;
|
| - vp9_settings.frameDroppingOn = false;
|
| vp9_settings.numberOfTemporalLayers =
|
| static_cast<unsigned char>(params_.video.num_temporal_layers);
|
| vp9_settings.numberOfSpatialLayers =
|
| @@ -1232,37 +1274,6 @@ void VideoQualityTest::SetupScreenshare() {
|
| video_encoder_config_.encoder_specific_settings = new rtc::RefCountedObject<
|
| VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
|
| }
|
| -
|
| - // Setup frame generator.
|
| - const size_t kWidth = 1850;
|
| - const size_t kHeight = 1110;
|
| - std::vector<std::string> slides;
|
| - slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv"));
|
| - slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv"));
|
| - slides.push_back(test::ResourcePath("photo_1850_1110", "yuv"));
|
| - slides.push_back(test::ResourcePath("difficult_photo_1850_1110", "yuv"));
|
| -
|
| - if (params_.screenshare.scroll_duration == 0) {
|
| - // Cycle image every slide_change_interval seconds.
|
| - frame_generator_.reset(test::FrameGenerator::CreateFromYuvFile(
|
| - slides, kWidth, kHeight,
|
| - params_.screenshare.slide_change_interval * params_.video.fps));
|
| - } else {
|
| - RTC_CHECK_LE(params_.video.width, kWidth);
|
| - RTC_CHECK_LE(params_.video.height, kHeight);
|
| - RTC_CHECK_GT(params_.screenshare.slide_change_interval, 0);
|
| - const int kPauseDurationMs = (params_.screenshare.slide_change_interval -
|
| - params_.screenshare.scroll_duration) *
|
| - 1000;
|
| - RTC_CHECK_LE(params_.screenshare.scroll_duration,
|
| - params_.screenshare.slide_change_interval);
|
| -
|
| - frame_generator_.reset(
|
| - test::FrameGenerator::CreateScrollingInputFromYuvFiles(
|
| - clock_, slides, kWidth, kHeight, params_.video.width,
|
| - params_.video.height, params_.screenshare.scroll_duration * 1000,
|
| - kPauseDurationMs));
|
| - }
|
| }
|
|
|
| void VideoQualityTest::CreateCapturer() {
|
| @@ -1332,27 +1343,13 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) {
|
| // 0.0 by default. Setting the thresholds to -1.1 prevents the unnecessary
|
| // abort.
|
| VideoStream& selected_stream = params_.ss.streams[params_.ss.selected_stream];
|
| - int selected_sl = params_.ss.selected_sl != -1
|
| - ? params_.ss.selected_sl
|
| - : params_.ss.num_spatial_layers - 1;
|
| - bool disable_quality_check =
|
| - selected_stream.width != params_.video.width ||
|
| - selected_stream.height != params_.video.height ||
|
| - (!params_.ss.spatial_layers.empty() &&
|
| - params_.ss.spatial_layers[selected_sl].scaling_factor_num !=
|
| - params_.ss.spatial_layers[selected_sl].scaling_factor_den);
|
| - if (disable_quality_check) {
|
| - fprintf(stderr,
|
| - "Warning: Calculating PSNR and SSIM for downsized resolution "
|
| - "not implemented yet! Skipping PSNR and SSIM calculations!\n");
|
| - }
|
|
|
| bool is_quick_test_enabled =
|
| field_trial::FindFullName("WebRTC-QuickPerfTest") == "Enabled";
|
| VideoAnalyzer analyzer(
|
| &send_transport, params_.analyzer.test_label,
|
| - disable_quality_check ? -1.1 : params_.analyzer.avg_psnr_threshold,
|
| - disable_quality_check ? -1.1 : params_.analyzer.avg_ssim_threshold,
|
| +
|
| + params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold,
|
| is_quick_test_enabled
|
| ? kFramesSentInQuickTest
|
| : params_.analyzer.test_durations_secs * params_.video.fps,
|
| @@ -1373,8 +1370,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) {
|
| RTC_DCHECK(!video_send_config_.post_encode_callback);
|
| video_send_config_.post_encode_callback = analyzer.encode_timing_proxy();
|
|
|
| - if (params_.screenshare.enabled)
|
| - SetupScreenshare();
|
| + SetupScreenshareOrSVC();
|
|
|
| CreateFlexfecStreams();
|
| CreateVideoStreams();
|
| @@ -1513,7 +1509,7 @@ void VideoQualityTest::RunWithRenderers(const Params& params) {
|
| video_receive_configs_[stream_id].sync_group = kSyncGroup;
|
|
|
| if (params_.screenshare.enabled)
|
| - SetupScreenshare();
|
| + SetupScreenshareOrSVC();
|
|
|
| video_send_stream_ = call->CreateVideoSendStream(
|
| video_send_config_.Copy(), video_encoder_config_.Copy());
|
|
|