diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn index ae80585964..437dca4069 100644 --- a/rtc_tools/BUILD.gn +++ b/rtc_tools/BUILD.gn @@ -73,6 +73,20 @@ rtc_static_library("video_file_reader") { ] } +rtc_static_library("video_file_writer") { + sources = [ + "video_file_writer.cc", + "video_file_writer.h", + ] + deps = [ + ":video_file_reader", + "../api/video:video_frame", + "../api/video:video_frame_i420", + "../rtc_base:rtc_base_approved", + "//third_party/abseil-cpp/absl/types:optional", + ] +} + rtc_static_library("video_quality_analysis") { sources = [ "frame_analyzer/video_quality_analysis.cc", @@ -101,6 +115,7 @@ rtc_executable("frame_analyzer") { deps = [ ":command_line_parser", ":video_file_reader", + ":video_file_writer", ":video_quality_analysis", "../rtc_base:stringutils", "../test:perf_test", @@ -343,6 +358,7 @@ if (rtc_include_tests) { "sanitizers_unittest.cc", "simple_command_line_parser_unittest.cc", "video_file_reader_unittest.cc", + "video_file_writer_unittest.cc", ] if (!build_with_chromium && is_clang) { @@ -355,6 +371,7 @@ if (rtc_include_tests) { ":frame_editing_lib", ":reference_less_video_analysis_lib", ":video_file_reader", + ":video_file_writer", ":video_quality_analysis", "../common_video:common_video", "../rtc_base", diff --git a/rtc_tools/compare_videos.py b/rtc_tools/compare_videos.py index 40a2aabb32..d9cb670aba 100755 --- a/rtc_tools/compare_videos.py +++ b/rtc_tools/compare_videos.py @@ -36,6 +36,8 @@ def _ParseArgs(): 'video (YUV).')) parser.add_option('--frame_analyzer', type='string', help='Path to the frame analyzer executable.') + parser.add_option('--aligned_output_file', type='string', + help='Path for output aligned YUV or Y4M file.') parser.add_option('--barcode_decoder', type='string', help=('Path to the barcode decoder script. By default, we ' 'will assume we can find it in barcode_tools/' @@ -127,7 +129,7 @@ def main(): """The main function. A simple invocation is: - ./webrtc/rtc_tools/barcode_tools/compare_videos.py + ./webrtc/rtc_tools/compare_videos.py --ref_video= --test_video= --frame_analyzer= @@ -165,6 +167,8 @@ def main(): ] if options.chartjson_result_file: cmd.append('--chartjson_result_file=%s' % options.chartjson_result_file) + if options.aligned_output_file: + cmd.append('--aligned_output_file=%s' % options.aligned_output_file) frame_analyzer = subprocess.Popen(cmd, stdin=_DevNull(), stdout=sys.stdout, stderr=sys.stderr) frame_analyzer.wait() diff --git a/rtc_tools/frame_analyzer/frame_analyzer.cc b/rtc_tools/frame_analyzer/frame_analyzer.cc index aab275891e..49d381fe7e 100644 --- a/rtc_tools/frame_analyzer/frame_analyzer.cc +++ b/rtc_tools/frame_analyzer/frame_analyzer.cc @@ -20,6 +20,7 @@ #include "rtc_tools/frame_analyzer/video_temporal_aligner.h" #include "rtc_tools/simple_command_line_parser.h" #include "rtc_tools/video_file_reader.h" +#include "rtc_tools/video_file_writer.h" #include "test/testsupport/perf_test.h" /* @@ -56,6 +57,9 @@ int main(int argc, char* argv[]) { " Default: test_file.yuv\n" " - chartjson_result_file: Where to store perf result in chartjson" " format. If not present, no perf result will be stored." + " Default: None\n" + " - aligned_output_file: Where to write aligned YUV/Y4M output file." + " If not present, no file will be written." " Default: None\n"; webrtc::test::CommandLineParser parser; @@ -69,6 +73,7 @@ int main(int argc, char* argv[]) { parser.SetFlag("label", "MY_TEST"); parser.SetFlag("reference_file", "ref.yuv"); parser.SetFlag("test_file", "test.yuv"); + parser.SetFlag("aligned_output_file", ""); parser.SetFlag("chartjson_result_file", ""); parser.SetFlag("help", "false"); @@ -128,6 +133,14 @@ int main(int argc, char* argv[]) { if (!chartjson_result_file.empty()) { webrtc::test::WritePerfResults(chartjson_result_file); } + std::string aligned_output_file = parser.GetFlag("aligned_output_file"); + if (!aligned_output_file.empty()) { + rtc::scoped_refptr reordered_video = + webrtc::test::GenerateAlignedReferenceVideo(reference_video, + matching_indices); + webrtc::test::WriteVideoToFile(reordered_video, aligned_output_file, + /*fps=*/30); + } return 0; } diff --git a/rtc_tools/frame_analyzer/video_temporal_aligner.cc b/rtc_tools/frame_analyzer/video_temporal_aligner.cc index f106852ed2..2ebffbc4e7 100644 --- a/rtc_tools/frame_analyzer/video_temporal_aligner.cc +++ b/rtc_tools/frame_analyzer/video_temporal_aligner.cc @@ -221,8 +221,14 @@ rtc::scoped_refptr