blob: 984b530e39bacdab151d0a502fbc8a62adf64f3f [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from core import perf_benchmark
from telemetry import benchmark
from telemetry.page import legacy_page_test
from telemetry.timeline import chrome_trace_category_filter
from telemetry.value import list_of_scalar_values
from telemetry.value import scalar
from telemetry.web_perf import timeline_based_measurement
from measurements import media
import page_sets
class _MSEMeasurement(legacy_page_test.LegacyPageTest):
def __init__(self):
super(_MSEMeasurement, self).__init__()
def ValidateAndMeasurePage(self, page, tab, results):
del page # unused
media_metric = tab.EvaluateJavaScript('window.__testMetrics')
trace = media_metric['id'] if 'id' in media_metric else None
metrics = media_metric['metrics'] if 'metrics' in media_metric else []
for m in metrics:
trace_name = '%s.%s' % (m, trace)
if isinstance(metrics[m], list):
results.AddValue(list_of_scalar_values.ListOfScalarValues(
results.current_page, trace_name, units='ms',
values=[float(v) for v in metrics[m]],
important=True))
else:
results.AddValue(scalar.ScalarValue(
results.current_page, trace_name, units='ms',
value=float(metrics[m]), important=True))
# android: See media.android.tough_video_cases below
# crbug.com/565180: Only include cases that report time_to_play
@benchmark.Disabled('android')
class MediaToughVideoCases(perf_benchmark.PerfBenchmark):
"""Obtains media metrics for key user scenarios."""
test = media.Media
page_set = page_sets.ToughVideoCasesPageSet
@classmethod
def Name(cls):
return 'media.tough_video_cases'
@benchmark.Owner(emails=['johnchen@chromium.org', 'crouleau@chromium.org'],
component='Internals>Media')
@benchmark.Disabled('android')
class MediaToughVideoCasesTBMv2(perf_benchmark.PerfBenchmark):
"""Obtains media metrics using TBMv2.
Will eventually replace MediaToughVideoCases class."""
page_set = page_sets.ToughVideoCasesPageSet
def CreateTimelineBasedMeasurementOptions(self):
category_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter()
# 'toplevel' category provides CPU time slices used by # cpuTimeMetric.
category_filter.AddIncludedCategory('toplevel')
# 'rail' category is used by powerMetric to attribute different period of
# time to different activities, such as video_animation, etc.
category_filter.AddIncludedCategory('rail')
options = timeline_based_measurement.Options(category_filter)
options.config.enable_atrace_trace = True
options.config.atrace_config.categories = ['sched']
options.config.enable_battor_trace = True
options.SetTimelineBasedMetrics(['powerMetric', 'cpuTimeMetric'])
return options
@classmethod
def Name(cls):
return 'media.tough_video_cases_tbmv2'
# crbug.com/565180: Only include cases that don't report time_to_play
@benchmark.Disabled('android')
@benchmark.Owner(emails=['crouleau@chromium.org', 'videostack-eng@google.com'])
class MediaExtra(perf_benchmark.PerfBenchmark):
"""Obtains extra media metrics for key user scenarios."""
test = media.Media
page_set = page_sets.ToughVideoCasesExtraPageSet
@classmethod
def Name(cls):
return 'media.tough_video_cases_extra'
@benchmark.Disabled('android', 'mac')
@benchmark.Owner(emails=['crouleau@chromium.org', 'videostack-eng@google.com'])
class MediaNetworkSimulation(perf_benchmark.PerfBenchmark):
"""Obtains media metrics under different network simulations."""
test = media.Media
page_set = page_sets.MediaCnsCasesPageSet
@classmethod
def Name(cls):
return 'media.media_cns_cases'
@benchmark.Disabled('l', 'android-webview') # WebView: crbug.com/419689.
class MediaAndroid(perf_benchmark.PerfBenchmark):
"""Obtains media metrics for key user scenarios on Android."""
test = media.Media
tag = 'android'
page_set = page_sets.ToughVideoCasesPageSet
# Exclude is_4k and 50 fps media files (garden* & crowd*).
options = {'story_tag_filter_exclude': 'is_4k,is_50fps'}
@classmethod
def ShouldDisable(cls, possible_browser):
if possible_browser.platform.GetOSName() != "android":
return True
return cls.IsSvelte(possible_browser)
@classmethod
def Name(cls):
return 'media.android.tough_video_cases'
@benchmark.Enabled('chromeos')
class MediaChromeOS4kOnly(perf_benchmark.PerfBenchmark):
"""Benchmark for media performance on ChromeOS using only is_4k test content.
"""
test = media.Media
tag = 'chromeOS4kOnly'
page_set = page_sets.ToughVideoCasesPageSet
options = {
'story_tag_filter': 'is_4k',
# Exclude is_50fps test files: crbug/331816
'story_tag_filter_exclude': 'is_50fps'
}
@classmethod
def Name(cls):
return 'media.chromeOS4kOnly.tough_video_cases'
@benchmark.Enabled('chromeos')
class MediaChromeOS(perf_benchmark.PerfBenchmark):
"""Benchmark for media performance on all ChromeOS platforms.
This benchmark does not run is_4k content, there's a separate benchmark for
that.
"""
test = media.Media
tag = 'chromeOS'
page_set = page_sets.ToughVideoCasesPageSet
# Exclude is_50fps test files: crbug/331816
options = {'story_tag_filter_exclude': 'is_4k,is_50fps'}
@classmethod
def Name(cls):
return 'media.chromeOS.tough_video_cases'
@benchmark.Disabled('android-webview') # crbug.com/419689
@benchmark.Owner(emails=['crouleau@chromium.org', 'videostack-eng@google.com'])
class MediaSourceExtensions(perf_benchmark.PerfBenchmark):
"""Obtains media metrics for key media source extensions functions."""
test = _MSEMeasurement
page_set = page_sets.MseCasesPageSet
@classmethod
def Name(cls):
return 'media.mse_cases'
def SetExtraBrowserOptions(self, options):
# Needed to allow XHR requests to return stream objects.
options.AppendExtraBrowserArgs(
['--enable-experimental-web-platform-features',
'--disable-gesture-requirement-for-media-playback'])