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 5import logging 6import os 7 8from autotest_lib.client.bin import test 9from autotest_lib.client.common_lib import error, file_utils, utils 10from autotest_lib.client.common_lib.cros import chrome 11from autotest_lib.client.cros.video import device_capability 12from autotest_lib.client.cros.video import helper_logger 13from autotest_lib.client.cros.video import histogram_verifier 14 15 16# Chrome flags to use fake camera and skip camera permission. 17EXTRA_BROWSER_ARGS = ['--use-fake-device-for-media-stream', 18 '--use-fake-ui-for-media-stream'] 19FAKE_FILE_ARG = '--use-file-for-fake-video-capture="%s"' 20DOWNLOAD_BASE = 'http://commondatastorage.googleapis.com/chromiumos-test-assets-public/crowd/' 21 22HISTOGRAMS_URL = 'chrome://histograms/' 23 24 25class 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