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 c1e07864d270aa9572667079e4e3a8a5e3d2c5c1..b03b61c92a0285bf443e59d66af250dc9b9ceaa8 100644 |
| --- a/webrtc/video/video_quality_test.cc |
| +++ b/webrtc/video/video_quality_test.cc |
| @@ -133,7 +133,9 @@ class VideoAnalyzer : public PacketReceiver, |
| int duration_frames, |
| FILE* graph_data_output_file, |
| const std::string& graph_title, |
| - uint32_t ssrc_to_analyze) |
| + uint32_t ssrc_to_analyze, |
| + uint32_t selected_width, |
| + uint32_t selected_height) |
| : transport_(transport), |
| receiver_(nullptr), |
| send_stream_(nullptr), |
| @@ -143,6 +145,8 @@ class VideoAnalyzer : public PacketReceiver, |
| graph_data_output_file_(graph_data_output_file), |
| graph_title_(graph_title), |
| ssrc_to_analyze_(ssrc_to_analyze), |
| + selected_width_(selected_width), |
| + selected_height_(selected_height), |
| pre_encode_proxy_(this), |
| encode_timing_proxy_(this), |
| frames_to_process_(duration_frames), |
| @@ -226,10 +230,11 @@ class VideoAnalyzer : public PacketReceiver, |
| RtpUtility::RtpHeaderParser parser(packet, length); |
| RTPHeader header; |
| parser.Parse(&header); |
| - if (!IsFlexfec(header.payloadType)) { |
| + if (!IsFlexfec(header.payloadType) && header.ssrc != ssrc_to_analyze_) { |
| // Ignore FlexFEC timestamps, to avoid collisions with media timestamps. |
| // (FlexFEC and media are sent on different SSRCs, which have different |
| // timestamps spaces.) |
| + // Also ignore packets from wrong SSRC |
|
sprang_webrtc
2017/02/01 14:50:20
nit: End comments with period.
ilnik
2017/02/01 15:12:50
Done.
|
| rtc::CritScope lock(&crit_); |
| int64_t timestamp = |
| wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_); |
| @@ -247,13 +252,24 @@ class VideoAnalyzer : public PacketReceiver, |
| void PreEncodeOnFrame(const VideoFrame& video_frame) { |
| rtc::CritScope lock(&crit_); |
| - if (!first_send_timestamp_ && rtp_timestamp_delta_ == 0) { |
| + if (!first_encoded_timestamp_) { |
| while (frames_.front().timestamp() != video_frame.timestamp()) { |
| ++dropped_frames_before_first_encode_; |
| frames_.pop_front(); |
| RTC_CHECK(!frames_.empty()); |
| } |
| - first_send_timestamp_ = rtc::Optional<uint32_t>(video_frame.timestamp()); |
| + first_encoded_timestamp_ = |
| + rtc::Optional<uint32_t>(video_frame.timestamp()); |
| + } |
| + } |
| + |
| + |
| + void PostEncodeFrameCallback(const EncodedFrame& encoded_frame) { |
| + rtc::CritScope lock(&crit_); |
| + if (!first_sent_timestamp_ && |
| + encoded_frame.encoded_width_ == selected_width_ && |
| + encoded_frame.encoded_height_ == selected_height_) { |
| + first_sent_timestamp_ = rtc::Optional<uint32_t>(encoded_frame.timestamp_); |
|
sprang_webrtc
2017/02/01 14:50:20
You can also do
first_sent_timestamp_.emplace(en
ilnik
2017/02/01 15:12:50
Acknowledged.
|
| } |
| } |
| @@ -269,15 +285,15 @@ class VideoAnalyzer : public PacketReceiver, |
| bool result = transport_->SendRtp(packet, length, options); |
| { |
| rtc::CritScope lock(&crit_); |
| - |
| - if (rtp_timestamp_delta_ == 0) { |
| - rtp_timestamp_delta_ = header.timestamp - *first_send_timestamp_; |
| - first_send_timestamp_ = rtc::Optional<uint32_t>(); |
| + if (rtp_timestamp_delta_ == 0 && header.ssrc == ssrc_to_analyze_) { |
| + rtp_timestamp_delta_ = header.timestamp - *first_sent_timestamp_; |
| } |
| - if (!IsFlexfec(header.payloadType)) { |
| + |
| + if (!IsFlexfec(header.payloadType) && header.ssrc == ssrc_to_analyze_) { |
| // Ignore FlexFEC timestamps, to avoid collisions with media timestamps. |
| // (FlexFEC and media are sent on different SSRCs, which have different |
| // timestamps spaces.) |
| + // Also ignore packets from wrong SSRC |
|
sprang_webrtc
2017/02/01 14:50:20
dito
ilnik
2017/02/01 15:12:50
Done.
|
| int64_t timestamp = |
| wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_); |
| send_times_[timestamp] = current_time; |
| @@ -477,7 +493,9 @@ class VideoAnalyzer : public PacketReceiver, |
| void OnEncodeTiming(int64_t ntp_time_ms, int encode_time_ms) override { |
| parent_->MeasuredEncodeTiming(ntp_time_ms, encode_time_ms); |
| } |
| - void EncodedFrameCallback(const EncodedFrame& frame) override {} |
| + void EncodedFrameCallback(const EncodedFrame& frame) override { |
| + parent_->PostEncodeFrameCallback(frame); |
| + } |
| private: |
| VideoAnalyzer* const parent_; |
| @@ -787,9 +805,11 @@ class VideoAnalyzer : public PacketReceiver, |
| private: |
| void OnFrame(const VideoFrame& video_frame) override { |
| VideoFrame copy = video_frame; |
| + // Frames from the capturer does not have a rtp timestamp. |
| + // Create one so it can be used for comparison. |
| + RTC_DCHECK_EQ(0, video_frame.timestamp()); |
| copy.set_timestamp(copy.ntp_time_ms() * 90); |
| - |
| - analyzer_->AddCapturedFrameForComparison(video_frame); |
| + analyzer_->AddCapturedFrameForComparison(copy); |
| rtc::CritScope lock(&crit_); |
| if (send_stream_input_) |
| send_stream_input_->OnFrame(video_frame); |
| @@ -817,14 +837,10 @@ class VideoAnalyzer : public PacketReceiver, |
| void AddCapturedFrameForComparison(const VideoFrame& video_frame) { |
| rtc::CritScope lock(&crit_); |
| - RTC_DCHECK_EQ(0, video_frame.timestamp()); |
| - // Frames from the capturer does not have a rtp timestamp. Create one so it |
| - // can be used for comparison. |
| - VideoFrame copy = video_frame; |
| - copy.set_timestamp(copy.ntp_time_ms() * 90); |
| - frames_.push_back(copy); |
| + frames_.push_back(video_frame); |
| } |
| + |
| VideoSendStream* send_stream_; |
| VideoReceiveStream* receive_stream_; |
| CapturedFrameForwarder captured_frame_forwarder_; |
| @@ -832,6 +848,8 @@ class VideoAnalyzer : public PacketReceiver, |
| FILE* const graph_data_output_file_; |
| const std::string graph_title_; |
| const uint32_t ssrc_to_analyze_; |
| + const uint32_t selected_width_; |
| + const uint32_t selected_height_; |
| PreEncodeProxy pre_encode_proxy_; |
| OnEncodeTimingProxy encode_timing_proxy_; |
| std::vector<Sample> samples_ GUARDED_BY(comparison_lock_); |
| @@ -866,7 +884,8 @@ class VideoAnalyzer : public PacketReceiver, |
| std::map<int64_t, int64_t> send_times_ GUARDED_BY(crit_); |
| std::map<int64_t, int64_t> recv_times_ GUARDED_BY(crit_); |
| std::map<int64_t, size_t> encoded_frame_sizes_ GUARDED_BY(crit_); |
| - rtc::Optional<uint32_t> first_send_timestamp_ GUARDED_BY(crit_); |
| + rtc::Optional<uint32_t> first_encoded_timestamp_ GUARDED_BY(crit_); |
| + rtc::Optional<uint32_t> first_sent_timestamp_ GUARDED_BY(crit_); |
| const double avg_psnr_threshold_; |
| const double avg_ssim_threshold_; |
| @@ -1310,7 +1329,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| if (disable_quality_check) { |
| fprintf(stderr, |
| "Warning: Calculating PSNR and SSIM for downsized resolution " |
| - "not implemented yet! Skipping PSNR and SSIM calculations!"); |
| + "not implemented yet! Skipping PSNR and SSIM calculations!\n"); |
| } |
| VideoAnalyzer analyzer( |
| @@ -1319,7 +1338,9 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| disable_quality_check ? -1.1 : params_.analyzer.avg_ssim_threshold, |
| params_.analyzer.test_durations_secs * params_.video.fps, |
| graph_data_output_file, graph_title, |
| - kVideoSendSsrcs[params_.ss.selected_stream]); |
| + kVideoSendSsrcs[params_.ss.selected_stream], |
| + static_cast<uint32_t>(selected_stream.width), |
| + static_cast<uint32_t>(selected_stream.height)); |
| analyzer.SetReceiver(receiver_call_->Receiver()); |
| send_transport.SetReceiver(&analyzer); |