From 1c60ff521eda26c80fa53097d9c614f10200f651 Mon Sep 17 00:00:00 2001 From: Paulina Hensman Date: Mon, 1 Oct 2018 12:59:42 +0200 Subject: [PATCH] Tidy up and increase exception handling in compare_videos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9642 Change-Id: I5c8b252de3b285f81a5437af99d789b5a28ce646 Reviewed-on: https://webrtc-review.googlesource.com/102880 Commit-Queue: Paulina Hensman Reviewed-by: Patrik Höglund Cr-Commit-Position: refs/heads/master@{#24909} --- rtc_tools/BUILD.gn | 2 + rtc_tools/compare_videos.py | 54 ++++++++++++---------- rtc_tools/frame_analyzer/frame_analyzer.cc | 11 +++-- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn index 990d964321..48213ad483 100644 --- a/rtc_tools/BUILD.gn +++ b/rtc_tools/BUILD.gn @@ -108,6 +108,7 @@ rtc_static_library("video_quality_analysis") { rtc_executable("frame_analyzer") { visibility = [ "*" ] + testonly = true sources = [ "frame_analyzer/frame_analyzer.cc", ] @@ -118,6 +119,7 @@ rtc_executable("frame_analyzer") { ":video_file_writer", ":video_quality_analysis", "../rtc_base:stringutils", + "../test:fileutils", "../test:perf_test", ] } diff --git a/rtc_tools/compare_videos.py b/rtc_tools/compare_videos.py index ac41ef888b..79790439b1 100755 --- a/rtc_tools/compare_videos.py +++ b/rtc_tools/compare_videos.py @@ -136,7 +136,7 @@ def DecodeBarcodesInVideo(options, path_to_decoder, video, stat_file): return 0 -def _RunFrameAnalyzer(options): +def _RunFrameAnalyzer(options, yuv_directory=None): """Run frame analyzer to compare the videos and print output.""" cmd = [ options.frame_analyzer, @@ -152,15 +152,17 @@ def _RunFrameAnalyzer(options): 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) - if options.yuv_directory: - cmd.append('--yuv_directory=%s' % options.yuv_directory) + if yuv_directory: + cmd.append('--yuv_directory=%s' % yuv_directory) frame_analyzer = subprocess.Popen(cmd, stdin=_DevNull(), stdout=sys.stdout, stderr=sys.stderr) frame_analyzer.wait() + if frame_analyzer.returncode != 0: + print 'Failed to run frame analyzer.' return frame_analyzer.returncode -def _RunVmaf(options): +def _RunVmaf(options, yuv_directory): """ Run VMAF to compare videos and print output. The provided vmaf directory is assumed to contain a c++ wrapper executable @@ -174,22 +176,28 @@ def _RunVmaf(options): 'yuv420p', str(options.yuv_frame_width), str(options.yuv_frame_height), - os.path.join(options.yuv_directory, "ref.yuv"), - os.path.join(options.yuv_directory, "test.yuv"), + os.path.join(yuv_directory, "ref.yuv"), + os.path.join(yuv_directory, "test.yuv"), options.vmaf_model, ] if options.vmaf_phone_model: cmd.append('--phone-model') vmaf = subprocess.Popen(cmd, stdin=_DevNull(), - stdout=subprocess.PIPE, stderr=sys.stderr) + stdout=subprocess.PIPE, stderr=sys.stderr) vmaf.wait() if vmaf.returncode != 0: print 'Failed to run VMAF.' return 1 output = vmaf.stdout.read() # Extract score from VMAF output. - score = float(output.split('\n')[2].split()[3]) + try: + score = float(output.split('\n')[2].split()[3]) + except (ValueError, IndexError): + print 'Error in VMAF output (expected "VMAF score = [float]" on line 3):' + print output + return 1 + print 'RESULT Vmaf: %s= %f' % (options.label, score) return 0 @@ -226,25 +234,21 @@ def main(): options.test_video, options.stats_file_test) != 0: return 1 - try: - # Create a directory to save temporary YUV files for VMAF in frame_analyzer. - options.yuv_directory = None - if options.vmaf: - options.yuv_directory = tempfile.mkdtemp() + '/' + if options.vmaf: + try: + # Directory to save temporary YUV files for VMAF in frame_analyzer. + yuv_directory = tempfile.mkdtemp() - # Run frame_analyzer to compare the videos and print output. - if _RunFrameAnalyzer(options) != 0: - print 'Failed to run frame analyzer.' - return 1 - - # Run VMAF for further video comparison and print output. - if options.vmaf: - return _RunVmaf(options) - - finally: - if options.yuv_directory: - shutil.rmtree(options.yuv_directory) + # Run frame analyzer to compare the videos and print output. + if _RunFrameAnalyzer(options, yuv_directory=yuv_directory) != 0: + return 1 + # Run VMAF for further video comparison and print output. + return _RunVmaf(options, yuv_directory) + finally: + shutil.rmtree(yuv_directory) + else: + return _RunFrameAnalyzer(options) return 0 diff --git a/rtc_tools/frame_analyzer/frame_analyzer.cc b/rtc_tools/frame_analyzer/frame_analyzer.cc index 56dc1f47db..78c1929521 100644 --- a/rtc_tools/frame_analyzer/frame_analyzer.cc +++ b/rtc_tools/frame_analyzer/frame_analyzer.cc @@ -21,6 +21,7 @@ #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/fileutils.h" #include "test/testsupport/perf_test.h" /* @@ -147,10 +148,12 @@ int main(int argc, char* argv[]) { } std::string yuv_directory = parser.GetFlag("yuv_directory"); if (!yuv_directory.empty()) { - webrtc::test::WriteVideoToFile(reordered_video, yuv_directory + "ref.yuv", - /*fps=*/30); - webrtc::test::WriteVideoToFile(test_video, yuv_directory + "test.yuv", - /*fps=*/30); + webrtc::test::WriteVideoToFile( + reordered_video, webrtc::test::JoinFilename(yuv_directory, "ref.yuv"), + /*fps=*/30); + webrtc::test::WriteVideoToFile( + test_video, webrtc::test::JoinFilename(yuv_directory, "test.yuv"), + /*fps=*/30); } return 0;