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