// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js

function testCreateImageBitmapFromVideoFrameVP9Decoder() {
  // Prefers hardware decoders by setting video size as large as 720p.
  const width = 1280;
  const height = 720;

  let canvas = new OffscreenCanvas(width, height);
  let ctx = canvas.getContext('2d');
  ctx.fillStyle = 'rgb(50, 100, 150)';
  ctx.fillRect(0, 0, width, height);

  return createImageBitmap(canvas).then((fromImageBitmap) => {
    let videoFrame = new VideoFrame(fromImageBitmap, {
      timestamp: 0
    });
    return new Promise((resolve, reject) => {
      let processVideoFrame = (frame) => {
        createImageBitmap(frame).then((toImageBitmap) => {
          let myCanvas = new OffscreenCanvas(width, height);
          let myCtx = myCanvas.getContext('2d');
          myCtx.drawImage(toImageBitmap, 0, 0);
          let tolerance = 10;
          try {
            testCanvas(myCtx, width, height, kSRGBPixel, null,
              (actual, expected) => {
                assert_approx_equals(actual, expected, tolerance);
              }
            );
          } catch (error) {
            reject(error);
          }
          resolve('Done.');
        });
      };

      const decoderInit = {
        output: processVideoFrame,
        error: (e) => {
          reject(e);
        }
      };

      let decoder = new VideoDecoder(decoderInit);

      let processVideoChunk = (chunk, metadata) => {
        if (metadata && metadata.decoderConfig) {
          decoder.configure(metadata.decoderConfig);
        }
        decoder.decode(chunk);
        decoder.flush();
      };

      const encoderInit = {
        output: processVideoChunk,
        error: (e) => {
          reject(e);
        }
      };

      const videoEncoderConfig = {
        codec: "vp09.00.10.08",
        width: width,
        height: height,
        bitrate: 10e6,
        framerate: 30
      };

      let encoder = new VideoEncoder(encoderInit);
      encoder.configure(videoEncoderConfig);
      encoder.encode(videoFrame, {
        keyFrame: true
      });
      encoder.flush();
    });
  });
}

promise_test(() => {
  return testCreateImageBitmapFromVideoFrameVP9Decoder();
}, 'Create ImageBitmap for a VideoFrame from VP9 decoder.');
