You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.8 KiB
165 lines
4.8 KiB
# 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()
|