Chromium Code Reviews| Index: webrtc/video/video_quality_test.cc |
| diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
| index 488532d93daed86e8269c52f1c0ba554fe3abe1d..29d2c9f3958660b44ae0e880648a99f93bc73da2 100644 |
| --- a/webrtc/video/video_quality_test.cc |
| +++ b/webrtc/video/video_quality_test.cc |
| @@ -42,16 +42,16 @@ class VideoAnalyzer : public PacketReceiver, |
| public Transport, |
| public VideoRenderer, |
| public VideoCaptureInput, |
| - public EncodedFrameObserver { |
| + public EncodedFrameObserver, |
| + public EncodingTimeObserver { |
| public: |
| - VideoAnalyzer(VideoCaptureInput* input, |
| - Transport* transport, |
| + VideoAnalyzer(Transport* transport, |
| const std::string& test_label, |
| double avg_psnr_threshold, |
| double avg_ssim_threshold, |
| int duration_frames, |
| FILE* graph_data_output_file) |
| - : input_(input), |
| + : input_(nullptr), |
| transport_(transport), |
| receiver_(nullptr), |
| send_stream_(nullptr), |
| @@ -123,6 +123,12 @@ class VideoAnalyzer : public PacketReceiver, |
| return receiver_->DeliverPacket(media_type, packet, length, packet_time); |
| } |
| + // EncodingTimeObserver. |
| + void OnEncodedFrame(const VideoFrame& frame, int encode_time_ms) override { |
| + rtc::CritScope crit(&comparison_lock_); |
| + samples_encode_time_ms_[frame.ntp_time_ms()] = encode_time_ms; |
| + } |
|
mflodman
2015/10/06 11:11:26
override
ivica
2015/10/06 12:04:32
Hmm, it already has override.
mflodman
2015/10/06 12:10:00
Doh, the window was too small and I missed that. *
ivica
2015/10/06 12:12:34
Haha :)
|
| + |
| void IncomingCapturedFrame(const VideoFrame& video_frame) override { |
| VideoFrame copy = video_frame; |
| copy.set_timestamp(copy.ntp_time_ms() * 90); |
| @@ -277,31 +283,31 @@ class VideoAnalyzer : public PacketReceiver, |
| }; |
| struct Sample { |
| - Sample(double dropped, |
| - double input_time_ms, |
| - double send_time_ms, |
| - double recv_time_ms, |
| - double encoded_frame_size, |
| + Sample(int dropped, |
| + int64_t input_time_ms, |
| + int64_t send_time_ms, |
| + int64_t recv_time_ms, |
| + int64_t render_time_ms, |
| + size_t encoded_frame_size, |
| double psnr, |
| - double ssim, |
| - double render_time_ms) |
| + double ssim) |
| : dropped(dropped), |
| input_time_ms(input_time_ms), |
| send_time_ms(send_time_ms), |
| recv_time_ms(recv_time_ms), |
| + render_time_ms(render_time_ms), |
| encoded_frame_size(encoded_frame_size), |
| psnr(psnr), |
| - ssim(ssim), |
| - render_time_ms(render_time_ms) {} |
| - |
| - double dropped; |
| - double input_time_ms; |
| - double send_time_ms; |
| - double recv_time_ms; |
| - double encoded_frame_size; |
| + ssim(ssim) {} |
| + |
| + int dropped; |
| + int64_t input_time_ms; |
| + int64_t send_time_ms; |
| + int64_t recv_time_ms; |
| + int64_t render_time_ms; |
| + size_t encoded_frame_size; |
| double psnr; |
| double ssim; |
| - double render_time_ms; |
| }; |
| void AddFrameComparison(const VideoFrame& reference, |
| @@ -463,8 +469,8 @@ class VideoAnalyzer : public PacketReceiver, |
| if (graph_data_output_file_) { |
| samples_.push_back( |
| Sample(comparison.dropped, input_time_ms, comparison.send_time_ms, |
| - comparison.recv_time_ms, comparison.encoded_frame_size, psnr, |
| - ssim, comparison.render_time_ms)); |
| + comparison.recv_time_ms, comparison.render_time_ms, |
| + comparison.encoded_frame_size, psnr, ssim)); |
| } |
| psnr_.AddSample(psnr); |
| ssim_.AddSample(ssim); |
| @@ -510,21 +516,39 @@ class VideoAnalyzer : public PacketReceiver, |
| "input_time_ms " |
| "send_time_ms " |
| "recv_time_ms " |
| + "render_time_ms " |
| "encoded_frame_size " |
| "psnr " |
| "ssim " |
| - "render_time_ms\n"); |
| + "encode_time_ms\n"); |
| + int missing_encode_time_samples = 0; |
| for (const Sample& sample : samples_) { |
| - fprintf(out, "%lf %lf %lf %lf %lf %lf %lf %lf\n", sample.dropped, |
| - sample.input_time_ms, sample.send_time_ms, sample.recv_time_ms, |
| + auto it = samples_encode_time_ms_.find(sample.input_time_ms); |
| + int encode_time_ms; |
| + if (it != samples_encode_time_ms_.end()) { |
| + encode_time_ms = it->second; |
| + } else { |
| + ++missing_encode_time_samples; |
| + encode_time_ms = -1; |
| + } |
| + fprintf(out, "%d %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRIuS |
| + " %lf %lf %d\n", |
| + sample.dropped, sample.input_time_ms, sample.send_time_ms, |
| + sample.recv_time_ms, sample.render_time_ms, |
| sample.encoded_frame_size, sample.psnr, sample.ssim, |
| - sample.render_time_ms); |
| + encode_time_ms); |
| + } |
| + if (missing_encode_time_samples) { |
| + fprintf(stderr, |
| + "Warning: Missing encode_time_ms samples for %d frame(s).\n", |
| + missing_encode_time_samples); |
| } |
| } |
| const std::string test_label_; |
| FILE* const graph_data_output_file_; |
| std::vector<Sample> samples_ GUARDED_BY(comparison_lock_); |
| + std::map<int64_t, int> samples_encode_time_ms_ GUARDED_BY(comparison_lock_); |
| test::Statistics sender_time_ GUARDED_BY(comparison_lock_); |
| test::Statistics receiver_time_ GUARDED_BY(comparison_lock_); |
| test::Statistics psnr_ GUARDED_BY(comparison_lock_); |
| @@ -735,7 +759,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| static_cast<uint8_t>(params.common.tl_discard_threshold), 0); |
| test::DirectTransport recv_transport(params.pipe); |
| VideoAnalyzer analyzer( |
| - nullptr, &send_transport, params.analyzer.test_label, |
| + &send_transport, params.analyzer.test_label, |
| params.analyzer.avg_psnr_threshold, params.analyzer.avg_ssim_threshold, |
| params.analyzer.test_durations_secs * params.common.fps, |
| graph_data_output_file); |
| @@ -749,6 +773,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| recv_transport.SetReceiver(sender_call_->Receiver()); |
| SetupFullStack(params, &analyzer, &recv_transport); |
| + send_config_.encoding_time_observer = &analyzer; |
| receive_configs_[0].renderer = &analyzer; |
| for (auto& config : receive_configs_) |
| config.pre_decode_callback = &analyzer; |