<!DOCTYPE html>
<!--
Check that VideoEncoder can encode in different framerate and resolutions
-->
<html>

<head>
  <title>Encoding framerate resolutions test</title>
  <script src="webcodecs_common.js"></script>
  <script type="text/javascript">
    'use strict';
    async function main(arg) {
      const width = Number(arg.resolution.split('x')[0].trim());
      const height = Number(arg.resolution.split('x')[1].trim());
      const number_of_frames_to_encode = 5;

      let errors = 0;
      let decoder_configs = [];

      const encoder_config = {
        codec: arg.codec,
        hardwareAcceleration: arg.acceleration,
        width: width,
        height: height,
        latencyMode: arg.latency_mode,
        framerate: arg.framerate,
      };

      TEST.log('Starting test with arguments: ' + JSON.stringify(arg, null, 2));
      TEST.log('Encoder configs: ' + JSON.stringify(encoder_config, null, 2));
      let supported = false;
      try {
        supported = (await VideoEncoder.isConfigSupported(encoder_config)).supported;
      } catch (e) {}
      if (!supported) {
        TEST.skip('Unsupported configs: ' + JSON.stringify(encoder_config, null, 2));
        return;
      }

      let source = await createFrameSource('offscreen', width, height);
      if (!source) {
        TEST.skip('Unsupported source: ' + arg.source_type);
        return;
      }

      const init = {
        output(chunk, metadata) {
          if (metadata.decoderConfig) {
            decoder_configs.push(metadata.decoderConfig);
          }
        },
        error(e) {
          errors++;
          TEST.log(e);
        }
      };

      let encoder = new VideoEncoder(init);
      encoder.configure(encoder_config);

      for (let i = 0; i < number_of_frames_to_encode; i++) {
        let frame = await source.getNextFrame();
        encoder.encode(frame, { keyFrame: false });

        frame.close();
        await waitForNextFrame();
      }

      await encoder.flush();
      encoder.close();
      source.close();

      TEST.assert(
        decoder_configs.length >= 1,
        'There should be at least 1 configs');

      TEST.assert(errors == 0, 'Encoding errors occurred during the test');
      TEST.log('Test completed');
    }
    addManualTestButton([{
      'resolution': '1280x720',
      'framerate': 30,
      'codec': 'avc1.420034',
      'acceleration': 'prefer-hardware',
      'latency_mode': 'quality',
    }]);
    addManualTestButton([{
      'resolution': '1280x720',
      'framerate': 30,
      'codec': 'hvc1.1.6.L123.00',
      'acceleration': 'prefer-hardware',
      'latency_mode': 'quality',
    }]);
  </script>
</head>

<body>
</body>

</html>
