blob: 3a6ecec0fb86eb1e258fd7588188d19e0cc38a4a [file]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
let decoder;
promise_test(async () => {
const response = await fetch("/media-resources/media-source/content/test-bframes-hevc.mp4");
const buffer = await response.arrayBuffer();
const hvcCOffset = [705, 130];
const frames = [
[99, 3973, 46304],
[366, 50277, 4531],
[233, 54808, 1371],
[167, 56179, 379],
[133, 56558, 172],
[199, 56730, 120],
[300, 56850, 313],
[266, 57163, 112],
[333, 57275, 150],
[633, 57425, 6427]
];
let frameTimestamps = [];
decoder = new VideoDecoder({
output(frame) {
frameTimestamps.push(frame.timestamp);
frame.close();
},
error(e) {
console.log(e);
}
});
decoder.configure({
codec: 'hev1.1.6.L120.90',
codedWidth: 852,
codedHeight: 480,
visibleRect: {x: 0, y: 0, width: 852, height: 480},
displayWidth: 852,
displayHeight: 480,
format: 'hevc',
description: new Uint8Array(buffer, hvcCOffset[0], hvcCOffset[1])
});
chunks = frames.map((frame, i) => new EncodedVideoChunk({type: i == 0 ? 'key' : 'delta', timestamp: frame[0], duration: 1, data: new Uint8Array(buffer, frame[1], frame[2])}));
for (let i = 0; i < chunks.length; ++i) {
decoder.decode(chunks[i]);
if (window.internals && (i === 2 || i === 4 || i === 8)) {
let counter = 0;
while (++counter < 100 && internals.hasPendingActivity(decoder))
await new Promise(resolve => setTimeout(resolve, 50));
assert_less_than(counter, 100, "test for " + i);
}
}
await decoder.flush();
assert_array_equals(frameTimestamps, frames.map(frame => frame[0]).sort((a,b) => a - b), "timestamps are ordered");
}, "Test HEVC reordering");
</script>
</body>
</html>