1 # Copyright 2016 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. 4 5 """Facade to access the video-related functionality.""" 6 7 import functools 8 import glob 9 import os 10 11 from autotest_lib.client.bin import utils 12 from autotest_lib.client.cros.multimedia import display_facade_native 13 from autotest_lib.client.cros.video import native_html5_player 14 15 16 class VideoFacadeNativeError(Exception): 17 """Error in VideoFacadeNative.""" 18 pass 19 20 21 def check_arc_resource(func): 22 """Decorator function for ARC related functions in VideoFacadeNative.""" 23 @functools.wraps(func) 24 def wrapper(instance, *args, **kwargs): 25 """Wrapper for the methods to check _arc_resource. 26 27 @param instance: Object instance. 28 29 @raises: VideoFacadeNativeError if there is no ARC resource. 30 31 """ 32 if not instance._arc_resource: 33 raise VideoFacadeNativeError('There is no ARC resource.') 34 return func(instance, *args, **kwargs) 35 return wrapper 36 37 38 class VideoFacadeNative(object): 39 """Facede to access the video-related functionality. 40 41 The methods inside this class only accept Python native types. 42 43 """ 44 45 def __init__(self, resource, arc_resource=None): 46 """Initializes an video facade. 47 48 @param resource: A FacadeResource object. 49 @param arc_resource: An ArcResource object. 50 51 """ 52 self._resource = resource 53 self._player = None 54 self._arc_resource = arc_resource 55 self._display_facade = display_facade_native.DisplayFacadeNative( 56 resource) 57 self.bindir = os.path.dirname(os.path.realpath(__file__)) 58 59 60 def cleanup(self): 61 """Clean up the temporary files.""" 62 for path in glob.glob('/tmp/playback_*'): 63 os.unlink(path) 64 65 if self._arc_resource: 66 self._arc_resource.cleanup() 67 68 69 def prepare_playback(self, file_path, fullscreen=True): 70 """Copies the html file to /tmp and loads the webpage. 71 72 @param file_path: The path to the file. 73 @param fullscreen: Plays the video in fullscreen. 74 75 """ 76 # Copies the html file to /tmp to make it accessible. 77 utils.get_file( 78 os.path.join(self.bindir, 'video.html'), 79 '/tmp/playback_video.html') 80 81 html_path = 'file:///tmp/playback_video.html' 82 83 tab = self._resource._browser.tabs.New() 84 tab.Navigate(html_path) 85 self._player = native_html5_player.NativeHtml5Player( 86 tab=tab, 87 full_url=html_path, 88 video_id='video', 89 video_src_path=file_path) 90 self._player.load_video() 91 92 if fullscreen: 93 self._display_facade.set_fullscreen(True) 94 95 96 def start_playback(self, blocking=False): 97 """Starts video playback on the webpage. 98 99 Before calling this method, user should call prepare_playback to 100 put the files to /tmp and load the webpage. 101 102 @param blocking: Blocks this call until playback finishes. 103 104 """ 105 self._player.play() 106 if blocking: 107 self._player.wait_video_ended() 108 109 110 def pause_playback(self): 111 """Pauses playback on the webpage.""" 112 self._player.pause() 113 114 115 def dropped_frame_count(self): 116 """ 117 Gets the number of dropped frames. 118 119 @returns: An integer indicates the number of dropped frame. 120 121 """ 122 return self._player.dropped_frame_count() 123 124 125 @check_arc_resource 126 def prepare_arc_playback(self, file_path, fullscreen=True): 127 """Copies the video file to be played into container and starts the app. 128 129 User should call this method to put the file into container before 130 calling start_arc_playback. 131 132 @param file_path: Path to the file to be played on Cros host. 133 @param fullscreen: Plays the video in fullscreen. 134 135 """ 136 self._arc_resource.play_video.prepare_playback(file_path, fullscreen) 137 138 139 @check_arc_resource 140 def start_arc_playback(self, blocking_secs=None): 141 """Starts playback through Play Video app. 142 143 Before calling this method, user should call set_arc_playback_file to 144 put the file into container and start the app. 145 146 @param blocking_secs: A positive number indicates the timeout to wait 147 for the playback is finished. Set None to make 148 it non-blocking. 149 150 151 """ 152 self._arc_resource.play_video.start_playback(blocking_secs) 153 154 155 @check_arc_resource 156 def pause_arc_playback(self): 157 """Pauses playback through Play Video app.""" 158 self._arc_resource.play_video.pause_playback() 159 160 161 @check_arc_resource 162 def stop_arc_playback(self): 163 """Stops playback through Play Video app.""" 164 self._arc_resource.play_video.stop_playback() 165