Index: chrome/test/functional/webrtc_video_quality.py |
diff --git a/chrome/test/functional/webrtc_video_quality.py b/chrome/test/functional/webrtc_video_quality.py |
index b43cc5e8e91818eb1820b7ed7d5b1cc3faba7015..2b20f42ccdcc24cb3ed4ae7572c90f97e42943fe 100755 |
--- a/chrome/test/functional/webrtc_video_quality.py |
+++ b/chrome/test/functional/webrtc_video_quality.py |
@@ -30,13 +30,21 @@ class MissingRequiredToolException(Exception): |
pass |
+class FailedToRunToolException(Exception): |
+ pass |
+ |
+ |
class WebrtcVideoQualityTest(webrtc_test_base.WebrtcTestBase): |
"""Test the video quality of the WebRTC output. |
Prerequisites: This test case must run on a machine with a virtual webcam that |
plays video from the reference file located in the location defined by |
- _REFERENCE_YUV_FILE. You must also compile the peerconnection_server target |
- before you run this test. |
+ _REFERENCE_YUV_FILE. You must also compile the chromium_builder_webrtc target |
+ before you run this test to get all the tools built. |
+ The external compare_videos.py script also depends on two external executables |
+ which must be located in the PATH when running this test. |
+ * zxing (see the CPP version at https://code.google.com/p/zxing) |
+ * ffmpeg 0.11.1 or compatible version (see http://www.ffmpeg.org) |
The test case will launch a custom binary (peerconnection_server) which will |
allow two WebRTC clients to find each other. |
@@ -190,11 +198,8 @@ class WebrtcVideoQualityTest(webrtc_test_base.WebrtcTestBase): |
self.assertTrue(self._RunRGBAToI420Converter(width, height)) |
stats_file = os.path.join(_WORKING_DIR, 'pyauto_stats.txt') |
- self.assertTrue(self._RunBarcodeDecoder(width, height, _OUTPUT_YUV_FILE, |
- stats_file)) |
- |
- analysis_result = self._RunFrameAnalyzer(width, height, reference_yuv, |
- _OUTPUT_YUV_FILE, stats_file) |
+ analysis_result = self._CompareVideos(width, height, _OUTPUT_YUV_FILE, |
+ reference_yuv, stats_file) |
self._ProcessPsnrAndSsimOutput(analysis_result) |
self._ProcessFramesCountOutput(analysis_result) |
@@ -273,97 +278,61 @@ class WebrtcVideoQualityTest(webrtc_test_base.WebrtcTestBase): |
rgba_converter.wait() |
return rgba_converter.returncode == 0 |
- def _RunBarcodeDecoder(self, width, height, captured_video_filename, |
- stats_filename): |
- """Runs the barcode decoder script. |
+ def _CompareVideos(self, width, height, captured_video_filename, |
+ reference_video_filename, stats_filename): |
+ """Compares the captured video with the reference video. |
The barcode decoder decodes the captured video containing barcodes overlaid |
into every frame of the video (produced by rgba_to_i420_converter). It |
produces a set of PNG images and a stats file that describes the relation |
between the filenames and the (decoded) frame number of each frame. |
- The script depends on an external executable which is a part of the Zxing |
- barcode library, which must be located in the PATH when running this test. |
- |
Args: |
width(int): The frames width of the video to be decoded. |
height(int): The frames height of the video to be decoded. |
captured_video_filename(string): The captured video file we want to |
extract frame images and decode frame numbers from. |
+ reference_video_filename(string): The reference video file we want to |
+ compare the captured video quality with. |
stats_filename(string): Filename for the output file containing |
data that shows the relation between each frame filename and the |
reference file's frame numbers. |
Returns: |
- (bool): True if the decoding was successful, False otherwise. |
- """ |
- path_to_decoder = os.path.join(pyauto_paths.GetThirdPartyDir(), 'webrtc', |
- 'tools', 'barcode_tools', |
- 'barcode_decoder.py') |
- if not os.path.exists(path_to_decoder): |
- raise MissingRequiredToolException( |
- 'Could not locate the barcode decoder script! The barcode decoder ' |
- 'decodes the barcodes overlaid on top of every frame of the captured ' |
- 'video.') |
- python_interp = sys.executable |
- start_cmd = [python_interp, path_to_decoder, |
- '--yuv_file=%s' % captured_video_filename, |
- '--yuv_frame_width=%d' % width, |
- '--yuv_frame_height=%d' % height, |
- '--stats_file=%s' % stats_filename] |
- print 'Start command: ', ' '.join(start_cmd) |
- |
- barcode_decoder = subprocess.Popen(start_cmd, stdout=sys.stdout, |
- stderr=sys.stderr) |
- barcode_decoder.wait() |
- return barcode_decoder.returncode == 0 |
- |
- def _RunFrameAnalyzer(self, width, height, reference_video_file, |
- captured_video_file, stats_file): |
- """Runs the frame analyzer tool for PSNR and SSIM analysis. |
- |
- The frame analyzer is also part of the webrtc_test_tools. It should be |
- built before running this test. We assume that the binary will end up next |
- to Chrome. |
- |
- Frame analyzer prints its output to the standard output from where it has to |
- be read and processed. |
+ (string): The output of the script. |
- Args: |
- width(int): The width of the video frames to be analyzed. |
- height(int): The height of the video frames to be analyzed. |
- reference_video_file(string): Filename of the video to be used as a |
- reference during the analysis. |
- captured_video_file(string): Filename for the video containing the |
- captured frames. |
- stats_file(string): Filename for the file that contains frame |
- synchronization data for the captured frames. |
- |
- Returns: |
- (string): The output from the frame_analyzer. |
+ Raises: |
+ FailedToRunToolException: If the script fails to run. |
""" |
path_to_analyzer = os.path.join(self.BrowserPath(), 'frame_analyzer') |
path_to_analyzer = os.path.abspath(path_to_analyzer) |
- |
path_to_analyzer = self.BinPathForPlatform(path_to_analyzer) |
- if not os.path.exists(path_to_analyzer): |
- raise webrtc_test_base.MissingRequiredBinaryException( |
- 'Could not locate frame_analyzer! Did you build the ' |
- 'webrtc_test_tools target?') |
- |
- start_cmd = [path_to_analyzer, '--reference_file=%s' % reference_video_file, |
- '--test_file=%s' % captured_video_file, |
- '--stats_file=%s' % stats_file, |
- '--width=%d' % width, '--height=%d' % height] |
- print 'Start command: ', ' '.join(start_cmd) |
- |
- frame_analyzer = subprocess.Popen(start_cmd, stdout=subprocess.PIPE, |
+ path_to_compare_script = os.path.join(pyauto_paths.GetThirdPartyDir(), |
+ 'webrtc', 'tools', |
+ 'compare_videos.py') |
+ if not os.path.exists(path_to_compare_script): |
+ raise MissingRequiredToolException('Cannot find the script at %s' % |
+ path_to_compare_script) |
+ python_interp = sys.executable |
+ cmd = [ |
+ python_interp, |
+ path_to_compare_script, |
+ '--ref_video=%s' % reference_video_filename, |
+ '--test_video=%s' % captured_video_filename, |
+ '--frame_analyzer=%s' % path_to_analyzer, |
+ '--yuv_frame_width=%d' % width, |
+ '--yuv_frame_height=%d' % height, |
+ '--stats_file=%s' % stats_filename, |
+ ] |
+ print 'Start command: ', ' '.join(cmd) |
+ |
+ compare_videos = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
stderr=subprocess.PIPE) |
- output, error = frame_analyzer.communicate() |
- if error: |
- print 'Error: ', error |
- return 'BSTATS undef undef; ESTATS' |
+ output, error = compare_videos.communicate() |
+ if compare_videos.returncode != 0: |
+ raise FailedToRunToolException('Failed to run compare videos script!') |
+ |
return output |
def _ProcessFramesCountOutput(self, output): |