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> |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "webrtc/test/testsupport/fileutils.h" | 34 #include "webrtc/test/testsupport/fileutils.h" |
35 #include "webrtc/test/video_renderer.h" | 35 #include "webrtc/test/video_renderer.h" |
36 #include "webrtc/video/video_quality_test.h" | 36 #include "webrtc/video/video_quality_test.h" |
37 | 37 |
38 namespace webrtc { | 38 namespace webrtc { |
39 | 39 |
40 static const int kSendStatsPollingIntervalMs = 1000; | 40 static const int kSendStatsPollingIntervalMs = 1000; |
41 static const int kPayloadTypeH264 = 122; | 41 static const int kPayloadTypeH264 = 122; |
42 static const int kPayloadTypeVP8 = 123; | 42 static const int kPayloadTypeVP8 = 123; |
43 static const int kPayloadTypeVP9 = 124; | 43 static const int kPayloadTypeVP9 = 124; |
| 44 static const size_t kMaxComparisons = 10; |
44 | 45 |
45 class VideoAnalyzer : public PacketReceiver, | 46 class VideoAnalyzer : public PacketReceiver, |
46 public Transport, | 47 public Transport, |
47 public rtc::VideoSinkInterface<VideoFrame>, | 48 public rtc::VideoSinkInterface<VideoFrame>, |
48 public VideoCaptureInput, | 49 public VideoCaptureInput, |
49 public EncodedFrameObserver { | 50 public EncodedFrameObserver { |
50 public: | 51 public: |
51 VideoAnalyzer(test::LayerFilteringTransport* transport, | 52 VideoAnalyzer(test::LayerFilteringTransport* transport, |
52 const std::string& test_label, | 53 const std::string& test_label, |
53 double avg_psnr_threshold, | 54 double avg_psnr_threshold, |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 // TODO(ivica): Make this work for > 2 streams. | 402 // TODO(ivica): Make this work for > 2 streams. |
402 auto it = encoded_frame_sizes_.find(reference_timestamp); | 403 auto it = encoded_frame_sizes_.find(reference_timestamp); |
403 if (it == encoded_frame_sizes_.end()) | 404 if (it == encoded_frame_sizes_.end()) |
404 it = encoded_frame_sizes_.find(reference_timestamp - 1); | 405 it = encoded_frame_sizes_.find(reference_timestamp - 1); |
405 size_t encoded_size = it == encoded_frame_sizes_.end() ? 0 : it->second; | 406 size_t encoded_size = it == encoded_frame_sizes_.end() ? 0 : it->second; |
406 if (it != encoded_frame_sizes_.end()) | 407 if (it != encoded_frame_sizes_.end()) |
407 encoded_frame_sizes_.erase(it); | 408 encoded_frame_sizes_.erase(it); |
408 | 409 |
409 VideoFrame reference_copy; | 410 VideoFrame reference_copy; |
410 VideoFrame render_copy; | 411 VideoFrame render_copy; |
411 reference_copy.CopyFrame(reference); | |
412 render_copy.CopyFrame(render); | |
413 | 412 |
414 rtc::CritScope crit(&comparison_lock_); | 413 rtc::CritScope crit(&comparison_lock_); |
| 414 if (comparisons_.size() < kMaxComparisons) { |
| 415 reference_copy.CopyFrame(reference); |
| 416 render_copy.CopyFrame(render); |
| 417 } else { |
| 418 // Copy the time to ensure that delay calculations can still be made. |
| 419 reference_copy.set_ntp_time_ms(reference.ntp_time_ms()); |
| 420 render_copy.set_ntp_time_ms(render.ntp_time_ms()); |
| 421 } |
415 comparisons_.push_back(FrameComparison(reference_copy, render_copy, dropped, | 422 comparisons_.push_back(FrameComparison(reference_copy, render_copy, dropped, |
416 send_time_ms, recv_time_ms, | 423 send_time_ms, recv_time_ms, |
417 render_time_ms, encoded_size)); | 424 render_time_ms, encoded_size)); |
418 comparison_available_event_.Set(); | 425 comparison_available_event_.Set(); |
419 } | 426 } |
420 | 427 |
421 static bool PollStatsThread(void* obj) { | 428 static bool PollStatsThread(void* obj) { |
422 return static_cast<VideoAnalyzer*>(obj)->PollStats(); | 429 return static_cast<VideoAnalyzer*>(obj)->PollStats(); |
423 } | 430 } |
424 | 431 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 test_label_.c_str(), dropped_frames_before_first_encode_); | 546 test_label_.c_str(), dropped_frames_before_first_encode_); |
540 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n", | 547 printf("RESULT dropped_frames_before_rendering: %s = %d frames\n", |
541 test_label_.c_str(), dropped_frames_before_rendering_); | 548 test_label_.c_str(), dropped_frames_before_rendering_); |
542 | 549 |
543 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); | 550 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); |
544 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); | 551 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); |
545 } | 552 } |
546 | 553 |
547 void PerformFrameComparison(const FrameComparison& comparison) { | 554 void PerformFrameComparison(const FrameComparison& comparison) { |
548 // Perform expensive psnr and ssim calculations while not holding lock. | 555 // Perform expensive psnr and ssim calculations while not holding lock. |
549 double psnr = I420PSNR(&comparison.reference, &comparison.render); | 556 double psnr = -1.0; |
550 double ssim = I420SSIM(&comparison.reference, &comparison.render); | 557 double ssim = -1.0; |
| 558 if (!comparison.reference.IsZeroSize()) { |
| 559 psnr = I420PSNR(&comparison.reference, &comparison.render); |
| 560 ssim = I420SSIM(&comparison.reference, &comparison.render); |
| 561 } |
551 | 562 |
552 int64_t input_time_ms = comparison.reference.ntp_time_ms(); | 563 int64_t input_time_ms = comparison.reference.ntp_time_ms(); |
553 | 564 |
554 rtc::CritScope crit(&comparison_lock_); | 565 rtc::CritScope crit(&comparison_lock_); |
555 if (graph_data_output_file_) { | 566 if (graph_data_output_file_) { |
556 samples_.push_back( | 567 samples_.push_back( |
557 Sample(comparison.dropped, input_time_ms, comparison.send_time_ms, | 568 Sample(comparison.dropped, input_time_ms, comparison.send_time_ms, |
558 comparison.recv_time_ms, comparison.render_time_ms, | 569 comparison.recv_time_ms, comparison.render_time_ms, |
559 comparison.encoded_frame_size, psnr, ssim)); | 570 comparison.encoded_frame_size, psnr, ssim)); |
560 } | 571 } |
561 psnr_.AddSample(psnr); | 572 if (psnr >= 0.0) |
562 ssim_.AddSample(ssim); | 573 psnr_.AddSample(psnr); |
| 574 if (ssim >= 0.0) |
| 575 ssim_.AddSample(ssim); |
563 | 576 |
564 if (comparison.dropped) { | 577 if (comparison.dropped) { |
565 ++dropped_frames_; | 578 ++dropped_frames_; |
566 return; | 579 return; |
567 } | 580 } |
568 if (last_render_time_ != 0) | 581 if (last_render_time_ != 0) |
569 rendered_delta_.AddSample(comparison.render_time_ms - last_render_time_); | 582 rendered_delta_.AddSample(comparison.render_time_ms - last_render_time_); |
570 last_render_time_ = comparison.render_time_ms; | 583 last_render_time_ = comparison.render_time_ms; |
571 | 584 |
572 sender_time_.AddSample(comparison.send_time_ms - input_time_ms); | 585 sender_time_.AddSample(comparison.send_time_ms - input_time_ms); |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 video_send_stream_->Stop(); | 1169 video_send_stream_->Stop(); |
1157 receive_stream->Stop(); | 1170 receive_stream->Stop(); |
1158 | 1171 |
1159 call->DestroyVideoReceiveStream(receive_stream); | 1172 call->DestroyVideoReceiveStream(receive_stream); |
1160 call->DestroyVideoSendStream(video_send_stream_); | 1173 call->DestroyVideoSendStream(video_send_stream_); |
1161 | 1174 |
1162 transport.StopSending(); | 1175 transport.StopSending(); |
1163 } | 1176 } |
1164 | 1177 |
1165 } // namespace webrtc | 1178 } // namespace webrtc |
OLD | NEW |