172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana# Use of this source code is governed by a BSD-style license that can be 372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana# found in the LICENSE file. 472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanafrom contextlib import closing 672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanaimport logging 772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanaimport os 872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanaimport re 972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanaimport time 1072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 1172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanafrom autotest_lib.client.bin import test, utils 1272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanafrom autotest_lib.client.common_lib import error 13172ecb7f5a6bbda741799444237a9be4ee21518bEd Bakerfrom autotest_lib.client.common_lib import file_utils 1472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanafrom autotest_lib.client.common_lib.cros import chrome 1572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 1672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 1772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana# Chrome flags to use fake camera and skip camera permission. 1872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaEXTRA_BROWSER_ARGS = ['--use-fake-device-for-media-stream', 1972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana '--use-fake-ui-for-media-stream'] 2072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaFAKE_FILE_ARG = '--use-file-for-fake-video-capture="%s"' 2172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaDOWNLOAD_BASE = 'http://commondatastorage.googleapis.com/chromiumos-test-assets-public/crowd/' 2272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaVIDEO_NAME = 'crowd720_25frames.y4m' 2372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 2472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaRTC_VIDEO_ENCODE = 'Media.RTCVideoEncoderInitEncodeSuccess' 2572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaRTC_VIDEO_ENCODE_BUCKET = 1 2672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaRTC_ENCODE_PROFILE = 'Media.RTCVideoEncoderProfile' 2772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaRTC_ENCODE_PROFILE_BUCKET = 11 2872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit MakasanaHISTOGRAMS_URL = 'chrome://histograms/' 2972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 3072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasanaclass video_ChromeRTCHWEncodeUsed(test.test): 3172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """The test verifies HW Encoding for WebRTC video.""" 3272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana version = 1 3372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 3472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 3572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana def start_loopback(self, cr): 3672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """ 3772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana Opens WebRTC loopback page. 3872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 3972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana @param cr: Autotest Chrome instance. 4072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """ 4172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana tab = cr.browser.tabs[0] 4255e4a38297449fcf3dbd693e2e6afe72fa84b519Ahmed Fakhry tab.Navigate(cr.browser.platform.http_server.UrlOf( 4372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana os.path.join(self.bindir, 'loopback.html'))) 4472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana tab.WaitForDocumentReadyStateToBeComplete() 4572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 4672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 4772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana def assert_hardware_accelerated(self, cr): 4872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """ 4972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana Checks if WebRTC decoding is hardware accelerated. 5072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 5172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana @param cr: Autotest Chrome instance. 5272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 5372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana @raises error.TestError if decoding is not hardware accelerated. 5472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """ 5572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana tab = cr.browser.tabs.New() 5672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana def histograms_loaded(histogram): 5772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana """Returns true if histogram is loaded.""" 5872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana tab.Navigate(HISTOGRAMS_URL + histogram) 5972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana tab.WaitForDocumentReadyStateToBeComplete() 6072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana return tab.EvaluateJavaScript( 6172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 'document.documentElement.innerText.search("%s") != -1' 6272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana % histogram) 6372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 6472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana def histogram_sucess(histogram, bucket): 6572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana lines = tab.EvaluateJavaScript( 6672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 'document.documentElement.innerText').split("\n") 6772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana lines = [line for line in lines if line.strip()] 6872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana logging.info('Histograms for %s:', histogram ) 6972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana logging.info(lines) 7072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana success = False 7172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana for line in lines: 7272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana re_string = '^'+ str(bucket) +'\s\s-(.*)100.0%(.*)' 7372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana if re.match(re_string, line): 7472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana success = True 7572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana break 7672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana if not success: 7772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana raise error.TestError( 7872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana '{0} didn\'t show up or is not 100%' 7972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana ' successful.'.format(histogram)) 8072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 8172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana for histogram, bucket in [(RTC_VIDEO_ENCODE, RTC_VIDEO_ENCODE_BUCKET), 8272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana (RTC_ENCODE_PROFILE, RTC_ENCODE_PROFILE_BUCKET)]: 8372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana utils.poll_for_condition( 8472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana lambda: histograms_loaded(histogram), 8572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana timeout=5, 8672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana exception=error.TestError( 878c129984f57778cf2cfefda5bc756a05d52fbca8Rohit Makasana 'Cannot find %s histogram.' % histogram), 8872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana sleep_interval=1) 8972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana histogram_sucess(histogram, bucket) 9072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 9172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 9272b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana def run_once(self): 9372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana # Download test video. 9472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana url = DOWNLOAD_BASE + VIDEO_NAME 9572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana local_path = os.path.join(self.bindir, VIDEO_NAME) 96172ecb7f5a6bbda741799444237a9be4ee21518bEd Baker file_utils.download_file(url, local_path) 9772b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 9872b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana # Start chrome with test flags. 9972b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana EXTRA_BROWSER_ARGS.append(FAKE_FILE_ARG % local_path) 10072b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana with chrome.Chrome(extra_browser_args=EXTRA_BROWSER_ARGS) as cr: 10172b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana # Open WebRTC loopback page. 10255e4a38297449fcf3dbd693e2e6afe72fa84b519Ahmed Fakhry cr.browser.platform.SetHTTPServerDirectories(self.bindir) 10372b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana self.start_loopback(cr) 10472b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana 10572b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana # Make sure decode is hardware accelerated. 10672b21e3c7d418299ce974ce90c4e9c6666c1acbfRohit Makasana self.assert_hardware_accelerated(cr) 107