<!DOCTYPE html><!-- webkit-test-runner [ SourceBufferChangeTypeEnabled=true ] -->
<!-- Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>Exercise changeType for supported test types, using mime types WITH codecs (if applicable) for addSourceBuffer and changeType.</title>
        <meta name="timeout" content="long">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
        <script src="mediasource-changetype-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>

function generateChangeTypeTests(audio_types, video_types) {
  async_test((test) => {
    assert_true(audio_types.length > 1, "Browser doesn't support at least 2 types of audio test media");
    assert_true(video_types.length > 1, "Browser doesn't support at least 2 types of video test media");
    test.done();
  }, "Check if browser supports enough test media types");

  // Generate audio-only changeType tests
  for (let audio1 of audio_types) {
    for (let audio2 of audio_types) {
      mediaSourceChangeTypeTest(
          audio1, audio2,
          "Test audio-only changeType for " +
              audio1.type + " <-> " + audio2.type);
    }
  }

  // Generate video-only changeType tests
  for (let video1 of video_types) {
    for (let video2 of video_types) {
      mediaSourceChangeTypeTest(
          video1, video2,
          "Test video-only changeType for " +
              video1.type + " <-> " + video2.type);
    }
  }
}

findSupportedChangeTypeTestTypes(generateChangeTypeTests);

        </script>
    </body>
</html>
