Bug 1857629 - add video hardware decoding test on Windows and MacOS. r=media-playback-reviewers,padenot

Differential Revision: https://phabricator.services.mozilla.com/D191799
This commit is contained in:
alwu 2023-10-30 16:38:12 +00:00
parent 0088c604ff
commit 8b932d9213
2 changed files with 123 additions and 0 deletions

View file

@ -837,6 +837,10 @@ skip-if = ["os == 'android'"] # bug 1108558, android(bug 1232305)
skip-if = ["os != 'android'"]
tags = "hls"
["test_hw_video_decoding.html"]
skip-if = ["!mda_gpu"]
scheme = "https"
["test_imagecapture.html"]
scheme = "https"

View file

@ -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>