/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_ #define RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_ #include #include #include #include "api/scoped_refptr.h" #include "api/video/video_frame_buffer.h" #include "rtc_tools/video_file_reader.h" namespace webrtc { namespace test { struct AnalysisResult { AnalysisResult() {} AnalysisResult(int frame_number, double psnr_value, double ssim_value) : frame_number(frame_number), psnr_value(psnr_value), ssim_value(ssim_value) {} int frame_number; double psnr_value; double ssim_value; }; struct ResultsContainer { ResultsContainer(); ~ResultsContainer(); std::vector frames; int max_repeated_frames = 0; int max_skipped_frames = 0; int total_skipped_frames = 0; int decode_errors_ref = 0; int decode_errors_test = 0; }; // A function to run the PSNR and SSIM analysis on the test file. The test file // comprises the frames that were captured during the quality measurement test. // There may be missing or duplicate frames. Also the frames start at a random // position in the original video. We also need to provide a map from test frame // indices to reference frame indices. std::vector RunAnalysis( const rtc::scoped_refptr& reference_video, const rtc::scoped_refptr& test_video, const std::vector& test_frame_indices); // Compute PSNR for an I420 buffer (all planes). The max return value (in the // case where the test and reference frames are exactly the same) will be 48. double Psnr(const rtc::scoped_refptr& ref_buffer, const rtc::scoped_refptr& test_buffer); // Compute SSIM for an I420 buffer (all planes). The max return value (in the // case where the test and reference frames are exactly the same) will be 1. double Ssim(const rtc::scoped_refptr& ref_buffer, const rtc::scoped_refptr& test_buffer); // Prints the result from the analysis in Chromium performance // numbers compatible format to stdout. If the results object contains no frames // no output will be written. void PrintAnalysisResults(const std::string& label, ResultsContainer* results); // Similar to the above, but will print to the specified file handle. void PrintAnalysisResults(FILE* output, const std::string& label, ResultsContainer* results); struct Cluster { // Corresponding reference frame index for this cluster. size_t index; // The number of sequential frames that mapped to the same reference frame // index. int number_of_repeated_frames; }; // Clusters sequentially repeated frames. For example, the sequence {100, 102, // 102, 103} will be mapped to {{100, 1}, {102, 2}, {103, 1}}. std::vector CalculateFrameClusters(const std::vector& indices); // Get number of max sequentially repeated frames in the test video. This number // will be one if we only store unique frames in the test video. int GetMaxRepeatedFrames(const std::vector& clusters); // Get the longest sequence of skipped reference frames. This corresponds to the // longest freeze in the test video. int GetMaxSkippedFrames(const std::vector& clusters); // Get total number of skipped frames in the test video. int GetTotalNumberOfSkippedFrames(const std::vector& clusters); } // namespace test } // namespace webrtc #endif // RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_