1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
<!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",
// },
{
file: "av1.mp4",
decoder: "wmf AV1 codec hardware video decoder",
},
],
},
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>
|