chromium/third_party/blink/perf_tests/webcodecs/videoFrame-utils.js

function waitForNextFrame() {
  return new Promise((resolve, _) => {
    window.requestAnimationFrame(resolve);
  });
}

function fourColorsFrame(ctx, width, height, text) {
  const kYellow = '#FFFF00';
  const kRed = '#FF0000';
  const kBlue = '#0000FF';
  const kGreen = '#00FF00';

  ctx.fillStyle = kYellow;
  ctx.fillRect(0, 0, width / 2, height / 2);

  ctx.fillStyle = kRed;
  ctx.fillRect(width / 2, 0, width / 2, height / 2);

  ctx.fillStyle = kBlue;
  ctx.fillRect(0, height / 2, width / 2, height / 2);

  ctx.fillStyle = kGreen;
  ctx.fillRect(width / 2, height / 2, width / 2, height / 2);

  ctx.fillStyle = 'white';
  ctx.font = (height / 10) + 'px sans-serif';
  ctx.fillText(text, width / 2, height / 2);
}

async function createDecodedFrame() {
  const config = {codec: 'avc1.64001f', codedWidth: 1280, codedHeight: 720};

  const support = await VideoDecoder.isConfigSupported(config);
  if (!support.supported) {
    PerfTestRunner.logFatalError("Skipping test. Unsupported decoder config:" +
                                 JSON.stringify(config));
    return null;
  }

  const result = await fetch('resources/720p.h264');
  const buf = await result.arrayBuffer();
  const chunk = new EncodedVideoChunk({timestamp: 0, type: 'key', data: buf});

  let frame = null;
  const decoder = new VideoDecoder({
    output: f => frame = f,
    error: e => PerfTestRunner.log('Decode error:' + e)
  });
  decoder.configure(config);
  decoder.decode(chunk);
  await decoder.flush();
  return frame;
}