xref: /aosp_15_r20/external/autotest/client/site_tests/power_VideoEncode/power_VideoEncode.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1# Lint as: python2, python3
2# # Copyright 2020 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5import logging
6import time
7
8from autotest_lib.client.common_lib.cros import chrome
9from autotest_lib.client.cros.input_playback import keyboard
10from autotest_lib.client.cros.power import power_status
11from autotest_lib.client.cros.power import power_test
12
13
14class power_VideoEncode(power_test.power_Test):
15    """class for power_VideoEncode test."""
16    version = 1
17
18    video_url = 'https://crospower.page.link/power_VideoEncode'
19
20    formats = [
21            # Video call with fewer participants.
22            ('vp9', 'hd', 24),
23            ('vp9', 'vga', 24),
24            ('vp9', 'qvga', 24),
25            ('vp8', 'hd', 24),
26            ('vp8', 'vga', 24),
27            ('vp8', 'qvga', 24),
28            ('h264', 'hd', 24),
29            ('h264', 'vga', 24),
30            # Video call with more participants.
31            ('vp9', 'hvga', 24),
32            ('vp9', 'qhvga', 20),
33            ('vp8', 'hvga', 24),
34            ('vp8', 'qhvga', 15),
35            # Higher resolution video
36            ('vp9', 'fhd', 24),
37            ('vp8', 'fhd', 24),
38            ('h264', 'fhd', 24),
39            # AV1 for informational
40            ('av1', 'hvga', 24),
41            ('av1', 'qhvga', 15),
42    ]
43
44    def run_once(self, seconds_per_test=120, format=formats):
45        """run_once method.
46
47        @param seconds_per_test: time in seconds for each subtest.
48        @param format: list of formats to test.
49                       Format is tuple of codec, resolution and framerate.
50        """
51        extra_browser_args = self.get_extra_browser_args_for_camera_test()
52        # b/228256145 to avoid powerd restart
53        extra_browser_args.append('--disable-features=FirmwareUpdaterApp')
54        with chrome.Chrome(init_network_controller=True,
55                           extra_browser_args=extra_browser_args) as cr:
56
57            tab = cr.browser.tabs[0]
58            tab.Activate()
59
60            # Just measure power in full-screen.
61            fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen')
62            if not fullscreen:
63                with keyboard.Keyboard() as keys:
64                    keys.press_key('f4')
65
66            # Stop services again as Chrome might have restarted them.
67            self._services.stop_services()
68
69            url = self.video_url
70            tab.Navigate(url)
71            tab.WaitForDocumentReadyStateToBeComplete()
72            video_init_time = power_status.VideoFpsLogger.time_until_ready(tab)
73            self.keyvals['video_init_time'] = video_init_time
74
75            self._vlog = power_status.VideoFpsLogger(tab,
76                seconds_period=self._seconds_period,
77                checkpoint_logger=self._checkpoint_logger)
78            self._meas_logs.append(self._vlog)
79
80            loop = 0
81            self.start_measurements()
82            for codec, resolution, fps in format:
83                tagname = '%s_%s_%sfps' % (codec, resolution, fps)
84                js = 'changeFormat("%s", "%s", %d)' % (codec, resolution, fps)
85                logging.info(js)
86                tab.EvaluateJavaScript(js)
87                loop_start = time.time()
88                self.loop_sleep(loop, seconds_per_test)
89                self.checkpoint_measurements(tagname, loop_start)
90                loop += 1
91