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 <stdio.h> | 10 #include <stdio.h> |
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <deque> | 13 #include <deque> |
14 #include <map> | 14 #include <map> |
15 #include <sstream> | 15 #include <sstream> |
16 #include <string> | 16 #include <string> |
17 #include <vector> | 17 #include <vector> |
18 | 18 |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 #include "webrtc/base/checks.h" | 21 #include "webrtc/base/checks.h" |
22 #include "webrtc/base/event.h" | 22 #include "webrtc/base/event.h" |
23 #include "webrtc/base/format_macros.h" | 23 #include "webrtc/base/format_macros.h" |
24 #include "webrtc/base/optional.h" | 24 #include "webrtc/base/optional.h" |
25 #include "webrtc/base/platform_file.h" | |
25 #include "webrtc/base/timeutils.h" | 26 #include "webrtc/base/timeutils.h" |
26 #include "webrtc/call.h" | 27 #include "webrtc/call.h" |
27 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 28 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
28 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 29 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
30 #include "webrtc/system_wrappers/include/cpu_info.h" | 31 #include "webrtc/system_wrappers/include/cpu_info.h" |
31 #include "webrtc/test/layer_filtering_transport.h" | 32 #include "webrtc/test/layer_filtering_transport.h" |
32 #include "webrtc/test/run_loop.h" | 33 #include "webrtc/test/run_loop.h" |
33 #include "webrtc/test/statistics.h" | 34 #include "webrtc/test/statistics.h" |
34 #include "webrtc/test/testsupport/fileutils.h" | 35 #include "webrtc/test/testsupport/fileutils.h" |
35 #include "webrtc/test/video_renderer.h" | 36 #include "webrtc/test/video_renderer.h" |
36 #include "webrtc/video/video_quality_test.h" | 37 #include "webrtc/video/video_quality_test.h" |
37 #include "webrtc/voice_engine/include/voe_base.h" | 38 #include "webrtc/voice_engine/include/voe_base.h" |
38 #include "webrtc/voice_engine/include/voe_codec.h" | 39 #include "webrtc/voice_engine/include/voe_codec.h" |
39 | 40 |
41 #if defined(WEBRTC_WIN) | |
42 #include "webrtc/base/win32.h" | |
43 #else | |
44 #include <fcntl.h> | |
45 #endif | |
46 | |
40 namespace { | 47 namespace { |
41 | 48 |
42 constexpr int kSendStatsPollingIntervalMs = 1000; | 49 constexpr int kSendStatsPollingIntervalMs = 1000; |
43 constexpr int kPayloadTypeH264 = 122; | 50 constexpr int kPayloadTypeH264 = 122; |
44 constexpr int kPayloadTypeVP8 = 123; | 51 constexpr int kPayloadTypeVP8 = 123; |
45 constexpr int kPayloadTypeVP9 = 124; | 52 constexpr int kPayloadTypeVP9 = 124; |
46 constexpr size_t kMaxComparisons = 10; | 53 constexpr size_t kMaxComparisons = 10; |
47 constexpr char kSyncGroup[] = "av_sync"; | 54 constexpr char kSyncGroup[] = "av_sync"; |
48 constexpr int kOpusMinBitrate = 6000; | 55 constexpr int kOpusMinBitrate = 6000; |
49 constexpr int kOpusBitrateFb = 32000; | 56 constexpr int kOpusBitrateFb = 32000; |
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
738 const double avg_ssim_threshold_; | 745 const double avg_ssim_threshold_; |
739 | 746 |
740 rtc::CriticalSection comparison_lock_; | 747 rtc::CriticalSection comparison_lock_; |
741 std::vector<rtc::PlatformThread*> comparison_thread_pool_; | 748 std::vector<rtc::PlatformThread*> comparison_thread_pool_; |
742 rtc::PlatformThread stats_polling_thread_; | 749 rtc::PlatformThread stats_polling_thread_; |
743 rtc::Event comparison_available_event_; | 750 rtc::Event comparison_available_event_; |
744 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_); | 751 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_); |
745 rtc::Event done_; | 752 rtc::Event done_; |
746 }; | 753 }; |
747 | 754 |
748 VideoQualityTest::VideoQualityTest() : clock_(Clock::GetRealTimeClock()) {} | 755 VideoQualityTest::VideoQualityTest() |
756 : clock_(Clock::GetRealTimeClock()), receive_logs_(0), send_logs_(0) {} | |
749 | 757 |
750 void VideoQualityTest::TestBody() {} | 758 void VideoQualityTest::TestBody() {} |
751 | 759 |
752 std::string VideoQualityTest::GenerateGraphTitle() const { | 760 std::string VideoQualityTest::GenerateGraphTitle() const { |
753 std::stringstream ss; | 761 std::stringstream ss; |
754 ss << params_.common.codec; | 762 ss << params_.common.codec; |
755 ss << " (" << params_.common.target_bitrate_bps / 1000 << "kbps"; | 763 ss << " (" << params_.common.target_bitrate_bps / 1000 << "kbps"; |
756 ss << ", " << params_.common.fps << " FPS"; | 764 ss << ", " << params_.common.fps << " FPS"; |
757 if (params_.screenshare.scroll_duration) | 765 if (params_.screenshare.scroll_duration) |
758 ss << ", " << params_.screenshare.scroll_duration << "s scroll"; | 766 ss << ", " << params_.screenshare.scroll_duration << "s scroll"; |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1125 | 1133 |
1126 if (params_.screenshare.enabled) | 1134 if (params_.screenshare.enabled) |
1127 SetupScreenshare(); | 1135 SetupScreenshare(); |
1128 | 1136 |
1129 CreateVideoStreams(); | 1137 CreateVideoStreams(); |
1130 analyzer.input_ = video_send_stream_->Input(); | 1138 analyzer.input_ = video_send_stream_->Input(); |
1131 analyzer.send_stream_ = video_send_stream_; | 1139 analyzer.send_stream_ = video_send_stream_; |
1132 | 1140 |
1133 CreateCapturer(&analyzer); | 1141 CreateCapturer(&analyzer); |
1134 | 1142 |
1143 StartEncodedFrameLogs(video_send_stream_); | |
1144 StartEncodedFrameLogs(video_receive_streams_[0]); | |
1135 video_send_stream_->Start(); | 1145 video_send_stream_->Start(); |
1136 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1146 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
1137 receive_stream->Start(); | 1147 receive_stream->Start(); |
1138 capturer_->Start(); | 1148 capturer_->Start(); |
1139 | 1149 |
1140 analyzer.Wait(); | 1150 analyzer.Wait(); |
1141 | 1151 |
1142 send_transport.StopSending(); | 1152 send_transport.StopSending(); |
1143 recv_transport.StopSending(); | 1153 recv_transport.StopSending(); |
1144 | 1154 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1247 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; | 1257 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; |
1248 audio_config.rtcp_send_transport = &transport; | 1258 audio_config.rtcp_send_transport = &transport; |
1249 audio_config.voe_channel_id = voe.receive_channel_id; | 1259 audio_config.voe_channel_id = voe.receive_channel_id; |
1250 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; | 1260 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; |
1251 audio_config.rtp.transport_cc = params_.common.send_side_bwe; | 1261 audio_config.rtp.transport_cc = params_.common.send_side_bwe; |
1252 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; | 1262 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; |
1253 audio_config.decoder_factory = decoder_factory_; | 1263 audio_config.decoder_factory = decoder_factory_; |
1254 if (params_.audio_video_sync) | 1264 if (params_.audio_video_sync) |
1255 audio_config.sync_group = kSyncGroup; | 1265 audio_config.sync_group = kSyncGroup; |
1256 | 1266 |
1257 audio_receive_stream =call->CreateAudioReceiveStream(audio_config); | 1267 audio_receive_stream = call->CreateAudioReceiveStream(audio_config); |
1258 | 1268 |
1259 const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; | 1269 const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; |
1260 EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); | 1270 EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); |
1261 } | 1271 } |
1262 | 1272 |
1273 StartEncodedFrameLogs(video_receive_stream); | |
1274 StartEncodedFrameLogs(video_send_stream_); | |
1275 | |
1263 // Start sending and receiving video. | 1276 // Start sending and receiving video. |
1264 video_receive_stream->Start(); | 1277 video_receive_stream->Start(); |
1265 video_send_stream_->Start(); | 1278 video_send_stream_->Start(); |
1266 capturer_->Start(); | 1279 capturer_->Start(); |
1267 | 1280 |
1268 if (params_.audio) { | 1281 if (params_.audio) { |
1269 // Start receiving audio. | 1282 // Start receiving audio. |
1270 audio_receive_stream->Start(); | 1283 audio_receive_stream->Start(); |
1271 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); | 1284 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
1272 EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id)); | 1285 EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id)); |
(...skipping 27 matching lines...) Expand all Loading... | |
1300 if (params_.audio) { | 1313 if (params_.audio) { |
1301 call->DestroyAudioSendStream(audio_send_stream_); | 1314 call->DestroyAudioSendStream(audio_send_stream_); |
1302 call->DestroyAudioReceiveStream(audio_receive_stream); | 1315 call->DestroyAudioReceiveStream(audio_receive_stream); |
1303 } | 1316 } |
1304 | 1317 |
1305 transport.StopSending(); | 1318 transport.StopSending(); |
1306 if (params_.audio) | 1319 if (params_.audio) |
1307 DestroyVoiceEngine(&voe); | 1320 DestroyVoiceEngine(&voe); |
1308 } | 1321 } |
1309 | 1322 |
1323 rtc::PlatformFile CreateFile(const std::string& path) { | |
1324 #if defined(WEBRTC_WIN) | |
1325 return ::CreateFile(rtc::ToUtf16(path).c_str(), GENERIC_READ | GENERIC_WRITE, | |
1326 0, nullptr, OPEN_ALWAYS, 0, nullptr); | |
1327 #else | |
1328 return ::open(path.c_str(), O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); | |
1329 #endif | |
stefan-webrtc
2016/09/13 10:53:17
Break out to platform independent function or clas
palmkvist
2016/09/13 11:59:37
Also intended to be put in base, but in a separate
| |
1330 } | |
1331 | |
1332 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { | |
1333 if (!params_.common.encoded_frame_base_path.empty()) { | |
1334 std::ostringstream str; | |
1335 str << send_logs_++; | |
1336 std::string prefix = | |
1337 params_.common.encoded_frame_base_path + "." + str.str() + ".send."; | |
1338 stream->EnableEncodedFrameRecording( | |
1339 std::vector<rtc::PlatformFile>({CreateFile(prefix + "1.ivf"), | |
1340 CreateFile(prefix + "2.ivf"), | |
1341 CreateFile(prefix + "3.ivf")}), | |
1342 10000000); | |
1343 } | |
1344 } | |
1345 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) { | |
1346 if (!params_.common.encoded_frame_base_path.empty()) { | |
1347 std::ostringstream str; | |
1348 str << receive_logs_++; | |
1349 std::string path = | |
1350 params_.common.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; | |
1351 stream->EnableEncodedFrameRecording(CreateFile(path), 10000000); | |
1352 } | |
1353 } | |
1354 | |
1310 } // namespace webrtc | 1355 } // namespace webrtc |
OLD | NEW |