• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2020 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.
4import logging
5import time
6
7from autotest_lib.client.common_lib.cros import chrome
8from autotest_lib.client.cros.input_playback import keyboard
9from autotest_lib.client.cros.power import power_status
10from autotest_lib.client.cros.power import power_test
11
12
13class power_VideoEncode(power_test.power_Test):
14    """class for power_VideoEncode test."""
15    version = 1
16
17    video_url = 'https://crospower.page.link/power_VideoEncode'
18
19    formats = [
20            # Video call with fewer participants.
21            ('vp9', 'hd', 24),
22            ('vp9', 'vga', 24),
23            ('vp9', 'qvga', 24),
24            ('vp8', 'hd', 24),
25            ('vp8', 'vga', 24),
26            ('vp8', 'qvga', 24),
27            ('h264', 'hd', 24),
28            ('h264', 'vga', 24),
29            # Video call with more participants.
30            ('vp9', 'hvga', 24),
31            ('vp9', 'qhvga', 20),
32            ('vp8', 'hvga', 24),
33            ('vp8', 'qhvga', 15),
34            # Higher resolution video
35            ('vp9', 'fhd', 24),
36            ('vp8', 'fhd', 24),
37            ('h264', 'fhd', 24),
38            # AV1 for informational
39            ('av1', 'hvga', 24),
40            ('av1', 'qhvga', 15),
41    ]
42
43    def run_once(self, seconds_per_test=120, format=formats):
44        """run_once method.
45
46        @param seconds_per_test: time in seconds for each subtest.
47        @param format: list of formats to test.
48                       Format is tuple of codec, resolution and framerate.
49        """
50        extra_browser_args = self.get_extra_browser_args_for_camera_test()
51        with chrome.Chrome(init_network_controller=True,
52                           extra_browser_args=extra_browser_args) as cr:
53
54            tab = cr.browser.tabs.New()
55            tab.Activate()
56
57            # Just measure power in full-screen.
58            fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen')
59            if not fullscreen:
60                with keyboard.Keyboard() as keys:
61                    keys.press_key('f4')
62
63            url = self.video_url
64            tab.Navigate(url)
65            tab.WaitForDocumentReadyStateToBeComplete()
66            video_init_time = power_status.VideoFpsLogger.time_until_ready(tab)
67            self.keyvals['video_init_time'] = video_init_time
68
69            self._vlog = power_status.VideoFpsLogger(tab,
70                seconds_period=self._seconds_period,
71                checkpoint_logger=self._checkpoint_logger)
72            self._meas_logs.append(self._vlog)
73
74            loop = 0
75            self.start_measurements()
76            for codec, resolution, fps in format:
77                tagname = '%s_%s_%sfps' % (codec, resolution, fps)
78                js = 'changeFormat("%s", "%s", %d)' % (codec, resolution, fps)
79                logging.info(js)
80                tab.EvaluateJavaScript(js)
81                loop_start = time.time()
82                self.loop_sleep(loop, seconds_per_test)
83                self.checkpoint_measurements(tagname, loop_start)
84                loop += 1
85