Home | History | Annotate | Download | only in video_VideoEncodeAccelerator
      1 # Copyright (c) 2014 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import errno
      6 import hashlib
      7 import logging
      8 import os
      9 
     10 from autotest_lib.client.bin import utils
     11 from autotest_lib.client.common_lib import error
     12 from autotest_lib.client.common_lib import file_utils
     13 from autotest_lib.client.cros import chrome_binary_test
     14 
     15 DOWNLOAD_BASE = 'http://commondatastorage.googleapis.com/chromiumos-test-assets-public/'
     16 BINARY = 'video_encode_accelerator_unittest'
     17 
     18 def _remove_if_exists(filepath):
     19     try:
     20         os.remove(filepath)
     21     except OSError, e:
     22         if e.errno != errno.ENOENT: # no such file
     23             raise
     24 
     25 
     26 def _download_video(download_path, local_file):
     27     url = '%s%s' % (DOWNLOAD_BASE, download_path)
     28     logging.info('download "%s" to "%s"', url, local_file)
     29 
     30     file_utils.download_file(url, local_file)
     31 
     32     with open(local_file, 'r') as r:
     33         md5sum = hashlib.md5(r.read()).hexdigest()
     34         if md5sum not in download_path:
     35             raise error.TestError('unmatched md5 sum: %s' % md5sum)
     36 
     37 
     38 class video_VideoEncodeAccelerator(chrome_binary_test.ChromeBinaryTest):
     39     """
     40     This test is a wrapper of the chrome unittest binary:
     41     video_encode_accelerator_unittest.
     42     """
     43 
     44     version = 1
     45 
     46     def get_filter_option(self):
     47         """Get option of filtering test
     48         """
     49 
     50         blacklist = {
     51                 # board: [tests to skip...]
     52 
     53                 # Kevin doesn't support HW encode for plane sizes not multiple
     54                 # of cache line
     55                 'kevin': ['CacheLineUnalignedInputTest/*']
     56                 }
     57 
     58         board = utils.get_current_board()
     59         if board in blacklist:
     60             return ' --gtest_filter=-' + ':'.join(blacklist[board])
     61 
     62         return ''
     63 
     64     @chrome_binary_test.nuke_chrome
     65     def run_once(self, in_cloud, streams, profile):
     66         """Runs video_encode_accelerator_unittest on the streams.
     67 
     68         @param in_cloud: Input file needs to be downloaded first.
     69         @param streams: The test streams for video_encode_accelerator_unittest.
     70         @param profile: The profile to encode into.
     71 
     72         @raises error.TestFail for video_encode_accelerator_unittest failures.
     73         """
     74 
     75         last_test_failure = None
     76         for path, width, height, bit_rate in streams:
     77             if in_cloud:
     78                 input_path = os.path.join(self.tmpdir, path.split('/')[-1])
     79                 _download_video(path, input_path)
     80             else:
     81                 input_path = os.path.join(self.cr_source_dir, path)
     82 
     83             output_path = os.path.join(self.tmpdir,
     84                     '%s.out' % input_path.split('/')[-1])
     85 
     86             cmd_line = '--test_stream_data="%s:%s:%s:%s:%s:%s"' % (
     87                     input_path, width, height, profile, output_path, bit_rate)
     88             if utils.is_freon():
     89                 cmd_line += ' --ozone-platform=gbm'
     90             cmd_line += self.get_filter_option()
     91             try:
     92                 self.run_chrome_test_binary(BINARY, cmd_line, as_chronos=False)
     93             except error.TestFail as test_failure:
     94                 # Continue to run the remaining test streams and raise
     95                 # the last failure after finishing all streams.
     96                 logging.exception('error while encoding %s', input_path)
     97                 last_test_failure = test_failure
     98             finally:
     99                 # Remove the downloaded video
    100                 if in_cloud:
    101                     _remove_if_exists(input_path)
    102                 _remove_if_exists(output_path)
    103 
    104         if last_test_failure:
    105             raise last_test_failure
    106