in src/webgpu/web_platform/util.ts [372:429]
export function startPlayingAndWaitForVideo(
video: HTMLVideoElement,
callback: () => unknown | Promise<unknown>
): Promise<void> {
return raceWithRejectOnTimeout(
new Promise((resolve, reject) => {
const callbackAndResolve = () =>
void (async () => {
try {
await callback();
resolve();
} catch (ex) {
reject(ex);
}
})();
if (video.error) {
reject(
new ErrorWithExtra('Video.error: ' + video.error.message, () => ({ error: video.error }))
);
return;
}
video.addEventListener(
'error',
event =>
reject(
new ErrorWithExtra('Video received "error" event, message: ' + event.message, () => ({
event,
}))
),
true
);
if (video.requestVideoFrameCallback) {
video.requestVideoFrameCallback(() => {
callbackAndResolve();
});
} else {
// If requestVideoFrameCallback isn't available, check each frame if the video has advanced.
const timeWatcher = () => {
if (video.currentTime > 0) {
callbackAndResolve();
} else {
requestAnimationFrame(timeWatcher);
}
};
timeWatcher();
}
video.loop = true;
video.muted = true;
video.preload = 'auto';
video.play().catch(reject);
}),
2000,
'Video never became ready'
);
}