170 lines
5.8 KiB
Python
170 lines
5.8 KiB
Python
# Copyright 2018 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
import logging
|
|
import os
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.common_lib import file_utils
|
|
from autotest_lib.client.cros.power import power_videotest
|
|
|
|
|
|
class power_VideoPlayback(power_videotest.power_VideoTest):
|
|
"""class for power_VideoPlayback test."""
|
|
version = 1
|
|
|
|
# Time in seconds to measure power per video file.
|
|
_MEASUREMENT_DURATION = 120
|
|
|
|
_BASE_URL='http://storage.googleapis.com/chromiumos-test-assets-public/tast/cros/video/power/30s/'
|
|
|
|
# list of video name and url.
|
|
_VIDEOS = [
|
|
('h264_720_30fps',
|
|
_BASE_URL + '720p30fpsH264_foodmarket_sync_30s.mp4'
|
|
),
|
|
('h264_720_60fps',
|
|
_BASE_URL + '720p60fpsH264_boat_sync_30s.mp4'
|
|
),
|
|
('h264_1080_30fps',
|
|
_BASE_URL + '1080p30fpsH264_foodmarket_sync_30s.mp4'
|
|
),
|
|
('h264_1080_60fps',
|
|
_BASE_URL + '1080p60fpsH264_boat_sync_30s.mp4'
|
|
),
|
|
('h264_4k_30fps',
|
|
_BASE_URL + '4k30fpsH264_foodmarket_sync_vod_30s.mp4'
|
|
),
|
|
('h264_4k_60fps',
|
|
_BASE_URL + '4k60fpsH264_boat_sync_vod_30s.mp4'
|
|
),
|
|
('vp8_720_30fps',
|
|
_BASE_URL + '720p30fpsVP8_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp8_720_60fps',
|
|
_BASE_URL + '720p60fpsVP8_boat_sync_30s.webm'
|
|
),
|
|
('vp8_1080_30fps',
|
|
_BASE_URL + '1080p30fpsVP8_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp8_1080_60fps',
|
|
_BASE_URL + '1080p60fpsVP8_boat_sync_30s.webm'
|
|
),
|
|
('vp8_4k_30fps',
|
|
_BASE_URL + '4k30fpsVP8_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp8_4k_60fps',
|
|
_BASE_URL + '4k60fpsVP8_boat_sync_30s.webm'
|
|
),
|
|
('vp9_720_30fps',
|
|
_BASE_URL + '720p30fpsVP9_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp9_720_60fps',
|
|
_BASE_URL + '720p60fpsVP9_boat_sync_30s.webm'
|
|
),
|
|
('vp9_1080_30fps',
|
|
_BASE_URL + '1080p30fpsVP9_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp9_1080_60fps',
|
|
_BASE_URL + '1080p60fpsVP9_boat_sync_30s.webm'
|
|
),
|
|
('vp9_4k_30fps',
|
|
_BASE_URL + '4k30fpsVP9_foodmarket_sync_30s.webm'
|
|
),
|
|
('vp9_4k_60fps',
|
|
_BASE_URL + '4k60fpsVP9_boat_sync_30s.webm'
|
|
),
|
|
('av1_720_30fps',
|
|
_BASE_URL + '720p30fpsAV1_foodmarket_sync_30s.mp4'
|
|
),
|
|
('av1_720_60fps',
|
|
_BASE_URL + '720p60fpsAV1_boat_sync_30s.mp4'
|
|
),
|
|
('av1_1080_30fps',
|
|
_BASE_URL + '1080p30fpsAV1_foodmarket_sync_30s.mp4'
|
|
),
|
|
('av1_1080_60fps',
|
|
_BASE_URL + '1080p60fpsAV1_boat_sync_30s.mp4'
|
|
),
|
|
]
|
|
|
|
|
|
_FAST_BASE_URL = 'http://storage.googleapis.com/chromiumos-test-assets-public/tast/cros/video/power/10s/'
|
|
_FAST_VIDEOS = [
|
|
('h264_720_30fps',
|
|
_FAST_BASE_URL + '720p30fpsH264_foodmarket_sync_10s.mp4'
|
|
),
|
|
('vp8_720_30fps',
|
|
_FAST_BASE_URL + '720p30fpsVP8_foodmarket_sync_10s.webm'
|
|
),
|
|
('vp9_720_30fps',
|
|
_FAST_BASE_URL + '720p30fpsVP9_foodmarket_sync_10s.webm'
|
|
),
|
|
('av1_720_30fps',
|
|
_FAST_BASE_URL + '720p30fpsAV1_foodmarket_sync_10s.mp4'
|
|
),
|
|
]
|
|
|
|
def _prepare_video(self, cr, url):
|
|
"""Prepare browser session before playing video.
|
|
|
|
@param cr: Autotest Chrome instance.
|
|
@param url: url of video file to play.
|
|
"""
|
|
# Download video to ramdisk
|
|
local_path = os.path.join(self._RAMDISK, os.path.basename(url))
|
|
logging.info('Downloading %s to %s', url, local_path)
|
|
file_utils.download_file(url, local_path)
|
|
self.cr.browser.platform.SetHTTPServerDirectories(self._RAMDISK)
|
|
|
|
def _start_video(self, cr, url):
|
|
"""Start playing video.
|
|
|
|
@param cr: Autotest Chrome instance.
|
|
@param local_path: path to the local video file to play.
|
|
"""
|
|
local_path = os.path.join(self._RAMDISK, os.path.basename(url))
|
|
tab = cr.browser.tabs[0]
|
|
tab.Navigate(cr.browser.platform.http_server.UrlOf(local_path))
|
|
tab.WaitForDocumentReadyStateToBeComplete()
|
|
tab.EvaluateJavaScript(
|
|
"document.getElementsByTagName('video')[0].loop=true")
|
|
|
|
def _teardown_video(self, cr, url):
|
|
"""Teardown browser session after playing video.
|
|
|
|
@param cr: Autotest Chrome instance.
|
|
@param url: url of video file to play.
|
|
"""
|
|
self.cr.browser.platform.StopAllLocalServers()
|
|
local_path = os.path.join(self._RAMDISK, os.path.basename(url))
|
|
os.remove(local_path)
|
|
|
|
def run_once(self, videos=None, secs_per_video=_MEASUREMENT_DURATION,
|
|
use_hw_decode=True, fast=False):
|
|
"""run_once method.
|
|
|
|
@param videos: list of tuple of tagname and video url to test.
|
|
@param secs_per_video: time in seconds to play video and measure power.
|
|
@param use_hw_decode: if False, disable hw video decoding.
|
|
@param fast: Use smaller set of videos when videos is None.
|
|
"""
|
|
default_videos = self._FAST_VIDEOS if fast else self._VIDEOS
|
|
if not videos:
|
|
videos = default_videos
|
|
else:
|
|
for i, (tagname, url) in enumerate(videos):
|
|
if url:
|
|
continue
|
|
# if url is unset & tagname matches default use that path.
|
|
for default in default_videos:
|
|
if tagname == default[0]:
|
|
videos[i] = default
|
|
break
|
|
else:
|
|
estr = 'Unable to find URL for video name %s' % tagname
|
|
raise error.TestError(estr)
|
|
|
|
super(power_VideoPlayback, self).run_once(
|
|
videos, secs_per_video, use_hw_decode)
|