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)
 |