Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: webrtc/video/video_quality_test.cc

Issue 2711493002: Adding cpu measurments to video_quality_tests (Closed)
Patch Set: Implemented Sprang@ comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 11
12 #include <stdio.h> 12 #include <stdio.h>
13 #include <algorithm> 13 #include <algorithm>
14 #include <deque> 14 #include <deque>
15 #include <map> 15 #include <map>
16 #include <sstream> 16 #include <sstream>
17 #include <string> 17 #include <string>
18 #include <vector> 18 #include <vector>
19 19
20 #include "webrtc/base/checks.h" 20 #include "webrtc/base/checks.h"
21 #include "webrtc/base/cpu_time.h"
21 #include "webrtc/base/event.h" 22 #include "webrtc/base/event.h"
22 #include "webrtc/base/format_macros.h" 23 #include "webrtc/base/format_macros.h"
23 #include "webrtc/base/optional.h" 24 #include "webrtc/base/optional.h"
24 #include "webrtc/base/platform_file.h" 25 #include "webrtc/base/platform_file.h"
25 #include "webrtc/base/timeutils.h" 26 #include "webrtc/base/timeutils.h"
26 #include "webrtc/call/call.h" 27 #include "webrtc/call/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/logging/rtc_event_log/rtc_event_log.h" 29 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
29 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" 30 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
30 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 31 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 pre_encode_proxy_(this), 156 pre_encode_proxy_(this),
156 encode_timing_proxy_(this), 157 encode_timing_proxy_(this),
157 frames_to_process_(duration_frames), 158 frames_to_process_(duration_frames),
158 frames_recorded_(0), 159 frames_recorded_(0),
159 frames_processed_(0), 160 frames_processed_(0),
160 dropped_frames_(0), 161 dropped_frames_(0),
161 dropped_frames_before_first_encode_(0), 162 dropped_frames_before_first_encode_(0),
162 dropped_frames_before_rendering_(0), 163 dropped_frames_before_rendering_(0),
163 last_render_time_(0), 164 last_render_time_(0),
164 rtp_timestamp_delta_(0), 165 rtp_timestamp_delta_(0),
166 cpu_time_(0),
167 wallclock_time_(0),
165 avg_psnr_threshold_(avg_psnr_threshold), 168 avg_psnr_threshold_(avg_psnr_threshold),
166 avg_ssim_threshold_(avg_ssim_threshold), 169 avg_ssim_threshold_(avg_ssim_threshold),
167 is_quick_test_enabled_(is_quick_test_enabled), 170 is_quick_test_enabled_(is_quick_test_enabled),
168 stats_polling_thread_(&PollStatsThread, this, "StatsPoller"), 171 stats_polling_thread_(&PollStatsThread, this, "StatsPoller"),
169 comparison_available_event_(false, false), 172 comparison_available_event_(false, false),
170 done_(true, false) { 173 done_(true, false) {
171 // Create thread pool for CPU-expensive PSNR/SSIM calculations. 174 // Create thread pool for CPU-expensive PSNR/SSIM calculations.
172 175
173 // Try to use about as many threads as cores, but leave kMinCoresLeft alone, 176 // Try to use about as many threads as cores, but leave kMinCoresLeft alone,
174 // so that we don't accidentally starve "real" worker threads (codec etc). 177 // so that we don't accidentally starve "real" worker threads (codec etc).
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 rtc::CritScope lock(&comparison_lock_); 326 rtc::CritScope lock(&comparison_lock_);
324 if (frames_recorded_ < frames_to_process_) 327 if (frames_recorded_ < frames_to_process_)
325 encoded_frame_size_.AddSample(frame.length_); 328 encoded_frame_size_.AddSample(frame.length_);
326 } 329 }
327 330
328 void OnFrame(const VideoFrame& video_frame) override { 331 void OnFrame(const VideoFrame& video_frame) override {
329 int64_t render_time_ms = 332 int64_t render_time_ms =
330 Clock::GetRealTimeClock()->CurrentNtpInMilliseconds(); 333 Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
331 334
332 rtc::CritScope lock(&crit_); 335 rtc::CritScope lock(&crit_);
336
337 StartExcludingCpuThreadTime();
338
333 int64_t send_timestamp = 339 int64_t send_timestamp =
334 wrap_handler_.Unwrap(video_frame.timestamp() - rtp_timestamp_delta_); 340 wrap_handler_.Unwrap(video_frame.timestamp() - rtp_timestamp_delta_);
335 341
336 while (wrap_handler_.Unwrap(frames_.front().timestamp()) < send_timestamp) { 342 while (wrap_handler_.Unwrap(frames_.front().timestamp()) < send_timestamp) {
337 if (!last_rendered_frame_) { 343 if (!last_rendered_frame_) {
338 // No previous frame rendered, this one was dropped after sending but 344 // No previous frame rendered, this one was dropped after sending but
339 // before rendering. 345 // before rendering.
340 ++dropped_frames_before_rendering_; 346 ++dropped_frames_before_rendering_;
341 } else { 347 } else {
342 AddFrameComparison(frames_.front(), *last_rendered_frame_, true, 348 AddFrameComparison(frames_.front(), *last_rendered_frame_, true,
(...skipping 10 matching lines...) Expand all
353 if (send_timestamp == reference_timestamp - 1) { 359 if (send_timestamp == reference_timestamp - 1) {
354 // TODO(ivica): Make this work for > 2 streams. 360 // TODO(ivica): Make this work for > 2 streams.
355 // Look at RTPSender::BuildRTPHeader. 361 // Look at RTPSender::BuildRTPHeader.
356 ++send_timestamp; 362 ++send_timestamp;
357 } 363 }
358 ASSERT_EQ(reference_timestamp, send_timestamp); 364 ASSERT_EQ(reference_timestamp, send_timestamp);
359 365
360 AddFrameComparison(reference_frame, video_frame, false, render_time_ms); 366 AddFrameComparison(reference_frame, video_frame, false, render_time_ms);
361 367
362 last_rendered_frame_ = rtc::Optional<VideoFrame>(video_frame); 368 last_rendered_frame_ = rtc::Optional<VideoFrame>(video_frame);
369
370 StopExcludingCpuThreadTime();
363 } 371 }
364 372
365 void Wait() { 373 void Wait() {
366 // Frame comparisons can be very expensive. Wait for test to be done, but 374 // Frame comparisons can be very expensive. Wait for test to be done, but
367 // at time-out check if frames_processed is going up. If so, give it more 375 // at time-out check if frames_processed is going up. If so, give it more
368 // time, otherwise fail. Hopefully this will reduce test flakiness. 376 // time, otherwise fail. Hopefully this will reduce test flakiness.
369 377
370 stats_polling_thread_.Start(); 378 stats_polling_thread_.Start();
371 379
372 int last_frames_processed = -1; 380 int last_frames_processed = -1;
(...skipping 29 matching lines...) Expand all
402 printf("- Farewell, sweet Concorde!\n"); 410 printf("- Farewell, sweet Concorde!\n");
403 411
404 stats_polling_thread_.Stop(); 412 stats_polling_thread_.Stop();
405 } 413 }
406 414
407 rtc::VideoSinkInterface<VideoFrame>* pre_encode_proxy() { 415 rtc::VideoSinkInterface<VideoFrame>* pre_encode_proxy() {
408 return &pre_encode_proxy_; 416 return &pre_encode_proxy_;
409 } 417 }
410 EncodedFrameObserver* encode_timing_proxy() { return &encode_timing_proxy_; } 418 EncodedFrameObserver* encode_timing_proxy() { return &encode_timing_proxy_; }
411 419
420 void StartMeasuringCpuProcessTime() {
421 rtc::CritScope lock(&cpu_measurement_lock_);
422 cpu_time_ -= rtc::GetProcessCpuTimeNanos();
423 wallclock_time_ -= rtc::SystemTimeNanos();
424 }
425
426 void StopMeasuringCpuProcessTime() {
427 rtc::CritScope lock(&cpu_measurement_lock_);
428 cpu_time_ += rtc::GetProcessCpuTimeNanos();
429 wallclock_time_ += rtc::SystemTimeNanos();
430 }
431
432 void StartExcludingCpuThreadTime() {
433 rtc::CritScope lock(&cpu_measurement_lock_);
434 cpu_time_ += rtc::GetThreadCpuTimeNanos();
435 }
436
437 void StopExcludingCpuThreadTime() {
438 rtc::CritScope lock(&cpu_measurement_lock_);
439 cpu_time_ -= rtc::GetThreadCpuTimeNanos();
440 }
441
442 double GetCpuUsagePercent() {
443 rtc::CritScope lock(&cpu_measurement_lock_);
444 return static_cast<double>(cpu_time_) / wallclock_time_ * 100.0;
445 }
446
412 test::LayerFilteringTransport* const transport_; 447 test::LayerFilteringTransport* const transport_;
413 PacketReceiver* receiver_; 448 PacketReceiver* receiver_;
414 449
415 private: 450 private:
416 struct FrameComparison { 451 struct FrameComparison {
417 FrameComparison() 452 FrameComparison()
418 : dropped(false), 453 : dropped(false),
419 input_time_ms(0), 454 input_time_ms(0),
420 send_time_ms(0), 455 send_time_ms(0),
421 recv_time_ms(0), 456 recv_time_ms(0),
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 // Wait until new comparison task is available, or test is done. 637 // Wait until new comparison task is available, or test is done.
603 // If done, wake up remaining threads waiting. 638 // If done, wake up remaining threads waiting.
604 comparison_available_event_.Wait(1000); 639 comparison_available_event_.Wait(1000);
605 if (AllFramesRecorded()) { 640 if (AllFramesRecorded()) {
606 comparison_available_event_.Set(); 641 comparison_available_event_.Set();
607 return false; 642 return false;
608 } 643 }
609 return true; // Try again. 644 return true; // Try again.
610 } 645 }
611 646
647 StartExcludingCpuThreadTime();
648
612 PerformFrameComparison(comparison); 649 PerformFrameComparison(comparison);
613 650
651 StopExcludingCpuThreadTime();
652
614 if (FrameProcessed()) { 653 if (FrameProcessed()) {
615 PrintResults(); 654 PrintResults();
616 if (graph_data_output_file_) 655 if (graph_data_output_file_)
617 PrintSamplesToFile(); 656 PrintSamplesToFile();
618 done_.Set(); 657 done_.Set();
619 comparison_available_event_.Set(); 658 comparison_available_event_.Set();
620 return false; 659 return false;
621 } 660 }
622 661
623 return true; 662 return true;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 // Increase count of number of frames processed. Returns true if this was the 695 // Increase count of number of frames processed. Returns true if this was the
657 // last frame to be processed. 696 // last frame to be processed.
658 bool FrameProcessed() { 697 bool FrameProcessed() {
659 rtc::CritScope crit(&comparison_lock_); 698 rtc::CritScope crit(&comparison_lock_);
660 ++frames_processed_; 699 ++frames_processed_;
661 assert(frames_processed_ <= frames_to_process_); 700 assert(frames_processed_ <= frames_to_process_);
662 return frames_processed_ == frames_to_process_; 701 return frames_processed_ == frames_to_process_;
663 } 702 }
664 703
665 void PrintResults() { 704 void PrintResults() {
705 StopMeasuringCpuProcessTime();
666 rtc::CritScope crit(&comparison_lock_); 706 rtc::CritScope crit(&comparison_lock_);
667 PrintResult("psnr", psnr_, " dB"); 707 PrintResult("psnr", psnr_, " dB");
668 PrintResult("ssim", ssim_, " score"); 708 PrintResult("ssim", ssim_, " score");
669 PrintResult("sender_time", sender_time_, " ms"); 709 PrintResult("sender_time", sender_time_, " ms");
670 PrintResult("receiver_time", receiver_time_, " ms"); 710 PrintResult("receiver_time", receiver_time_, " ms");
671 PrintResult("total_delay_incl_network", end_to_end_, " ms"); 711 PrintResult("total_delay_incl_network", end_to_end_, " ms");
672 PrintResult("time_between_rendered_frames", rendered_delta_, " ms"); 712 PrintResult("time_between_rendered_frames", rendered_delta_, " ms");
673 PrintResult("encoded_frame_size", encoded_frame_size_, " bytes"); 713 PrintResult("encoded_frame_size", encoded_frame_size_, " bytes");
674 PrintResult("encode_frame_rate", encode_frame_rate_, " fps"); 714 PrintResult("encode_frame_rate", encode_frame_rate_, " fps");
675 PrintResult("encode_time", encode_time_ms_, " ms"); 715 PrintResult("encode_time", encode_time_ms_, " ms");
676 PrintResult("encode_usage_percent", encode_usage_percent_, " percent"); 716 PrintResult("encode_usage_percent", encode_usage_percent_, " percent");
677 PrintResult("media_bitrate", media_bitrate_bps_, " bps"); 717 PrintResult("media_bitrate", media_bitrate_bps_, " bps");
678 718
679 if (receive_stream_ != nullptr) { 719 if (receive_stream_ != nullptr) {
680 PrintResult("decode_time", decode_time_ms_, " ms"); 720 PrintResult("decode_time", decode_time_ms_, " ms");
681 PrintResult("decode_time_max", decode_time_max_ms_, " ms"); 721 PrintResult("decode_time_max", decode_time_max_ms_, " ms");
682 } 722 }
683 723
684 printf("RESULT dropped_frames: %s = %d frames\n", test_label_.c_str(), 724 printf("RESULT dropped_frames: %s = %d frames\n", test_label_.c_str(),
685 dropped_frames_); 725 dropped_frames_);
686 printf("RESULT dropped_frames_before_first_encode: %s = %d frames\n", 726 printf("RESULT dropped_frames_before_first_encode: %s = %d frames\n",
687 test_label_.c_str(), dropped_frames_before_first_encode_); 727 test_label_.c_str(), dropped_frames_before_first_encode_);
688 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n", 728 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n",
689 test_label_.c_str(), dropped_frames_before_rendering_); 729 test_label_.c_str(), dropped_frames_before_rendering_);
730 printf("RESULT cpu_usage: %s = %lf %%\n", test_label_.c_str(),
731 GetCpuUsagePercent());
690 // Disable quality check for quick test, as quality checks may fail 732 // Disable quality check for quick test, as quality checks may fail
691 // because too few samples were collected. 733 // because too few samples were collected.
692 if (!is_quick_test_enabled_) { 734 if (!is_quick_test_enabled_) {
693 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); 735 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_);
694 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); 736 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_);
695 } 737 }
696 } 738 }
697 739
698 void PerformFrameComparison(const FrameComparison& comparison) { 740 void PerformFrameComparison(const FrameComparison& comparison) {
699 // Perform expensive psnr and ssim calculations while not holding lock. 741 // Perform expensive psnr and ssim calculations while not holding lock.
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 921
880 const int frames_to_process_; 922 const int frames_to_process_;
881 int frames_recorded_; 923 int frames_recorded_;
882 int frames_processed_; 924 int frames_processed_;
883 int dropped_frames_; 925 int dropped_frames_;
884 int dropped_frames_before_first_encode_; 926 int dropped_frames_before_first_encode_;
885 int dropped_frames_before_rendering_; 927 int dropped_frames_before_rendering_;
886 int64_t last_render_time_; 928 int64_t last_render_time_;
887 uint32_t rtp_timestamp_delta_; 929 uint32_t rtp_timestamp_delta_;
888 930
931 int64_t cpu_time_ GUARDED_BY(cpu_measurement_lock_);
932 int64_t wallclock_time_ GUARDED_BY(cpu_measurement_lock_);
933 rtc::CriticalSection cpu_measurement_lock_;
934
889 rtc::CriticalSection crit_; 935 rtc::CriticalSection crit_;
890 std::deque<VideoFrame> frames_ GUARDED_BY(crit_); 936 std::deque<VideoFrame> frames_ GUARDED_BY(crit_);
891 rtc::Optional<VideoFrame> last_rendered_frame_ GUARDED_BY(crit_); 937 rtc::Optional<VideoFrame> last_rendered_frame_ GUARDED_BY(crit_);
892 rtc::TimestampWrapAroundHandler wrap_handler_ GUARDED_BY(crit_); 938 rtc::TimestampWrapAroundHandler wrap_handler_ GUARDED_BY(crit_);
893 std::map<int64_t, int64_t> send_times_ GUARDED_BY(crit_); 939 std::map<int64_t, int64_t> send_times_ GUARDED_BY(crit_);
894 std::map<int64_t, int64_t> recv_times_ GUARDED_BY(crit_); 940 std::map<int64_t, int64_t> recv_times_ GUARDED_BY(crit_);
895 std::map<int64_t, size_t> encoded_frame_sizes_ GUARDED_BY(crit_); 941 std::map<int64_t, size_t> encoded_frame_sizes_ GUARDED_BY(crit_);
896 rtc::Optional<uint32_t> first_encoded_timestamp_ GUARDED_BY(crit_); 942 rtc::Optional<uint32_t> first_encoded_timestamp_ GUARDED_BY(crit_);
897 rtc::Optional<uint32_t> first_sent_timestamp_ GUARDED_BY(crit_); 943 rtc::Optional<uint32_t> first_sent_timestamp_ GUARDED_BY(crit_);
898 const double avg_psnr_threshold_; 944 const double avg_psnr_threshold_;
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 rtc::VideoSinkWants wants; 1431 rtc::VideoSinkWants wants;
1386 video_capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants); 1432 video_capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants);
1387 1433
1388 StartEncodedFrameLogs(video_send_stream_); 1434 StartEncodedFrameLogs(video_send_stream_);
1389 StartEncodedFrameLogs(video_receive_streams_[0]); 1435 StartEncodedFrameLogs(video_receive_streams_[0]);
1390 video_send_stream_->Start(); 1436 video_send_stream_->Start();
1391 for (VideoReceiveStream* receive_stream : video_receive_streams_) 1437 for (VideoReceiveStream* receive_stream : video_receive_streams_)
1392 receive_stream->Start(); 1438 receive_stream->Start();
1393 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_) 1439 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_)
1394 receive_stream->Start(); 1440 receive_stream->Start();
1441 analyzer.StartMeasuringCpuProcessTime();
1395 video_capturer_->Start(); 1442 video_capturer_->Start();
1396 1443
1397 analyzer.Wait(); 1444 analyzer.Wait();
1398 1445
1399 send_transport.StopSending(); 1446 send_transport.StopSending();
1400 recv_transport.StopSending(); 1447 recv_transport.StopSending();
1401 1448
1402 video_capturer_->Stop(); 1449 video_capturer_->Stop();
1403 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_) 1450 for (FlexfecReceiveStream* receive_stream : flexfec_receive_streams_)
1404 receive_stream->Stop(); 1451 receive_stream->Stop();
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 std::ostringstream str; 1651 std::ostringstream str;
1605 str << receive_logs_++; 1652 str << receive_logs_++;
1606 std::string path = 1653 std::string path =
1607 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; 1654 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf";
1608 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), 1655 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path),
1609 10000000); 1656 10000000);
1610 } 1657 }
1611 } 1658 }
1612 1659
1613 } // namespace webrtc 1660 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698