blob: 9854c228809b3d329bafa8b57f6a4c113ce05d64 [file] [log] [blame]
# Copyright 2021 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 __future__ import print_function
import os
import sys
import json
from gpu_tests import gpu_integration_test
from gpu_tests import path_util
html_path = os.path.join(path_util.GetChromiumSrcDir(), 'content', 'test',
'data', 'gpu', 'webcodecs')
data_path = os.path.join(path_util.GetChromiumSrcDir(), 'media', 'test', 'data')
four_colors_img_path = os.path.join(data_path, 'four-colors.y4m')
frame_sources = ["camera", "capture", "offscreen", "hw_decoder", "sw_decoder"]
codecs = ["avc1.42001E", "vp8", "vp09.00.10.08", "av01.0.04M.08"]
accelerations = ["prefer-hardware", "prefer-software"]
class WebCodecsIntegrationTest(gpu_integration_test.GpuIntegrationTest):
@classmethod
def Name(cls):
return 'webcodecs'
@classmethod
def GenerateGpuTests(cls, options):
for source_type in frame_sources:
yield ('WebCodecs_DrawImage_' + source_type, 'draw-image.html', ({
"source_type":
source_type
}))
yield ('WebCodecs_TexImage2d_' + source_type, 'tex-image-2d.html', ({
"source_type":
source_type
}))
yield ('WebCodecs_copyTo_' + source_type, 'copyTo.html', ({
"source_type":
source_type
}))
for codec in codecs:
yield ('WebCodecs_EncodeDecode_' + codec, 'encode-decode.html', ({
"codec":
codec
}))
for source_type in frame_sources:
for codec in codecs:
for acc in accelerations:
args = (source_type, codec, acc)
yield ('WebCodecs_Encode_%s_%s_%s' % args, 'encode.html', ({
"source_type":
source_type,
"codec":
codec,
"acceleration":
acc
}))
for codec in codecs:
for acc in accelerations:
for bitrate_mode in ["constant", "variable"]:
for latency_mode in ["realtime", "quality"]:
args = ("offscreen", codec, acc, bitrate_mode, latency_mode)
yield ('WebCodecs_EncodingModes_%s_%s_%s_%s_%s' % args,
'encoding-modes.html', ({
"source_type": source_type,
"codec": codec,
"acceleration": acc,
"bitrate_mode": bitrate_mode,
"latency_mode": latency_mode
}))
for codec in codecs:
for layers in [2, 3]:
args = (codec, layers)
yield ('WebCodecs_SVC_%s_layers_%d' % args, 'svc.html', ({
"codec":
codec,
"layers":
layers
}))
for codec in codecs:
for acc in accelerations:
args = (codec, acc)
yield ('WebCodecs_EncodeColorSpace_%s_%s' % args,
'encode-color-space.html', ({
"codec": codec,
"acceleration": acc
}))
def RunActualGpuTest(self, test_path, *args):
url = self.UrlOfStaticFilePath(html_path + '/' + test_path)
tab = self.tab
arg_obj = args[0]
os_name = self.platform.GetOSName()
arg_obj["validate_camera_frames"] = self.CameraCanShowFourColors(os_name)
tab.Navigate(url)
tab.action_runner.WaitForJavaScriptCondition(
'document.readyState == "complete"')
tab.EvaluateJavaScript('TEST.run(' + json.dumps(arg_obj) + ')')
tab.action_runner.WaitForJavaScriptCondition('TEST.finished', timeout=60)
if tab.EvaluateJavaScript('TEST.skipped'):
self.skipTest('Skipping test:' + tab.EvaluateJavaScript('TEST.summary()'))
if not tab.EvaluateJavaScript('TEST.success'):
self.fail('Test failure:' + tab.EvaluateJavaScript('TEST.summary()'))
@staticmethod
def CameraCanShowFourColors(os_name):
return os_name != 'android' and os_name != 'chromeos'
@classmethod
def SetUpProcess(cls):
super(WebCodecsIntegrationTest, cls).SetUpProcess()
args = [
'--use-fake-device-for-media-stream',
'--use-fake-ui-for-media-stream',
]
# If we don't call CustomizeBrowserArgs cls.platform is None
cls.CustomizeBrowserArgs(args)
platform = cls.platform
if cls.CameraCanShowFourColors(platform.GetOSName()):
args.append('--use-file-for-fake-video-capture=' + four_colors_img_path)
cls.CustomizeBrowserArgs(args)
cls.StartBrowser()
cls.SetStaticServerDirs([html_path, data_path])
@classmethod
def ExpectationsFiles(cls):
return [
os.path.join(os.path.dirname(os.path.abspath(__file__)),
'test_expectations', 'webcodecs_expectations.txt')
]
def load_tests(loader, tests, pattern):
del loader, tests, pattern # Unused.
return gpu_integration_test.LoadAllTestsInModule(sys.modules[__name__])