| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 #include "webrtc/video/video_quality_test.h" | 10 #include "webrtc/video/video_quality_test.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "webrtc/system_wrappers/include/field_trial.h" | 42 #include "webrtc/system_wrappers/include/field_trial.h" |
| 43 #include "webrtc/test/gtest.h" | 43 #include "webrtc/test/gtest.h" |
| 44 #include "webrtc/test/layer_filtering_transport.h" | 44 #include "webrtc/test/layer_filtering_transport.h" |
| 45 #include "webrtc/test/run_loop.h" | 45 #include "webrtc/test/run_loop.h" |
| 46 #include "webrtc/test/statistics.h" | 46 #include "webrtc/test/statistics.h" |
| 47 #include "webrtc/test/testsupport/fileutils.h" | 47 #include "webrtc/test/testsupport/fileutils.h" |
| 48 #include "webrtc/test/vcm_capturer.h" | 48 #include "webrtc/test/vcm_capturer.h" |
| 49 #include "webrtc/test/video_renderer.h" | 49 #include "webrtc/test/video_renderer.h" |
| 50 #include "webrtc/voice_engine/include/voe_base.h" | 50 #include "webrtc/voice_engine/include/voe_base.h" |
| 51 | 51 |
| 52 #include "webrtc/test/rtp_file_writer.h" |
| 53 |
| 52 namespace { | 54 namespace { |
| 53 | 55 |
| 54 constexpr int kSendStatsPollingIntervalMs = 1000; | 56 constexpr int kSendStatsPollingIntervalMs = 1000; |
| 55 | 57 |
| 56 constexpr size_t kMaxComparisons = 10; | 58 constexpr size_t kMaxComparisons = 10; |
| 57 constexpr char kSyncGroup[] = "av_sync"; | 59 constexpr char kSyncGroup[] = "av_sync"; |
| 58 constexpr int kOpusMinBitrateBps = 6000; | 60 constexpr int kOpusMinBitrateBps = 6000; |
| 59 constexpr int kOpusBitrateFbBps = 32000; | 61 constexpr int kOpusBitrateFbBps = 32000; |
| 60 constexpr int kFramesSentInQuickTest = 1; | 62 constexpr int kFramesSentInQuickTest = 1; |
| 61 constexpr uint32_t kThumbnailSendSsrcStart = 0xE0000; | 63 constexpr uint32_t kThumbnailSendSsrcStart = 0xE0000; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 double avg_ssim_threshold, | 144 double avg_ssim_threshold, |
| 143 int duration_frames, | 145 int duration_frames, |
| 144 FILE* graph_data_output_file, | 146 FILE* graph_data_output_file, |
| 145 const std::string& graph_title, | 147 const std::string& graph_title, |
| 146 uint32_t ssrc_to_analyze, | 148 uint32_t ssrc_to_analyze, |
| 147 uint32_t rtx_ssrc_to_analyze, | 149 uint32_t rtx_ssrc_to_analyze, |
| 148 size_t selected_stream, | 150 size_t selected_stream, |
| 149 int selected_sl, | 151 int selected_sl, |
| 150 int selected_tl, | 152 int selected_tl, |
| 151 bool is_quick_test_enabled, | 153 bool is_quick_test_enabled, |
| 152 Clock* clock) | 154 Clock* clock, |
| 155 std::string rtp_dump_name) |
| 153 : transport_(transport), | 156 : transport_(transport), |
| 154 receiver_(nullptr), | 157 receiver_(nullptr), |
| 155 call_(nullptr), | 158 call_(nullptr), |
| 156 send_stream_(nullptr), | 159 send_stream_(nullptr), |
| 157 receive_stream_(nullptr), | 160 receive_stream_(nullptr), |
| 158 captured_frame_forwarder_(this, clock), | 161 captured_frame_forwarder_(this, clock), |
| 159 test_label_(test_label), | 162 test_label_(test_label), |
| 160 graph_data_output_file_(graph_data_output_file), | 163 graph_data_output_file_(graph_data_output_file), |
| 161 graph_title_(graph_title), | 164 graph_title_(graph_title), |
| 162 ssrc_to_analyze_(ssrc_to_analyze), | 165 ssrc_to_analyze_(ssrc_to_analyze), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 178 total_media_bytes_(0), | 181 total_media_bytes_(0), |
| 179 first_sending_time_(0), | 182 first_sending_time_(0), |
| 180 last_sending_time_(0), | 183 last_sending_time_(0), |
| 181 cpu_time_(0), | 184 cpu_time_(0), |
| 182 wallclock_time_(0), | 185 wallclock_time_(0), |
| 183 avg_psnr_threshold_(avg_psnr_threshold), | 186 avg_psnr_threshold_(avg_psnr_threshold), |
| 184 avg_ssim_threshold_(avg_ssim_threshold), | 187 avg_ssim_threshold_(avg_ssim_threshold), |
| 185 is_quick_test_enabled_(is_quick_test_enabled), | 188 is_quick_test_enabled_(is_quick_test_enabled), |
| 186 stats_polling_thread_(&PollStatsThread, this, "StatsPoller"), | 189 stats_polling_thread_(&PollStatsThread, this, "StatsPoller"), |
| 187 comparison_available_event_(false, false), | 190 comparison_available_event_(false, false), |
| 188 done_(true, false) { | 191 done_(true, false), |
| 192 clock_(clock), |
| 193 start_ms_(clock->TimeInMilliseconds()) { |
| 189 // Create thread pool for CPU-expensive PSNR/SSIM calculations. | 194 // Create thread pool for CPU-expensive PSNR/SSIM calculations. |
| 190 | 195 |
| 191 // Try to use about as many threads as cores, but leave kMinCoresLeft alone, | 196 // Try to use about as many threads as cores, but leave kMinCoresLeft alone, |
| 192 // so that we don't accidentally starve "real" worker threads (codec etc). | 197 // so that we don't accidentally starve "real" worker threads (codec etc). |
| 193 // Also, don't allocate more than kMaxComparisonThreads, even if there are | 198 // Also, don't allocate more than kMaxComparisonThreads, even if there are |
| 194 // spare cores. | 199 // spare cores. |
| 195 | 200 |
| 196 uint32_t num_cores = CpuInfo::DetectNumberOfCores(); | 201 uint32_t num_cores = CpuInfo::DetectNumberOfCores(); |
| 197 RTC_DCHECK_GE(num_cores, 1); | 202 RTC_DCHECK_GE(num_cores, 1); |
| 198 static const uint32_t kMinCoresLeft = 4; | 203 static const uint32_t kMinCoresLeft = 4; |
| 199 static const uint32_t kMaxComparisonThreads = 8; | 204 static const uint32_t kMaxComparisonThreads = 8; |
| 200 | 205 |
| 201 if (num_cores <= kMinCoresLeft) { | 206 if (num_cores <= kMinCoresLeft) { |
| 202 num_cores = 1; | 207 num_cores = 1; |
| 203 } else { | 208 } else { |
| 204 num_cores -= kMinCoresLeft; | 209 num_cores -= kMinCoresLeft; |
| 205 num_cores = std::min(num_cores, kMaxComparisonThreads); | 210 num_cores = std::min(num_cores, kMaxComparisonThreads); |
| 206 } | 211 } |
| 207 | 212 |
| 208 for (uint32_t i = 0; i < num_cores; ++i) { | 213 for (uint32_t i = 0; i < num_cores; ++i) { |
| 209 rtc::PlatformThread* thread = | 214 rtc::PlatformThread* thread = |
| 210 new rtc::PlatformThread(&FrameComparisonThread, this, "Analyzer"); | 215 new rtc::PlatformThread(&FrameComparisonThread, this, "Analyzer"); |
| 211 thread->Start(); | 216 thread->Start(); |
| 212 comparison_thread_pool_.push_back(thread); | 217 comparison_thread_pool_.push_back(thread); |
| 213 } | 218 } |
| 219 |
| 220 if (!rtp_dump_name.empty()) { |
| 221 fprintf(stdout, "Writing rtp dump to %s\n", rtp_dump_name.c_str()); |
| 222 rtp_file_writer_.reset(test::RtpFileWriter::Create( |
| 223 test::RtpFileWriter::kRtpDump, rtp_dump_name)); |
| 224 } |
| 214 } | 225 } |
| 215 | 226 |
| 216 ~VideoAnalyzer() { | 227 ~VideoAnalyzer() { |
| 217 for (rtc::PlatformThread* thread : comparison_thread_pool_) { | 228 for (rtc::PlatformThread* thread : comparison_thread_pool_) { |
| 218 thread->Stop(); | 229 thread->Stop(); |
| 219 delete thread; | 230 delete thread; |
| 220 } | 231 } |
| 221 } | 232 } |
| 222 | 233 |
| 223 virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } | 234 virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 | 267 |
| 257 DeliveryStatus DeliverPacket(MediaType media_type, | 268 DeliveryStatus DeliverPacket(MediaType media_type, |
| 258 const uint8_t* packet, | 269 const uint8_t* packet, |
| 259 size_t length, | 270 size_t length, |
| 260 const PacketTime& packet_time) override { | 271 const PacketTime& packet_time) override { |
| 261 // Ignore timestamps of RTCP packets. They're not synchronized with | 272 // Ignore timestamps of RTCP packets. They're not synchronized with |
| 262 // RTP packet timestamps and so they would confuse wrap_handler_. | 273 // RTP packet timestamps and so they would confuse wrap_handler_. |
| 263 if (RtpHeaderParser::IsRtcp(packet, length)) { | 274 if (RtpHeaderParser::IsRtcp(packet, length)) { |
| 264 return receiver_->DeliverPacket(media_type, packet, length, packet_time); | 275 return receiver_->DeliverPacket(media_type, packet, length, packet_time); |
| 265 } | 276 } |
| 277 |
| 278 if (rtp_file_writer_) { |
| 279 test::RtpPacket p; |
| 280 memcpy(p.data, packet, length); |
| 281 p.length = length; |
| 282 p.original_length = length; |
| 283 p.time_ms = clock_->TimeInMilliseconds() - start_ms_; |
| 284 rtp_file_writer_->WritePacket(&p); |
| 285 } |
| 286 |
| 266 RtpUtility::RtpHeaderParser parser(packet, length); | 287 RtpUtility::RtpHeaderParser parser(packet, length); |
| 267 RTPHeader header; | 288 RTPHeader header; |
| 268 parser.Parse(&header); | 289 parser.Parse(&header); |
| 269 if (!IsFlexfec(header.payloadType) && | 290 if (!IsFlexfec(header.payloadType) && |
| 270 (header.ssrc == ssrc_to_analyze_ || | 291 (header.ssrc == ssrc_to_analyze_ || |
| 271 header.ssrc == rtx_ssrc_to_analyze_)) { | 292 header.ssrc == rtx_ssrc_to_analyze_)) { |
| 272 // Ignore FlexFEC timestamps, to avoid collisions with media timestamps. | 293 // Ignore FlexFEC timestamps, to avoid collisions with media timestamps. |
| 273 // (FlexFEC and media are sent on different SSRCs, which have different | 294 // (FlexFEC and media are sent on different SSRCs, which have different |
| 274 // timestamps spaces.) | 295 // timestamps spaces.) |
| 275 // Also ignore packets from wrong SSRC, but include retransmits. | 296 // Also ignore packets from wrong SSRC, but include retransmits. |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1049 const double avg_psnr_threshold_; | 1070 const double avg_psnr_threshold_; |
| 1050 const double avg_ssim_threshold_; | 1071 const double avg_ssim_threshold_; |
| 1051 bool is_quick_test_enabled_; | 1072 bool is_quick_test_enabled_; |
| 1052 | 1073 |
| 1053 rtc::CriticalSection comparison_lock_; | 1074 rtc::CriticalSection comparison_lock_; |
| 1054 std::vector<rtc::PlatformThread*> comparison_thread_pool_; | 1075 std::vector<rtc::PlatformThread*> comparison_thread_pool_; |
| 1055 rtc::PlatformThread stats_polling_thread_; | 1076 rtc::PlatformThread stats_polling_thread_; |
| 1056 rtc::Event comparison_available_event_; | 1077 rtc::Event comparison_available_event_; |
| 1057 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_); | 1078 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_); |
| 1058 rtc::Event done_; | 1079 rtc::Event done_; |
| 1080 |
| 1081 std::unique_ptr<test::RtpFileWriter> rtp_file_writer_; |
| 1082 Clock* const clock_; |
| 1083 const int64_t start_ms_; |
| 1059 }; | 1084 }; |
| 1060 | 1085 |
| 1061 class Vp8EncoderFactory : public cricket::WebRtcVideoEncoderFactory { | 1086 class Vp8EncoderFactory : public cricket::WebRtcVideoEncoderFactory { |
| 1062 public: | 1087 public: |
| 1063 Vp8EncoderFactory() { | 1088 Vp8EncoderFactory() { |
| 1064 supported_codecs_.push_back(cricket::VideoCodec("VP8")); | 1089 supported_codecs_.push_back(cricket::VideoCodec("VP8")); |
| 1065 } | 1090 } |
| 1066 ~Vp8EncoderFactory() override { RTC_CHECK(live_encoders_.empty()); } | 1091 ~Vp8EncoderFactory() override { RTC_CHECK(live_encoders_.empty()); } |
| 1067 | 1092 |
| 1068 const std::vector<cricket::VideoCodec>& supported_codecs() const override { | 1093 const std::vector<cricket::VideoCodec>& supported_codecs() const override { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1095 RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP8) == | 1120 RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP8) == |
| 1096 payload_type_map_.end()); | 1121 payload_type_map_.end()); |
| 1097 RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP9) == | 1122 RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP9) == |
| 1098 payload_type_map_.end()); | 1123 payload_type_map_.end()); |
| 1099 payload_type_map_[kPayloadTypeH264] = webrtc::MediaType::VIDEO; | 1124 payload_type_map_[kPayloadTypeH264] = webrtc::MediaType::VIDEO; |
| 1100 payload_type_map_[kPayloadTypeVP8] = webrtc::MediaType::VIDEO; | 1125 payload_type_map_[kPayloadTypeVP8] = webrtc::MediaType::VIDEO; |
| 1101 payload_type_map_[kPayloadTypeVP9] = webrtc::MediaType::VIDEO; | 1126 payload_type_map_[kPayloadTypeVP9] = webrtc::MediaType::VIDEO; |
| 1102 } | 1127 } |
| 1103 | 1128 |
| 1104 VideoQualityTest::Params::Params() | 1129 VideoQualityTest::Params::Params() |
| 1105 : call({false, Call::Config::BitrateConfig()}), | 1130 : call({false, Call::Config::BitrateConfig(), 0}), |
| 1106 video({false, 640, 480, 30, 50, 800, 800, false, "VP8", 1, -1, 0, false, | 1131 video({false, 640, 480, 30, 50, 800, 800, false, "VP8", 1, -1, 0, false, |
| 1107 false, "", ""}), | 1132 false, ""}), |
| 1108 audio({false, false, false}), | 1133 audio({false, false, false}), |
| 1109 screenshare({false, 10, 0}), | 1134 screenshare({false, 10, 0}), |
| 1110 analyzer({"", 0.0, 0.0, 0, "", ""}), | 1135 analyzer({"", 0.0, 0.0, 0, "", ""}), |
| 1111 pipe(), | 1136 pipe(), |
| 1112 logs(false), | |
| 1113 ss({std::vector<VideoStream>(), 0, 0, -1, std::vector<SpatialLayer>()}), | 1137 ss({std::vector<VideoStream>(), 0, 0, -1, std::vector<SpatialLayer>()}), |
| 1114 num_thumbnails(0) {} | 1138 logging({false, "", "", ""}) {} |
| 1115 | 1139 |
| 1116 VideoQualityTest::Params::~Params() = default; | 1140 VideoQualityTest::Params::~Params() = default; |
| 1117 | 1141 |
| 1118 void VideoQualityTest::TestBody() {} | 1142 void VideoQualityTest::TestBody() {} |
| 1119 | 1143 |
| 1120 std::string VideoQualityTest::GenerateGraphTitle() const { | 1144 std::string VideoQualityTest::GenerateGraphTitle() const { |
| 1121 std::stringstream ss; | 1145 std::stringstream ss; |
| 1122 ss << params_.video.codec; | 1146 ss << params_.video.codec; |
| 1123 ss << " (" << params_.video.target_bitrate_bps / 1000 << "kbps"; | 1147 ss << " (" << params_.video.target_bitrate_bps / 1000 << "kbps"; |
| 1124 ss << ", " << params_.video.fps << " FPS"; | 1148 ss << ", " << params_.video.fps << " FPS"; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 RTC_CHECK_GE(params_.ss.num_spatial_layers, 1); | 1194 RTC_CHECK_GE(params_.ss.num_spatial_layers, 1); |
| 1171 RTC_CHECK_LE(params_.ss.selected_sl, params_.ss.num_spatial_layers); | 1195 RTC_CHECK_LE(params_.ss.selected_sl, params_.ss.num_spatial_layers); |
| 1172 RTC_CHECK(params_.ss.spatial_layers.empty() || | 1196 RTC_CHECK(params_.ss.spatial_layers.empty() || |
| 1173 params_.ss.spatial_layers.size() == | 1197 params_.ss.spatial_layers.size() == |
| 1174 static_cast<size_t>(params_.ss.num_spatial_layers)); | 1198 static_cast<size_t>(params_.ss.num_spatial_layers)); |
| 1175 if (params_.video.codec == "VP8") { | 1199 if (params_.video.codec == "VP8") { |
| 1176 RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1); | 1200 RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1); |
| 1177 } else if (params_.video.codec == "VP9") { | 1201 } else if (params_.video.codec == "VP9") { |
| 1178 RTC_CHECK_EQ(params_.ss.streams.size(), 1); | 1202 RTC_CHECK_EQ(params_.ss.streams.size(), 1); |
| 1179 } | 1203 } |
| 1180 RTC_CHECK_GE(params_.num_thumbnails, 0); | 1204 RTC_CHECK_GE(params_.call.num_thumbnails, 0); |
| 1181 if (params_.num_thumbnails > 0) { | 1205 if (params_.call.num_thumbnails > 0) { |
| 1182 RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1); | 1206 RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1); |
| 1183 RTC_CHECK_EQ(params_.ss.streams.size(), 3); | 1207 RTC_CHECK_EQ(params_.ss.streams.size(), 3); |
| 1184 RTC_CHECK_EQ(params_.video.num_temporal_layers, 3); | 1208 RTC_CHECK_EQ(params_.video.num_temporal_layers, 3); |
| 1185 RTC_CHECK_EQ(params_.video.codec, "VP8"); | 1209 RTC_CHECK_EQ(params_.video.codec, "VP8"); |
| 1186 } | 1210 } |
| 1187 } | 1211 } |
| 1188 | 1212 |
| 1189 // Static. | 1213 // Static. |
| 1190 std::vector<int> VideoQualityTest::ParseCSV(const std::string& str) { | 1214 std::vector<int> VideoQualityTest::ParseCSV(const std::string& str) { |
| 1191 // Parse comma separated nonnegative integers, where some elements may be | 1215 // Parse comma separated nonnegative integers, where some elements may be |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 SpatialLayer layer; | 1348 SpatialLayer layer; |
| 1325 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; | 1349 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; |
| 1326 layer.scaling_factor_den = v[1] == -1 ? 1 : v[1]; | 1350 layer.scaling_factor_den = v[1] == -1 ? 1 : v[1]; |
| 1327 layer.target_bitrate_bps = v[2]; | 1351 layer.target_bitrate_bps = v[2]; |
| 1328 params->ss.spatial_layers.push_back(layer); | 1352 params->ss.spatial_layers.push_back(layer); |
| 1329 } | 1353 } |
| 1330 } | 1354 } |
| 1331 | 1355 |
| 1332 void VideoQualityTest::SetupVideo(Transport* send_transport, | 1356 void VideoQualityTest::SetupVideo(Transport* send_transport, |
| 1333 Transport* recv_transport) { | 1357 Transport* recv_transport) { |
| 1334 if (params_.logs) | 1358 if (params_.logging.logs) |
| 1335 trace_to_stderr_.reset(new test::TraceToStderr); | 1359 trace_to_stderr_.reset(new test::TraceToStderr); |
| 1336 | 1360 |
| 1337 size_t num_video_streams = params_.ss.streams.size(); | 1361 size_t num_video_streams = params_.ss.streams.size(); |
| 1338 size_t num_flexfec_streams = params_.video.flexfec ? 1 : 0; | 1362 size_t num_flexfec_streams = params_.video.flexfec ? 1 : 0; |
| 1339 CreateSendConfig(num_video_streams, 0, num_flexfec_streams, send_transport); | 1363 CreateSendConfig(num_video_streams, 0, num_flexfec_streams, send_transport); |
| 1340 | 1364 |
| 1341 int payload_type; | 1365 int payload_type; |
| 1342 if (params_.video.codec == "H264") { | 1366 if (params_.video.codec == "H264") { |
| 1343 video_encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); | 1367 video_encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); |
| 1344 payload_type = kPayloadTypeH264; | 1368 payload_type = kPayloadTypeH264; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1490 video_send_config_.rtp.ulpfec.ulpfec_payload_type; | 1514 video_send_config_.rtp.ulpfec.ulpfec_payload_type; |
| 1491 video_receive_configs_[params_.ss.selected_stream] | 1515 video_receive_configs_[params_.ss.selected_stream] |
| 1492 .rtp.ulpfec.red_rtx_payload_type = | 1516 .rtp.ulpfec.red_rtx_payload_type = |
| 1493 video_send_config_.rtp.ulpfec.red_rtx_payload_type; | 1517 video_send_config_.rtp.ulpfec.red_rtx_payload_type; |
| 1494 } | 1518 } |
| 1495 } | 1519 } |
| 1496 } | 1520 } |
| 1497 | 1521 |
| 1498 void VideoQualityTest::SetupThumbnails(Transport* send_transport, | 1522 void VideoQualityTest::SetupThumbnails(Transport* send_transport, |
| 1499 Transport* recv_transport) { | 1523 Transport* recv_transport) { |
| 1500 for (int i = 0; i < params_.num_thumbnails; ++i) { | 1524 for (int i = 0; i < params_.call.num_thumbnails; ++i) { |
| 1501 thumbnail_encoders_.emplace_back(VP8Encoder::Create()); | 1525 thumbnail_encoders_.emplace_back(VP8Encoder::Create()); |
| 1502 | 1526 |
| 1503 // Thumbnails will be send in the other way: from receiver_call to | 1527 // Thumbnails will be send in the other way: from receiver_call to |
| 1504 // sender_call. | 1528 // sender_call. |
| 1505 VideoSendStream::Config thumbnail_send_config(recv_transport); | 1529 VideoSendStream::Config thumbnail_send_config(recv_transport); |
| 1506 thumbnail_send_config.rtp.ssrcs.push_back(kThumbnailSendSsrcStart + i); | 1530 thumbnail_send_config.rtp.ssrcs.push_back(kThumbnailSendSsrcStart + i); |
| 1507 thumbnail_send_config.encoder_settings.encoder = | 1531 thumbnail_send_config.encoder_settings.encoder = |
| 1508 thumbnail_encoders_.back().get(); | 1532 thumbnail_encoders_.back().get(); |
| 1509 thumbnail_send_config.encoder_settings.payload_name = params_.video.codec; | 1533 thumbnail_send_config.encoder_settings.payload_name = params_.video.codec; |
| 1510 thumbnail_send_config.encoder_settings.payload_type = kPayloadTypeVP8; | 1534 thumbnail_send_config.encoder_settings.payload_type = kPayloadTypeVP8; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1560 thumbnail_receive_config.rtp.rtx_payload_types[kPayloadTypeVP8] = | 1584 thumbnail_receive_config.rtp.rtx_payload_types[kPayloadTypeVP8] = |
| 1561 kSendRtxPayloadType; | 1585 kSendRtxPayloadType; |
| 1562 thumbnail_receive_config.rtp.transport_cc = params_.call.send_side_bwe; | 1586 thumbnail_receive_config.rtp.transport_cc = params_.call.send_side_bwe; |
| 1563 thumbnail_receive_config.rtp.remb = !params_.call.send_side_bwe; | 1587 thumbnail_receive_config.rtp.remb = !params_.call.send_side_bwe; |
| 1564 | 1588 |
| 1565 thumbnail_encoder_configs_.push_back(thumbnail_encoder_config.Copy()); | 1589 thumbnail_encoder_configs_.push_back(thumbnail_encoder_config.Copy()); |
| 1566 thumbnail_send_configs_.push_back(thumbnail_send_config.Copy()); | 1590 thumbnail_send_configs_.push_back(thumbnail_send_config.Copy()); |
| 1567 thumbnail_receive_configs_.push_back(thumbnail_receive_config.Copy()); | 1591 thumbnail_receive_configs_.push_back(thumbnail_receive_config.Copy()); |
| 1568 } | 1592 } |
| 1569 | 1593 |
| 1570 for (int i = 0; i < params_.num_thumbnails; ++i) { | 1594 for (int i = 0; i < params_.call.num_thumbnails; ++i) { |
| 1571 thumbnail_send_streams_.push_back(receiver_call_->CreateVideoSendStream( | 1595 thumbnail_send_streams_.push_back(receiver_call_->CreateVideoSendStream( |
| 1572 thumbnail_send_configs_[i].Copy(), | 1596 thumbnail_send_configs_[i].Copy(), |
| 1573 thumbnail_encoder_configs_[i].Copy())); | 1597 thumbnail_encoder_configs_[i].Copy())); |
| 1574 thumbnail_receive_streams_.push_back(sender_call_->CreateVideoReceiveStream( | 1598 thumbnail_receive_streams_.push_back(sender_call_->CreateVideoReceiveStream( |
| 1575 thumbnail_receive_configs_[i].Copy())); | 1599 thumbnail_receive_configs_[i].Copy())); |
| 1576 } | 1600 } |
| 1577 } | 1601 } |
| 1578 | 1602 |
| 1579 void VideoQualityTest::DestroyThumbnailStreams() { | 1603 void VideoQualityTest::DestroyThumbnailStreams() { |
| 1580 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) | 1604 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 | 1736 |
| 1713 FILE* graph_data_output_file = nullptr; | 1737 FILE* graph_data_output_file = nullptr; |
| 1714 if (!params_.analyzer.graph_data_output_filename.empty()) { | 1738 if (!params_.analyzer.graph_data_output_filename.empty()) { |
| 1715 graph_data_output_file = | 1739 graph_data_output_file = |
| 1716 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); | 1740 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); |
| 1717 RTC_CHECK(graph_data_output_file) | 1741 RTC_CHECK(graph_data_output_file) |
| 1718 << "Can't open the file " << params_.analyzer.graph_data_output_filename | 1742 << "Can't open the file " << params_.analyzer.graph_data_output_filename |
| 1719 << "!"; | 1743 << "!"; |
| 1720 } | 1744 } |
| 1721 | 1745 |
| 1746 if (!params.logging.rtc_event_log_name.empty()) { |
| 1747 event_log_ = RtcEventLog::Create(clock_); |
| 1748 bool event_log_started = |
| 1749 event_log_->StartLogging(params.logging.rtc_event_log_name, -1); |
| 1750 RTC_DCHECK(event_log_started); |
| 1751 } |
| 1752 |
| 1722 Call::Config call_config(event_log_.get()); | 1753 Call::Config call_config(event_log_.get()); |
| 1723 call_config.bitrate_config = params.call.call_bitrate_config; | 1754 call_config.bitrate_config = params.call.call_bitrate_config; |
| 1724 CreateCalls(call_config, call_config); | 1755 CreateCalls(call_config, call_config); |
| 1725 | 1756 |
| 1726 test::LayerFilteringTransport send_transport( | 1757 test::LayerFilteringTransport send_transport( |
| 1727 params_.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, | 1758 params_.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
| 1728 params_.video.selected_tl, params_.ss.selected_sl, payload_type_map_); | 1759 params_.video.selected_tl, params_.ss.selected_sl, payload_type_map_); |
| 1729 | 1760 |
| 1730 test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), | 1761 test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), |
| 1731 payload_type_map_); | 1762 payload_type_map_); |
| 1732 | 1763 |
| 1733 std::string graph_title = params_.analyzer.graph_title; | 1764 std::string graph_title = params_.analyzer.graph_title; |
| 1734 if (graph_title.empty()) | 1765 if (graph_title.empty()) |
| 1735 graph_title = VideoQualityTest::GenerateGraphTitle(); | 1766 graph_title = VideoQualityTest::GenerateGraphTitle(); |
| 1736 | 1767 |
| 1737 bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest"); | 1768 bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest"); |
| 1738 VideoAnalyzer analyzer( | 1769 VideoAnalyzer analyzer( |
| 1739 &send_transport, params_.analyzer.test_label, | 1770 &send_transport, params_.analyzer.test_label, |
| 1740 params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold, | 1771 params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold, |
| 1741 is_quick_test_enabled | 1772 is_quick_test_enabled |
| 1742 ? kFramesSentInQuickTest | 1773 ? kFramesSentInQuickTest |
| 1743 : params_.analyzer.test_durations_secs * params_.video.fps, | 1774 : params_.analyzer.test_durations_secs * params_.video.fps, |
| 1744 graph_data_output_file, graph_title, | 1775 graph_data_output_file, graph_title, |
| 1745 kVideoSendSsrcs[params_.ss.selected_stream], | 1776 kVideoSendSsrcs[params_.ss.selected_stream], |
| 1746 kSendRtxSsrcs[params_.ss.selected_stream], | 1777 kSendRtxSsrcs[params_.ss.selected_stream], |
| 1747 static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl, | 1778 static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl, |
| 1748 params_.video.selected_tl, is_quick_test_enabled, clock_); | 1779 params_.video.selected_tl, is_quick_test_enabled, clock_, |
| 1780 params_.logging.rtp_dump_name); |
| 1749 analyzer.SetCall(sender_call_.get()); | 1781 analyzer.SetCall(sender_call_.get()); |
| 1750 analyzer.SetReceiver(receiver_call_->Receiver()); | 1782 analyzer.SetReceiver(receiver_call_->Receiver()); |
| 1751 send_transport.SetReceiver(&analyzer); | 1783 send_transport.SetReceiver(&analyzer); |
| 1752 recv_transport.SetReceiver(sender_call_->Receiver()); | 1784 recv_transport.SetReceiver(sender_call_->Receiver()); |
| 1753 | 1785 |
| 1754 SetupVideo(&analyzer, &recv_transport); | 1786 SetupVideo(&analyzer, &recv_transport); |
| 1755 SetupThumbnails(&analyzer, &recv_transport); | 1787 SetupThumbnails(&analyzer, &recv_transport); |
| 1756 video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; | 1788 video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; |
| 1757 video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); | 1789 video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); |
| 1758 RTC_DCHECK(!video_send_config_.post_encode_callback); | 1790 RTC_DCHECK(!video_send_config_.post_encode_callback); |
| 1759 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); | 1791 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); |
| 1760 | 1792 |
| 1761 SetupScreenshareOrSVC(); | 1793 SetupScreenshareOrSVC(); |
| 1762 | 1794 |
| 1763 CreateFlexfecStreams(); | 1795 CreateFlexfecStreams(); |
| 1764 CreateVideoStreams(); | 1796 CreateVideoStreams(); |
| 1765 analyzer.SetSendStream(video_send_stream_); | 1797 analyzer.SetSendStream(video_send_stream_); |
| 1766 if (video_receive_streams_.size() == 1) | 1798 if (video_receive_streams_.size() == 1) |
| 1767 analyzer.SetReceiveStream(video_receive_streams_[0]); | 1799 analyzer.SetReceiveStream(video_receive_streams_[0]); |
| 1768 | 1800 |
| 1769 video_send_stream_->SetSource(analyzer.OutputInterface(), | 1801 video_send_stream_->SetSource(analyzer.OutputInterface(), |
| 1770 degradation_preference_); | 1802 degradation_preference_); |
| 1771 | 1803 |
| 1772 SetupThumbnailCapturers(params_.num_thumbnails); | 1804 SetupThumbnailCapturers(params_.call.num_thumbnails); |
| 1773 for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) { | 1805 for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) { |
| 1774 thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(), | 1806 thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(), |
| 1775 degradation_preference_); | 1807 degradation_preference_); |
| 1776 } | 1808 } |
| 1777 | 1809 |
| 1778 CreateCapturer(); | 1810 CreateCapturer(); |
| 1779 | 1811 |
| 1780 analyzer.SetSource(video_capturer_.get(), params_.ss.infer_streams); | 1812 analyzer.SetSource(video_capturer_.get(), params_.ss.infer_streams); |
| 1781 | 1813 |
| 1782 StartEncodedFrameLogs(video_send_stream_); | 1814 StartEncodedFrameLogs(video_send_stream_); |
| 1783 StartEncodedFrameLogs(video_receive_streams_[0]); | 1815 StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]); |
| 1784 video_send_stream_->Start(); | 1816 video_send_stream_->Start(); |
| 1785 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) | 1817 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
| 1786 thumbnail_send_stream->Start(); | 1818 thumbnail_send_stream->Start(); |
| 1787 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1819 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1788 receive_stream->Start(); | 1820 receive_stream->Start(); |
| 1789 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_) | 1821 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_) |
| 1790 receive_stream->Start(); | 1822 receive_stream->Start(); |
| 1791 for (VideoReceiveStream* thumbnail_receive_stream : | 1823 for (VideoReceiveStream* thumbnail_receive_stream : |
| 1792 thumbnail_receive_streams_) | 1824 thumbnail_receive_streams_) |
| 1793 thumbnail_receive_stream->Start(); | 1825 thumbnail_receive_stream->Start(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1816 receive_stream->Stop(); | 1848 receive_stream->Stop(); |
| 1817 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1849 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1818 receive_stream->Stop(); | 1850 receive_stream->Stop(); |
| 1819 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) | 1851 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
| 1820 thumbnail_send_stream->Stop(); | 1852 thumbnail_send_stream->Stop(); |
| 1821 video_send_stream_->Stop(); | 1853 video_send_stream_->Stop(); |
| 1822 | 1854 |
| 1823 DestroyStreams(); | 1855 DestroyStreams(); |
| 1824 DestroyThumbnailStreams(); | 1856 DestroyThumbnailStreams(); |
| 1825 | 1857 |
| 1858 event_log_->StopLogging(); |
| 1826 if (graph_data_output_file) | 1859 if (graph_data_output_file) |
| 1827 fclose(graph_data_output_file); | 1860 fclose(graph_data_output_file); |
| 1828 } | 1861 } |
| 1829 | 1862 |
| 1830 void VideoQualityTest::SetupAudio(int send_channel_id, | 1863 void VideoQualityTest::SetupAudio(int send_channel_id, |
| 1831 int receive_channel_id, | 1864 int receive_channel_id, |
| 1832 Transport* transport, | 1865 Transport* transport, |
| 1833 AudioReceiveStream** audio_receive_stream) { | 1866 AudioReceiveStream** audio_receive_stream) { |
| 1834 audio_send_config_ = AudioSendStream::Config(transport); | 1867 audio_send_config_ = AudioSendStream::Config(transport); |
| 1835 audio_send_config_.voe_channel_id = send_channel_id; | 1868 audio_send_config_.voe_channel_id = send_channel_id; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 } | 2057 } |
| 2025 | 2058 |
| 2026 send_transport.StopSending(); | 2059 send_transport.StopSending(); |
| 2027 recv_transport.StopSending(); | 2060 recv_transport.StopSending(); |
| 2028 | 2061 |
| 2029 if (params_.audio.enabled) | 2062 if (params_.audio.enabled) |
| 2030 DestroyVoiceEngine(&voe); | 2063 DestroyVoiceEngine(&voe); |
| 2031 } | 2064 } |
| 2032 | 2065 |
| 2033 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { | 2066 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { |
| 2034 if (!params_.video.encoded_frame_base_path.empty()) { | 2067 if (!params_.logging.encoded_frame_base_path.empty()) { |
| 2035 std::ostringstream str; | 2068 std::ostringstream str; |
| 2036 str << send_logs_++; | 2069 str << send_logs_++; |
| 2037 std::string prefix = | 2070 std::string prefix = |
| 2038 params_.video.encoded_frame_base_path + "." + str.str() + ".send."; | 2071 params_.logging.encoded_frame_base_path + "." + str.str() + ".send."; |
| 2039 stream->EnableEncodedFrameRecording( | 2072 stream->EnableEncodedFrameRecording( |
| 2040 std::vector<rtc::PlatformFile>( | 2073 std::vector<rtc::PlatformFile>( |
| 2041 {rtc::CreatePlatformFile(prefix + "1.ivf"), | 2074 {rtc::CreatePlatformFile(prefix + "1.ivf"), |
| 2042 rtc::CreatePlatformFile(prefix + "2.ivf"), | 2075 rtc::CreatePlatformFile(prefix + "2.ivf"), |
| 2043 rtc::CreatePlatformFile(prefix + "3.ivf")}), | 2076 rtc::CreatePlatformFile(prefix + "3.ivf")}), |
| 2044 10000000); | 2077 100000000); |
| 2045 } | 2078 } |
| 2046 } | 2079 } |
| 2047 | 2080 |
| 2048 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) { | 2081 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) { |
| 2049 if (!params_.video.encoded_frame_base_path.empty()) { | 2082 if (!params_.logging.encoded_frame_base_path.empty()) { |
| 2050 std::ostringstream str; | 2083 std::ostringstream str; |
| 2051 str << receive_logs_++; | 2084 str << receive_logs_++; |
| 2052 std::string path = | 2085 std::string path = |
| 2053 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; | 2086 params_.logging.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; |
| 2054 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), | 2087 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), |
| 2055 10000000); | 2088 100000000); |
| 2056 } | 2089 } |
| 2057 } | 2090 } |
| 2058 } // namespace webrtc | 2091 } // namespace webrtc |
| OLD | NEW |