/* * 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 <stdio.h> #include <string> #include <vector> #include "api/scoped_refptr.h" #include "api/test/metrics/metrics_logger.h" #include "api/video/video_frame_buffer.h" #include "rtc_tools/video_file_reader.h" namespace webrtc { namespace test { struct AnalysisResult { … }; struct ResultsContainer { … }; // 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<AnalysisResult> RunAnalysis( const rtc::scoped_refptr<webrtc::test::Video>& reference_video, const rtc::scoped_refptr<webrtc::test::Video>& test_video, const std::vector<size_t>& 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<I420BufferInterface>& ref_buffer, const rtc::scoped_refptr<I420BufferInterface>& 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<I420BufferInterface>& ref_buffer, const rtc::scoped_refptr<I420BufferInterface>& 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, MetricsLogger& logger); struct Cluster { … }; // Clusters sequentially repeated frames. For example, the sequence {100, 102, // 102, 103} will be mapped to {{100, 1}, {102, 2}, {103, 1}}. std::vector<Cluster> CalculateFrameClusters(const std::vector<size_t>& 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<Cluster>& clusters); // Get the longest sequence of skipped reference frames. This corresponds to the // longest freeze in the test video. int GetMaxSkippedFrames(const std::vector<Cluster>& clusters); // Get total number of skipped frames in the test video. int GetTotalNumberOfSkippedFrames(const std::vector<Cluster>& clusters); } // namespace test } // namespace webrtc #endif // RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_