# Copyright 2016 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. """Facade to access the video-related functionality.""" import functools import glob import os from autotest_lib.client.bin import utils from autotest_lib.client.cros.multimedia import display_facade_native from autotest_lib.client.cros.video import native_html5_player class VideoFacadeNativeError(Exception): """Error in VideoFacadeNative.""" pass def check_arc_resource(func): """Decorator function for ARC related functions in VideoFacadeNative.""" @functools.wraps(func) def wrapper(instance, *args, **kwargs): """Wrapper for the methods to check _arc_resource. @param instance: Object instance. @raises: VideoFacadeNativeError if there is no ARC resource. """ if not instance._arc_resource: raise VideoFacadeNativeError('There is no ARC resource.') return func(instance, *args, **kwargs) return wrapper class VideoFacadeNative(object): """Facede to access the video-related functionality. The methods inside this class only accept Python native types. """ def __init__(self, resource, arc_resource=None): """Initializes an video facade. @param resource: A FacadeResource object. @param arc_resource: An ArcResource object. """ self._resource = resource self._player = None self._arc_resource = arc_resource self._display_facade = display_facade_native.DisplayFacadeNative( resource) self.bindir = os.path.dirname(os.path.realpath(__file__)) def cleanup(self): """Clean up the temporary files.""" for path in glob.glob('/tmp/playback_*'): os.unlink(path) if self._arc_resource: self._arc_resource.cleanup() def prepare_playback(self, file_path, fullscreen=True): """Copies the html file to /tmp and loads the webpage. @param file_path: The path to the file. @param fullscreen: Plays the video in fullscreen. """ # Copies the html file to /tmp to make it accessible. utils.get_file( os.path.join(self.bindir, 'video.html'), '/tmp/playback_video.html') html_path = 'file:///tmp/playback_video.html' tab = self._resource._browser.tabs.New() tab.Navigate(html_path) self._player = native_html5_player.NativeHtml5Player( tab=tab, full_url=html_path, video_id='video', video_src_path=file_path) self._player.load_video() if fullscreen: self._display_facade.set_fullscreen(True) def start_playback(self, blocking=False): """Starts video playback on the webpage. Before calling this method, user should call prepare_playback to put the files to /tmp and load the webpage. @param blocking: Blocks this call until playback finishes. """ self._player.play() if blocking: self._player.wait_video_ended() def pause_playback(self): """Pauses playback on the webpage.""" self._player.pause() def dropped_frame_count(self): """ Gets the number of dropped frames. @returns: An integer indicates the number of dropped frame. """ return self._player.dropped_frame_count() @check_arc_resource def prepare_arc_playback(self, file_path, fullscreen=True): """Copies the video file to be played into container and starts the app. User should call this method to put the file into container before calling start_arc_playback. @param file_path: Path to the file to be played on Cros host. @param fullscreen: Plays the video in fullscreen. """ self._arc_resource.play_video.prepare_playback(file_path, fullscreen) @check_arc_resource def start_arc_playback(self, blocking_secs=None): """Starts playback through Play Video app. Before calling this method, user should call set_arc_playback_file to put the file into container and start the app. @param blocking_secs: A positive number indicates the timeout to wait for the playback is finished. Set None to make it non-blocking. """ self._arc_resource.play_video.start_playback(blocking_secs) @check_arc_resource def pause_arc_playback(self): """Pauses playback through Play Video app.""" self._arc_resource.play_video.pause_playback() @check_arc_resource def stop_arc_playback(self): """Stops playback through Play Video app.""" self._arc_resource.play_video.stop_playback()