blob: f5a9c2b8278babe9211e00118e204c6c629121bd [file] [log] [blame]
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000011#include <stdio.h>
12#include <stdlib.h>
13
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000014#include <map>
pbos@webrtc.orgba7f6a82013-06-04 08:14:10 +000015#include <string>
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000016#include <vector>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_tools/frame_analyzer/video_quality_analysis.h"
19#include "rtc_tools/simple_command_line_parser.h"
Magnus Jedvert404be7f2018-08-22 19:23:34 +020020#include "rtc_tools/y4m_file_reader.h"
Edward Lemur2e5966b2018-01-30 15:33:02 +010021#include "test/testsupport/perf_test.h"
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000022
vspasova@webrtc.orgac410e22012-08-27 14:57:19 +000023/*
24 * A command line tool running PSNR and SSIM on a reference video and a test
25 * video. The test video is a record of the reference video which can start at
26 * an arbitrary point. It is possible that there will be repeated frames or
27 * skipped frames as well. In order to have a way to compare corresponding
mandermo74568172017-01-17 03:24:57 -080028 * frames from the two videos, two stats files should be provided. One for the
29 * reference video and one for the test video. The stats file
vspasova@webrtc.orgac410e22012-08-27 14:57:19 +000030 * is a text file assumed to be in the format:
mandermo74568172017-01-17 03:24:57 -080031 * frame_xxxx yyyy where xxxx is the frame number in and yyyy is the
32 * corresponding barcode. The video files should be 1420 YUV videos.
kjellander@webrtc.orgf880f862013-09-10 12:10:01 +000033 * The tool prints the result to standard output in the Chromium perf format:
34 * RESULT <metric>:<label>= <values>
vspasova@webrtc.orgac410e22012-08-27 14:57:19 +000035 *
36 * The max value for PSNR is 48.0 (between equal frames), as for SSIM it is 1.0.
37 *
38 * Usage:
kjellander@webrtc.orgf880f862013-09-10 12:10:01 +000039 * frame_analyzer --label=<test_label> --reference_file=<name_of_file>
mandermo74568172017-01-17 03:24:57 -080040 * --test_file_ref=<name_of_file> --stats_file_test=<name_of_file>
41 * --stats_file=<name_of_file> --width=<frame_width>
kjellander@webrtc.orgf880f862013-09-10 12:10:01 +000042 * --height=<frame_height>
vspasova@webrtc.orgac410e22012-08-27 14:57:19 +000043 */
Robin Raymond1c62ffa2017-12-03 16:45:56 -050044int main(int argc, char* argv[]) {
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000045 std::string program_name = argv[0];
mandermo74568172017-01-17 03:24:57 -080046 std::string usage =
47 "Compares the output video with the initially sent video."
48 "\nExample usage:\n" +
49 program_name +
50 " --reference_file=ref.yuv --test_file=test.yuv --width=320 "
51 "--height=240\n"
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000052 "Command line flags:\n"
vspasova@webrtc.orgac410e22012-08-27 14:57:19 +000053 " - width(int): The width of the reference and test files. Default: -1\n"
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000054 " - height(int): The height of the reference and test files. "
55 " Default: -1\n"
kjellander@webrtc.orgf880f862013-09-10 12:10:01 +000056 " - label(string): The label to use for the perf output."
57 " Default: MY_TEST\n"
mandermo74568172017-01-17 03:24:57 -080058 " - stats_file_ref(string): The path to the stats file that will be"
59 " produced for the reference video file."
60 " Default: stats_ref.txt\n"
61 " - stats_file_test(string): The path to the stats file that will be"
62 " produced for the test video file."
63 " Default: stats_test.txt\n"
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000064 " - reference_file(string): The reference YUV file to compare against."
65 " Default: ref.yuv\n"
66 " - test_file(string): The test YUV file to run the analysis for."
Edward Lemur2e5966b2018-01-30 15:33:02 +010067 " Default: test_file.yuv\n"
68 " - chartjson_result_file: Where to store perf result in chartjson"
69 " format. If not present, no perf result will be stored."
70 " Default: None\n";
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000071
72 webrtc::test::CommandLineParser parser;
73
74 // Init the parser and set the usage message
75 parser.Init(argc, argv);
76 parser.SetUsageMessage(usage);
77
78 parser.SetFlag("width", "-1");
79 parser.SetFlag("height", "-1");
kjellander@webrtc.orgf880f862013-09-10 12:10:01 +000080 parser.SetFlag("label", "MY_TEST");
mandermo74568172017-01-17 03:24:57 -080081 parser.SetFlag("stats_file_ref", "stats_ref.txt");
82 parser.SetFlag("stats_file_test", "stats_test.txt");
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000083 parser.SetFlag("reference_file", "ref.yuv");
84 parser.SetFlag("test_file", "test.yuv");
Edward Lemur2e5966b2018-01-30 15:33:02 +010085 parser.SetFlag("chartjson_result_file", "");
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000086 parser.SetFlag("help", "false");
87
88 parser.ProcessFlags();
89 if (parser.GetFlag("help") == "true") {
90 parser.PrintUsageMessage();
Thiago Farina3a939862015-04-09 15:45:12 +020091 exit(EXIT_SUCCESS);
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +000092 }
93 parser.PrintEnteredFlags();
94
95 int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
96 int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
97
98 if (width <= 0 || height <= 0) {
99 fprintf(stderr, "Error: width or height cannot be <= 0!\n");
100 return -1;
101 }
102
103 webrtc::test::ResultsContainer results;
104
Magnus Jedvert404be7f2018-08-22 19:23:34 +0200105 rtc::scoped_refptr<webrtc::test::Y4mFile> reference_video =
106 webrtc::test::Y4mFile::Open(parser.GetFlag("reference_file"));
107 rtc::scoped_refptr<webrtc::test::Y4mFile> test_video =
108 webrtc::test::Y4mFile::Open(parser.GetFlag("test_file"));
109
110 if (!reference_video || !test_video) {
111 fprintf(stderr, "Error opening video files\n");
112 return 0;
113 }
114
115 webrtc::test::RunAnalysis(
116 reference_video, test_video, parser.GetFlag("stats_file_ref").c_str(),
117 parser.GetFlag("stats_file_test").c_str(), width, height, &results);
Edward Lemur2e5966b2018-01-30 15:33:02 +0100118 webrtc::test::GetMaxRepeatedAndSkippedFrames(
119 parser.GetFlag("stats_file_ref"), parser.GetFlag("stats_file_test"),
120 &results);
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +0000121
Edward Lemur2e5966b2018-01-30 15:33:02 +0100122 webrtc::test::PrintAnalysisResults(parser.GetFlag("label"), &results);
123
124 std::string chartjson_result_file = parser.GetFlag("chartjson_result_file");
125 if (!chartjson_result_file.empty()) {
126 webrtc::test::WritePerfResults(chartjson_result_file);
127 }
128
Robin Raymond1c62ffa2017-12-03 16:45:56 -0500129 return 0;
vspasova@webrtc.orgf61dc9b2012-08-22 08:12:00 +0000130}