Index: webrtc/video/video_quality_test.cc |
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
index 1719595d3a7e2fa3094ffae43918d8b7306a92ed..aa5ff7121d9359e378cace1941a080e480a6a2d1 100644 |
--- a/webrtc/video/video_quality_test.cc |
+++ b/webrtc/video/video_quality_test.cc |
@@ -45,6 +45,7 @@ |
#include "webrtc/test/run_loop.h" |
#include "webrtc/test/statistics.h" |
#include "webrtc/test/testsupport/fileutils.h" |
+#include "webrtc/test/testsupport/frame_writer.h" |
#include "webrtc/test/vcm_capturer.h" |
#include "webrtc/test/video_renderer.h" |
#include "webrtc/voice_engine/include/voe_base.h" |
@@ -803,6 +804,11 @@ class VideoAnalyzer : public PacketReceiver, |
PrintResult("fec_bitrate", fec_bitrate_bps_, " bps"); |
PrintResult("send_bandwidth", send_bandwidth_bps_, " bps"); |
+ if (worst_frame_) { |
+ printf("RESULT min_psnr: %s = %lf dB\n", test_label_.c_str(), |
+ worst_frame_->psnr); |
+ } |
+ |
if (receive_stream_ != nullptr) { |
PrintResult("decode_time", decode_time_ms_, " ms"); |
} |
@@ -818,6 +824,29 @@ class VideoAnalyzer : public PacketReceiver, |
// will be flaky. |
PrintResult("memory_usage", memory_usage_, " bytes"); |
#endif |
+ // TODO(ilnik): enable frame writing for android, once jpeg frame writer |
+ // is implemented. |
+ |
+#if !defined(WEBRTC_ANDROID) |
+ if (worst_frame_) { |
+ test::Y4mFrameWriterImpl frame_writer(test_label_ + ".y4m", |
stefan-webrtc
2017/08/22 11:32:18
Isn't it better to write this to some directory ot
ilnik
2017/08/22 12:07:42
Yes, this problem is acknowledged. As Erik stated,
|
+ worst_frame_->frame.width(), |
+ worst_frame_->frame.height(), 1); |
+ bool res = frame_writer.Init(); |
+ RTC_DCHECK(res); |
+ size_t length = |
+ CalcBufferSize(VideoType::kI420, worst_frame_->frame.width(), |
+ worst_frame_->frame.height()); |
+ rtc::Buffer extracted_buffer(length); |
+ size_t extracted_length = |
+ ExtractBuffer(worst_frame_->frame.video_frame_buffer()->ToI420(), |
+ length, extracted_buffer.data()); |
+ RTC_DCHECK_EQ(extracted_length, frame_writer.FrameLength()); |
+ res = frame_writer.WriteFrame(extracted_buffer.data()); |
+ RTC_DCHECK(res); |
+ frame_writer.Close(); |
+ } |
+#endif |
// Disable quality check for quick test, as quality checks may fail |
// because too few samples were collected. |
@@ -837,6 +866,11 @@ class VideoAnalyzer : public PacketReceiver, |
} |
rtc::CritScope crit(&comparison_lock_); |
+ |
+ if (psnr >= 0.0 && (!worst_frame_ || worst_frame_->psnr > psnr)) { |
+ worst_frame_.emplace(FrameWithPsnr{psnr, *comparison.render}); |
+ } |
+ |
if (graph_data_output_file_) { |
samples_.push_back(Sample( |
comparison.dropped, comparison.input_time_ms, comparison.send_time_ms, |
@@ -1040,6 +1074,14 @@ class VideoAnalyzer : public PacketReceiver, |
test::Statistics send_bandwidth_bps_ GUARDED_BY(comparison_lock_); |
test::Statistics memory_usage_ GUARDED_BY(comparison_lock_); |
+ struct FrameWithPsnr { |
+ double psnr; |
+ VideoFrame frame; |
+ }; |
+ |
+ // Rendered frame with worst PSNR is saved for further analysis. |
+ rtc::Optional<FrameWithPsnr> worst_frame_ GUARDED_BY(comparison_lock_); |
+ |
size_t last_fec_bytes_; |
const int frames_to_process_; |