diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/media/test/test_hw_video_decoding.html | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/media/test/test_hw_video_decoding.html')
-rw-r--r-- | dom/media/test/test_hw_video_decoding.html | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/dom/media/test/test_hw_video_decoding.html b/dom/media/test/test_hw_video_decoding.html new file mode 100644 index 0000000000..f93ab9b0a8 --- /dev/null +++ b/dom/media/test/test_hw_video_decoding.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>Test video hardware decoding</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +<script type="application/javascript"> + +/** + * This test is used to check hardware video decoding on different platforms. + */ +const PLATFORMS = { + // TODO : add Linux and Android, media-gpu doesn't run on them yet + WINNT: { + process: "GPU", + tests: [ + { + file: "gizmo.mp4", + decoder: "wmf H264 codec hardware video decoder", + }, + // TODO : enable VP9 for Windows. The current machine on CI doesn't + // support VP9 HW. See bug 1861755. + // { + // file: "gizmo.webm", + // decoder: "wmf VP9 codec hardware video decoder", + // }, + // TODO : add AV1, see bug 1861501. + ], + }, + Darwin: { + process: "RDD", + tests: [ + { + file: "gizmo.mp4", + decoder: "apple hardware VT decoder", + }, + // TODO : enable VP9 for MacOS. The current machine on CI doesn't support + // VP9 HW. See bug 1861741. + // { + // file: "gizmo.webm", + // decoder: "apple hardware VT decoder", + // }, + ], + }, +}; + +add_task(async function testHardwareVideoDecoding() { + const platformName = SpecialPowers.Services.appinfo.OS; + const platformTest = PLATFORMS[platformName]; + for (const test of platformTest.tests) { + info( + `Testing ${test.file} on ${platformName} : expect ${test.decoder} in ${platformTest.process}` + ); + await createAndPlayVideo(test.file); + await assertRunningProcessAndDecoderName({ + expectedProcess: platformTest.process, + expectedDecoder: test.decoder, + }); + await waitVideoPlayToEnd(); + } +}); + +// Following are helper functions +async function createAndPlayVideo(fileUrl) { + const video = document.createElement("video"); + document.body.appendChild(video); + video.src = fileUrl; + ok( + await video.play().then( + () => true, + () => false + ), + "video started playing" + ); + // Waiting for timeupdate to ensure the video decoder has been created + // correctly. + await new Promise(r => (video.ontimeupdate = r)); +} + +async function assertRunningProcessAndDecoderName( + { expectedProcess, expectedDecoder } = {} +) { + const video = document.querySelector("video"); + ok(!video.paused, "checking a playing video that should be hw decoding"); + + const debugInfo = await SpecialPowers.wrap(video).mozRequestDebugInfo(); + const videoDecoderName = debugInfo.decoder.reader.videoDecoderName; + + const isExpectedDecoder = + videoDecoderName.indexOf(`${expectedDecoder}`) == 0; + ok( + isExpectedDecoder, + `Playback running by decoder '${videoDecoderName}', expected '${expectedDecoder}'` + ); + + const isExpectedProcess = + videoDecoderName.indexOf(`(${expectedProcess} remote)`) > 0; + ok( + isExpectedProcess, + `Playback running in process '${videoDecoderName}', expected '${expectedProcess}'` + ); +} + +async function waitVideoPlayToEnd() { + const video = document.querySelector("video"); + if (video.ended) { + ok(true, "video reached to end!"); + } else { + await new Promise(r => (video.onended = r)); + } + // Remove current video so that we can check next video later. + document.body.removeChild(video); +} + +</script> +</head> +<body> +</body> +</html> |