Home | History | Annotate | Download | only in video_ChromeRTCHWDecodeUsed
      1 # Copyright (c) 2014 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 logging
      6 import os
      7 
      8 from autotest_lib.client.bin import test
      9 from autotest_lib.client.common_lib import error, file_utils, utils
     10 from autotest_lib.client.common_lib.cros import chrome
     11 from autotest_lib.client.cros.video import device_capability
     12 from autotest_lib.client.cros.video import helper_logger
     13 from autotest_lib.client.cros.video import histogram_verifier
     14 
     15 
     16 # Chrome flags to use fake camera and skip camera permission.
     17 EXTRA_BROWSER_ARGS = ['--use-fake-device-for-media-stream',
     18                       '--use-fake-ui-for-media-stream']
     19 FAKE_FILE_ARG = '--use-file-for-fake-video-capture="%s"'
     20 DOWNLOAD_BASE = 'http://commondatastorage.googleapis.com/chromiumos-test-assets-public/crowd/'
     21 
     22 HISTOGRAMS_URL = 'chrome://histograms/'
     23 
     24 
     25 class video_ChromeRTCHWDecodeUsed(test.test):
     26     """The test verifies HW Encoding for WebRTC video."""
     27     version = 1
     28 
     29 
     30     def is_skipping_test(self):
     31         """Determine whether this test should skip."""
     32         blacklist = [
     33                 # (board, milestone); None if don't care.
     34 
     35                 # kevin did support hw decode, but not ready in M54 and M55.
     36                 ('kevin', 54), ('kevin', 55),
     37 
     38                 # elm and hana support hw decode since M57.
     39                 ('elm', 56), ('hana', 56),
     40         ]
     41 
     42         entry = (utils.get_current_board(), utils.get_chrome_milestone())
     43         for black_entry in blacklist:
     44             for i, to_match in enumerate(black_entry):
     45                 if to_match and str(to_match) != entry[i]:
     46                     break
     47             else:
     48                 return True
     49 
     50         return False
     51 
     52     def start_loopback(self, cr):
     53         """
     54         Opens WebRTC loopback page.
     55 
     56         @param cr: Autotest Chrome instance.
     57         """
     58         tab = cr.browser.tabs.New()
     59         tab.Navigate(cr.browser.platform.http_server.UrlOf(
     60             os.path.join(self.bindir, 'loopback.html')))
     61         tab.WaitForDocumentReadyStateToBeComplete()
     62 
     63     @helper_logger.video_log_wrapper
     64     def run_once(self, video_name, histogram_name, histogram_bucket_val,
     65                  capability):
     66         if self.is_skipping_test():
     67             raise error.TestNAError('Skipping test run on this board.')
     68 
     69         if not device_capability.DeviceCapability().have_capability(capability):
     70             logging.warning("Missing Capability: %s" % capability)
     71             return
     72 
     73         # Download test video.
     74         url = DOWNLOAD_BASE + video_name
     75         local_path = os.path.join(self.bindir, video_name)
     76         file_utils.download_file(url, local_path)
     77 
     78         # Start chrome with test flags.
     79         EXTRA_BROWSER_ARGS.append(FAKE_FILE_ARG % local_path)
     80         EXTRA_BROWSER_ARGS.append(helper_logger.chrome_vmodule_flag())
     81         with chrome.Chrome(extra_browser_args=EXTRA_BROWSER_ARGS,
     82                            init_network_controller=True) as cr:
     83             histogram_differ = histogram_verifier.HistogramDiffer(
     84                 cr, histogram_name)
     85             # Open WebRTC loopback page.
     86             cr.browser.platform.SetHTTPServerDirectories(self.bindir)
     87             self.start_loopback(cr)
     88 
     89             # Make sure decode is hardware accelerated.
     90             histogram_verifier.expect_sole_bucket(
     91                 histogram_differ, histogram_bucket_val, histogram_bucket_val)
     92