• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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