| Index: webrtc/video/video_quality_test.cc
|
| diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
|
| index 1df648bf04ec0f67f629e7d7544848ca5dc5d989..42d057daa328e69423913cfc881267dcd1ab1eef 100644
|
| --- a/webrtc/video/video_quality_test.cc
|
| +++ b/webrtc/video/video_quality_test.cc
|
| @@ -133,7 +133,9 @@
|
| 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 @@
|
| 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 @@
|
| 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.
|
| rtc::CritScope lock(&crit_);
|
| int64_t timestamp =
|
| wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_);
|
| @@ -247,13 +252,23 @@
|
|
|
| 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_);
|
| }
|
| }
|
|
|
| @@ -269,15 +284,15 @@
|
| 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.
|
| int64_t timestamp =
|
| wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_);
|
| send_times_[timestamp] = current_time;
|
| @@ -475,7 +490,9 @@
|
| 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_;
|
| @@ -785,9 +802,11 @@
|
| 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);
|
| @@ -815,12 +834,7 @@
|
|
|
| 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_;
|
| @@ -830,6 +844,8 @@
|
| 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_);
|
| @@ -864,7 +880,8 @@
|
| 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_;
|
|
|
| @@ -1312,7 +1329,7 @@
|
| 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(
|
| @@ -1321,7 +1338,9 @@
|
| 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);
|
|
|