chromium/third_party/blink/web_tests/external/wpt/webcodecs/video-decoder.crossOriginIsolated.https.any.js

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

const testData = {
  src: 'h264.mp4',
  config: {
    codec: 'avc1.64000b',
    description: {offset: 9490, size: 45},
    codedWidth: 320,
    codedHeight: 240,
    displayAspectWidth: 320,
    displayAspectHeight: 240,
  }
};

// Create a view of an ArrayBuffer.
function view(buffer, {offset, size}) {
  return new Uint8Array(buffer, offset, size);
}

function testSharedArrayBufferDescription(t, useView) {
  const data = testData;

  // Don't run test if the codec is not supported.
  assert_equals("function", typeof VideoDecoder.isConfigSupported);
  let supported = false;
  return VideoDecoder.isConfigSupported({codec: data.config.codec})
      .catch(_ => {
        assert_implements_optional(false, data.config.codec + ' unsupported');
      })
      .then(support => {
        supported = support.supported;
        assert_implements_optional(
            supported, data.config.codec + ' unsupported');
        return fetch(data.src);
      })
      .then(response => {
        return response.arrayBuffer();
      })
      .then(buf => {
        config = {...data.config};
        if (data.config.description) {
          let desc = new SharedArrayBuffer(data.config.description.size);
          let descView = new Uint8Array(desc);
          descView.set(view(buf, data.config.description));
          config.description = useView ? descView : desc;
        }

        // Support was verified above, so the description shouldn't change
        // that.
        return VideoDecoder.isConfigSupported(config);
      })
      .then(support => {
        assert_true(support.supported);

        const decoder = new VideoDecoder(getDefaultCodecInit(t));
        decoder.configure(config);
        assert_equals(decoder.state, 'configured', 'state');
      });
}

promise_test(t => {
  return testSharedArrayBufferDescription(t, /*useView=*/ false);
}, 'Test isConfigSupported() and configure() using a SharedArrayBuffer');

promise_test(t => {
  return testSharedArrayBufferDescription(t, /*useView=*/ true);
}, 'Test isConfigSupported() and configure() using a Uint8Array(SharedArrayBuffer)');