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