Chromium Code Reviews| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 const std::string& test_label, | 130 const std::string& test_label, |
| 131 double avg_psnr_threshold, | 131 double avg_psnr_threshold, |
| 132 double avg_ssim_threshold, | 132 double avg_ssim_threshold, |
| 133 int duration_frames, | 133 int duration_frames, |
| 134 FILE* graph_data_output_file, | 134 FILE* graph_data_output_file, |
| 135 const std::string& graph_title, | 135 const std::string& graph_title, |
| 136 uint32_t ssrc_to_analyze) | 136 uint32_t ssrc_to_analyze) |
| 137 : transport_(transport), | 137 : transport_(transport), |
| 138 receiver_(nullptr), | 138 receiver_(nullptr), |
| 139 send_stream_(nullptr), | 139 send_stream_(nullptr), |
| 140 receive_stream_(nullptr), | |
| 140 captured_frame_forwarder_(this), | 141 captured_frame_forwarder_(this), |
| 141 test_label_(test_label), | 142 test_label_(test_label), |
| 142 graph_data_output_file_(graph_data_output_file), | 143 graph_data_output_file_(graph_data_output_file), |
| 143 graph_title_(graph_title), | 144 graph_title_(graph_title), |
| 144 ssrc_to_analyze_(ssrc_to_analyze), | 145 ssrc_to_analyze_(ssrc_to_analyze), |
| 145 pre_encode_proxy_(this), | 146 pre_encode_proxy_(this), |
| 146 encode_timing_proxy_(this), | 147 encode_timing_proxy_(this), |
| 147 frames_to_process_(duration_frames), | 148 frames_to_process_(duration_frames), |
| 148 frames_recorded_(0), | 149 frames_recorded_(0), |
| 149 frames_processed_(0), | 150 frames_processed_(0), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 } | 193 } |
| 193 | 194 |
| 194 virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } | 195 virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } |
| 195 | 196 |
| 196 void SetSendStream(VideoSendStream* stream) { | 197 void SetSendStream(VideoSendStream* stream) { |
| 197 rtc::CritScope lock(&crit_); | 198 rtc::CritScope lock(&crit_); |
| 198 RTC_DCHECK(!send_stream_); | 199 RTC_DCHECK(!send_stream_); |
| 199 send_stream_ = stream; | 200 send_stream_ = stream; |
| 200 } | 201 } |
| 201 | 202 |
| 203 void SetReceiveStream(VideoReceiveStream* stream) { | |
| 204 rtc::CritScope lock(&crit_); | |
| 205 RTC_DCHECK(!receive_stream_); | |
| 206 receive_stream_ = stream; | |
| 207 } | |
| 208 | |
| 202 rtc::VideoSinkInterface<VideoFrame>* InputInterface() { | 209 rtc::VideoSinkInterface<VideoFrame>* InputInterface() { |
| 203 return &captured_frame_forwarder_; | 210 return &captured_frame_forwarder_; |
| 204 } | 211 } |
| 205 rtc::VideoSourceInterface<VideoFrame>* OutputInterface() { | 212 rtc::VideoSourceInterface<VideoFrame>* OutputInterface() { |
| 206 return &captured_frame_forwarder_; | 213 return &captured_frame_forwarder_; |
| 207 } | 214 } |
| 208 | 215 |
| 209 DeliveryStatus DeliverPacket(MediaType media_type, | 216 DeliveryStatus DeliverPacket(MediaType media_type, |
| 210 const uint8_t* packet, | 217 const uint8_t* packet, |
| 211 size_t length, | 218 size_t length, |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 } | 532 } |
| 526 | 533 |
| 527 static bool PollStatsThread(void* obj) { | 534 static bool PollStatsThread(void* obj) { |
| 528 return static_cast<VideoAnalyzer*>(obj)->PollStats(); | 535 return static_cast<VideoAnalyzer*>(obj)->PollStats(); |
| 529 } | 536 } |
| 530 | 537 |
| 531 bool PollStats() { | 538 bool PollStats() { |
| 532 if (done_.Wait(kSendStatsPollingIntervalMs)) | 539 if (done_.Wait(kSendStatsPollingIntervalMs)) |
| 533 return false; | 540 return false; |
| 534 | 541 |
| 535 VideoSendStream::Stats stats = send_stream_->GetStats(); | 542 rtc::CritScope crit(&comparison_lock_); |
|
sprang_webrtc
2017/01/19 12:09:30
Why move the lock to include getting the send stat
philipel
2017/01/19 15:11:39
I did it to avoid one null check. If we get the st
| |
| 536 | 543 |
| 537 rtc::CritScope crit(&comparison_lock_); | 544 VideoSendStream::Stats send_stats = send_stream_->GetStats(); |
| 538 // It's not certain that we yet have estimates for any of these stats. Check | 545 // It's not certain that we yet have estimates for any of these stats. Check |
| 539 // that they are positive before mixing them in. | 546 // that they are positive before mixing them in. |
| 540 if (stats.encode_frame_rate > 0) | 547 if (send_stats.encode_frame_rate > 0) |
| 541 encode_frame_rate_.AddSample(stats.encode_frame_rate); | 548 encode_frame_rate_.AddSample(send_stats.encode_frame_rate); |
| 542 if (stats.avg_encode_time_ms > 0) | 549 if (send_stats.avg_encode_time_ms > 0) |
| 543 encode_time_ms.AddSample(stats.avg_encode_time_ms); | 550 encode_time_ms_.AddSample(send_stats.avg_encode_time_ms); |
| 544 if (stats.encode_usage_percent > 0) | 551 if (send_stats.encode_usage_percent > 0) |
| 545 encode_usage_percent.AddSample(stats.encode_usage_percent); | 552 encode_usage_percent_.AddSample(send_stats.encode_usage_percent); |
| 546 if (stats.media_bitrate_bps > 0) | 553 if (send_stats.media_bitrate_bps > 0) |
| 547 media_bitrate_bps.AddSample(stats.media_bitrate_bps); | 554 media_bitrate_bps_.AddSample(send_stats.media_bitrate_bps); |
| 555 | |
| 556 if (receive_stream_ != nullptr) { | |
| 557 VideoReceiveStream::Stats receive_stats = receive_stream_->GetStats(); | |
| 558 if (receive_stats.decode_ms > 0) | |
| 559 decode_time_ms_.AddSample(receive_stats.decode_ms); | |
| 560 if (receive_stats.max_decode_ms > 0) | |
| 561 decode_time_max_ms_.AddSample(receive_stats.max_decode_ms); | |
| 562 } | |
| 548 | 563 |
| 549 return true; | 564 return true; |
| 550 } | 565 } |
| 551 | 566 |
| 552 static bool FrameComparisonThread(void* obj) { | 567 static bool FrameComparisonThread(void* obj) { |
| 553 return static_cast<VideoAnalyzer*>(obj)->CompareFrames(); | 568 return static_cast<VideoAnalyzer*>(obj)->CompareFrames(); |
| 554 } | 569 } |
| 555 | 570 |
| 556 bool CompareFrames() { | 571 bool CompareFrames() { |
| 557 if (AllFramesRecorded()) | 572 if (AllFramesRecorded()) |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 626 void PrintResults() { | 641 void PrintResults() { |
| 627 rtc::CritScope crit(&comparison_lock_); | 642 rtc::CritScope crit(&comparison_lock_); |
| 628 PrintResult("psnr", psnr_, " dB"); | 643 PrintResult("psnr", psnr_, " dB"); |
| 629 PrintResult("ssim", ssim_, " score"); | 644 PrintResult("ssim", ssim_, " score"); |
| 630 PrintResult("sender_time", sender_time_, " ms"); | 645 PrintResult("sender_time", sender_time_, " ms"); |
| 631 PrintResult("receiver_time", receiver_time_, " ms"); | 646 PrintResult("receiver_time", receiver_time_, " ms"); |
| 632 PrintResult("total_delay_incl_network", end_to_end_, " ms"); | 647 PrintResult("total_delay_incl_network", end_to_end_, " ms"); |
| 633 PrintResult("time_between_rendered_frames", rendered_delta_, " ms"); | 648 PrintResult("time_between_rendered_frames", rendered_delta_, " ms"); |
| 634 PrintResult("encoded_frame_size", encoded_frame_size_, " bytes"); | 649 PrintResult("encoded_frame_size", encoded_frame_size_, " bytes"); |
| 635 PrintResult("encode_frame_rate", encode_frame_rate_, " fps"); | 650 PrintResult("encode_frame_rate", encode_frame_rate_, " fps"); |
| 636 PrintResult("encode_time", encode_time_ms, " ms"); | 651 PrintResult("encode_time", encode_time_ms_, " ms"); |
| 637 PrintResult("encode_usage_percent", encode_usage_percent, " percent"); | 652 PrintResult("encode_usage_percent", encode_usage_percent_, " percent"); |
| 638 PrintResult("media_bitrate", media_bitrate_bps, " bps"); | 653 PrintResult("media_bitrate", media_bitrate_bps_, " bps"); |
| 654 | |
| 655 if (receive_stream_ != nullptr) { | |
| 656 PrintResult("decode_time", decode_time_ms_, " ms"); | |
| 657 PrintResult("decode_time_max", decode_time_max_ms_, " ms"); | |
| 658 } | |
| 639 | 659 |
| 640 printf("RESULT dropped_frames: %s = %d frames\n", test_label_.c_str(), | 660 printf("RESULT dropped_frames: %s = %d frames\n", test_label_.c_str(), |
| 641 dropped_frames_); | 661 dropped_frames_); |
| 642 printf("RESULT dropped_frames_before_first_encode: %s = %d frames\n", | 662 printf("RESULT dropped_frames_before_first_encode: %s = %d frames\n", |
| 643 test_label_.c_str(), dropped_frames_before_first_encode_); | 663 test_label_.c_str(), dropped_frames_before_first_encode_); |
| 644 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n", | 664 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n", |
| 645 test_label_.c_str(), dropped_frames_before_rendering_); | 665 test_label_.c_str(), dropped_frames_before_rendering_); |
| 646 | 666 |
| 647 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); | 667 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); |
| 648 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); | 668 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 799 rtc::CritScope lock(&crit_); | 819 rtc::CritScope lock(&crit_); |
| 800 RTC_DCHECK_EQ(0, video_frame.timestamp()); | 820 RTC_DCHECK_EQ(0, video_frame.timestamp()); |
| 801 // Frames from the capturer does not have a rtp timestamp. Create one so it | 821 // Frames from the capturer does not have a rtp timestamp. Create one so it |
| 802 // can be used for comparison. | 822 // can be used for comparison. |
| 803 VideoFrame copy = video_frame; | 823 VideoFrame copy = video_frame; |
| 804 copy.set_timestamp(copy.ntp_time_ms() * 90); | 824 copy.set_timestamp(copy.ntp_time_ms() * 90); |
| 805 frames_.push_back(copy); | 825 frames_.push_back(copy); |
| 806 } | 826 } |
| 807 | 827 |
| 808 VideoSendStream* send_stream_; | 828 VideoSendStream* send_stream_; |
| 829 VideoReceiveStream* receive_stream_; | |
| 809 CapturedFrameForwarder captured_frame_forwarder_; | 830 CapturedFrameForwarder captured_frame_forwarder_; |
| 810 const std::string test_label_; | 831 const std::string test_label_; |
| 811 FILE* const graph_data_output_file_; | 832 FILE* const graph_data_output_file_; |
| 812 const std::string graph_title_; | 833 const std::string graph_title_; |
| 813 const uint32_t ssrc_to_analyze_; | 834 const uint32_t ssrc_to_analyze_; |
| 814 PreEncodeProxy pre_encode_proxy_; | 835 PreEncodeProxy pre_encode_proxy_; |
| 815 OnEncodeTimingProxy encode_timing_proxy_; | 836 OnEncodeTimingProxy encode_timing_proxy_; |
| 816 std::vector<Sample> samples_ GUARDED_BY(comparison_lock_); | 837 std::vector<Sample> samples_ GUARDED_BY(comparison_lock_); |
| 817 std::map<int64_t, int> samples_encode_time_ms_ GUARDED_BY(comparison_lock_); | 838 std::map<int64_t, int> samples_encode_time_ms_ GUARDED_BY(comparison_lock_); |
| 818 test::Statistics sender_time_ GUARDED_BY(comparison_lock_); | 839 test::Statistics sender_time_ GUARDED_BY(comparison_lock_); |
| 819 test::Statistics receiver_time_ GUARDED_BY(comparison_lock_); | 840 test::Statistics receiver_time_ GUARDED_BY(comparison_lock_); |
| 820 test::Statistics psnr_ GUARDED_BY(comparison_lock_); | 841 test::Statistics psnr_ GUARDED_BY(comparison_lock_); |
| 821 test::Statistics ssim_ GUARDED_BY(comparison_lock_); | 842 test::Statistics ssim_ GUARDED_BY(comparison_lock_); |
| 822 test::Statistics end_to_end_ GUARDED_BY(comparison_lock_); | 843 test::Statistics end_to_end_ GUARDED_BY(comparison_lock_); |
| 823 test::Statistics rendered_delta_ GUARDED_BY(comparison_lock_); | 844 test::Statistics rendered_delta_ GUARDED_BY(comparison_lock_); |
| 824 test::Statistics encoded_frame_size_ GUARDED_BY(comparison_lock_); | 845 test::Statistics encoded_frame_size_ GUARDED_BY(comparison_lock_); |
| 825 test::Statistics encode_frame_rate_ GUARDED_BY(comparison_lock_); | 846 test::Statistics encode_frame_rate_ GUARDED_BY(comparison_lock_); |
| 826 test::Statistics encode_time_ms GUARDED_BY(comparison_lock_); | 847 test::Statistics encode_time_ms_ GUARDED_BY(comparison_lock_); |
| 827 test::Statistics encode_usage_percent GUARDED_BY(comparison_lock_); | 848 test::Statistics encode_usage_percent_ GUARDED_BY(comparison_lock_); |
| 828 test::Statistics media_bitrate_bps GUARDED_BY(comparison_lock_); | 849 test::Statistics decode_time_ms_ GUARDED_BY(comparison_lock_); |
| 850 test::Statistics decode_time_max_ms_ GUARDED_BY(comparison_lock_); | |
| 851 test::Statistics media_bitrate_bps_ GUARDED_BY(comparison_lock_); | |
| 829 | 852 |
| 830 const int frames_to_process_; | 853 const int frames_to_process_; |
| 831 int frames_recorded_; | 854 int frames_recorded_; |
| 832 int frames_processed_; | 855 int frames_processed_; |
| 833 int dropped_frames_; | 856 int dropped_frames_; |
| 834 int dropped_frames_before_first_encode_; | 857 int dropped_frames_before_first_encode_; |
| 835 int dropped_frames_before_rendering_; | 858 int dropped_frames_before_rendering_; |
| 836 int64_t last_render_time_; | 859 int64_t last_render_time_; |
| 837 uint32_t rtp_timestamp_delta_; | 860 uint32_t rtp_timestamp_delta_; |
| 838 | 861 |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1302 config.pre_decode_callback = &analyzer; | 1325 config.pre_decode_callback = &analyzer; |
| 1303 RTC_DCHECK(!video_send_config_.post_encode_callback); | 1326 RTC_DCHECK(!video_send_config_.post_encode_callback); |
| 1304 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); | 1327 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); |
| 1305 | 1328 |
| 1306 if (params_.screenshare.enabled) | 1329 if (params_.screenshare.enabled) |
| 1307 SetupScreenshare(); | 1330 SetupScreenshare(); |
| 1308 | 1331 |
| 1309 CreateFlexfecStreams(); | 1332 CreateFlexfecStreams(); |
| 1310 CreateVideoStreams(); | 1333 CreateVideoStreams(); |
| 1311 analyzer.SetSendStream(video_send_stream_); | 1334 analyzer.SetSendStream(video_send_stream_); |
| 1335 if (video_receive_streams_.size() == 1) | |
| 1336 analyzer.SetReceiveStream(video_receive_streams_[0]); | |
| 1312 video_send_stream_->SetSource( | 1337 video_send_stream_->SetSource( |
| 1313 analyzer.OutputInterface(), | 1338 analyzer.OutputInterface(), |
| 1314 VideoSendStream::DegradationPreference::kBalanced); | 1339 VideoSendStream::DegradationPreference::kBalanced); |
| 1315 | 1340 |
| 1316 CreateCapturer(); | 1341 CreateCapturer(); |
| 1317 rtc::VideoSinkWants wants; | 1342 rtc::VideoSinkWants wants; |
| 1318 video_capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants); | 1343 video_capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants); |
| 1319 | 1344 |
| 1320 StartEncodedFrameLogs(video_send_stream_); | 1345 StartEncodedFrameLogs(video_send_stream_); |
| 1321 StartEncodedFrameLogs(video_receive_streams_[0]); | 1346 StartEncodedFrameLogs(video_receive_streams_[0]); |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1537 std::ostringstream str; | 1562 std::ostringstream str; |
| 1538 str << receive_logs_++; | 1563 str << receive_logs_++; |
| 1539 std::string path = | 1564 std::string path = |
| 1540 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; | 1565 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; |
| 1541 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), | 1566 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), |
| 1542 10000000); | 1567 10000000); |
| 1543 } | 1568 } |
| 1544 } | 1569 } |
| 1545 | 1570 |
| 1546 } // namespace webrtc | 1571 } // namespace webrtc |
| OLD | NEW |