Home | History | Annotate | Download | only in video_ChromeHWDecodeUsed
      1 # Copyright (c) 2013 The Chromium OS 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 os
      6 import time
      7 import shutil
      8 import logging
      9 
     10 from autotest_lib.client.bin import test
     11 from autotest_lib.client.common_lib import error, utils
     12 from autotest_lib.client.common_lib.cros import chrome
     13 from autotest_lib.client.cros.video import histogram_verifier
     14 from autotest_lib.client.cros.video import constants
     15 from autotest_lib.client.cros.video import native_html5_player
     16 from autotest_lib.client.cros.video import helper_logger
     17 
     18 
     19 class video_ChromeHWDecodeUsed(test.test):
     20     """This test verifies VDA works in Chrome."""
     21     version = 1
     22 
     23     def is_skipping_test(self, codec):
     24         """Determine whether this test should skip.
     25 
     26         @param codec: the codec to be tested. Example values: 'vp8', 'vp9', 'h264'.
     27         """
     28         blacklist = [
     29                 # (board, milestone, codec); None if don't care.
     30 
     31                 # kevin did support hw decode, but not ready in M54 and M55.
     32                 ('kevin', 54, 'vp8'),('kevin', 55, 'vp8')
     33         ]
     34 
     35         entry = (utils.get_current_board(), utils.get_chrome_milestone(), codec)
     36         for black_entry in blacklist:
     37             for i, to_match in enumerate(black_entry):
     38                 if to_match and str(to_match) != entry[i]:
     39                     break
     40             else:
     41                 return True
     42 
     43         return False
     44 
     45     @helper_logger.video_log_wrapper
     46     def run_once(self, codec, is_mse, video_file, arc_mode=None):
     47         """
     48         Tests whether VDA works by verifying histogram for the loaded video.
     49 
     50         @param is_mse: bool, True if the content uses MSE, False otherwise.
     51         @param video_file: Sample video file to be loaded in Chrome.
     52 
     53         """
     54         if self.is_skipping_test(codec):
     55             raise error.TestNAError('Skipping test run on this board.')
     56 
     57         with chrome.Chrome(
     58                 extra_browser_args=helper_logger.chrome_vmodule_flag(),
     59                 arc_mode=arc_mode,
     60                 init_network_controller=True) as cr:
     61             # This will execute for MSE video by accesing shaka player
     62             if is_mse:
     63                  tab1 = cr.browser.tabs.New()
     64                  tab1.Navigate(video_file)
     65                  tab1.WaitForDocumentReadyStateToBeComplete()
     66                  # Running the test longer to check errors and longer playback
     67                  # for MSE videos.
     68                  time.sleep(30)
     69             else:
     70                  #This execute for normal video for downloading html file
     71                  shutil.copy2(constants.VIDEO_HTML_FILEPATH, self.bindir)
     72                  video_path = os.path.join(constants.CROS_VIDEO_DIR,
     73                                            'files', video_file)
     74                  shutil.copy2(video_path, self.bindir)
     75 
     76                  cr.browser.platform.SetHTTPServerDirectories(self.bindir)
     77                  tab = cr.browser.tabs.New()
     78                  html_fullpath = os.path.join(self.bindir, 'video.html')
     79                  url = cr.browser.platform.http_server.UrlOf(html_fullpath)
     80 
     81                  player = native_html5_player.NativeHtml5Player(
     82                          tab,
     83                          full_url = url,
     84                          video_id = 'video',
     85                          video_src_path = video_file,
     86                          event_timeout = 120)
     87                  player.load_video()
     88                  player.play()
     89                  # Waits until the video ends or an error happens.
     90                  player.wait_ended_or_error()
     91 
     92             # Waits for histogram updated for the test video.
     93             histogram_verifier.verify(
     94                  cr,
     95                  constants.MEDIA_GVD_INIT_STATUS,
     96                  constants.MEDIA_GVD_BUCKET)
     97 
     98             # Verify no GPU error happens.
     99             if histogram_verifier.is_histogram_present(
    100                     cr,
    101                     constants.MEDIA_GVD_ERROR):
    102                 logging.info(histogram_verifier.get_histogram(
    103                              cr, constants.MEDIA_GVD_ERROR))
    104                 raise error.TestError('GPU Video Decoder Error.')
    105 
    106             # Verify the video ends successully for normal videos.
    107             if not is_mse and player.check_error():
    108                 raise error.TestError('player did not end successully '\
    109                                       '(HTML5 Player Error %s: %s)'
    110                                       % player.get_error_info())
    111