<!DOCTYPE html>
<title>Decode Capabilities Test</title>
<div id="console"></div>
<script type='text/javascript'>
  function log(message) {
    let consoleElement = document.getElementById('console');
    let entry = document.createElement('div');
    entry.appendChild(document.createTextNode(message));
    consoleElement.appendChild(entry);
    console.log(message);
  }

  function runTest(configuration) {
    try {
      navigator.mediaCapabilities.decodingInfo(configuration)
        .then((result) => {
          log('Decoding is '
              + (result.supported ? '' : 'un') + 'supported');

          document.title = result.supported ? 'SUPPORTED' : 'UNSUPPORTED';
        })
        .catch((e) => {
          log('Promise rejected: ' + e);
          document.title = "ERROR";
        });

    } catch (e) {
      log('Exception:' + e);
      document.title = "ERROR";
    }
  }

  function testVideoConfig(queryType, contentType) {
    // Clear previous test result from title.
    document.title = '';

    log("Testing video content type: " + contentType);

    const configuration = {
      type : queryType,
      video : {
        contentType : contentType,

        // Any reasonable value will do.
        width : 640,
        height : 480,
        bitrate : 10000,
        framerate : 30
      }
    };

    runTest(configuration);
  }

  function testAudioConfig(queryType, contentType) {
    // Clear previous test result from title.
    document.title = '';

    log("Testing audio content type: " + contentType);

    const configuration = {
      type : queryType,
      audio : {
        contentType : contentType
      }
    };

    runTest(configuration);
  }

  function testAudioConfigWithSpatialRendering(spatialRendering, queryType, contentType) {
    // Clear previous test result from title.
    document.title = '';

    log("Testing audio content type: " + contentType + ", spatialRendering: " + spatialRendering);

    const configuration = {
      type : queryType,
      audio : {
        contentType : contentType,
        spatialRendering : spatialRendering
      }
    };

    runTest(configuration);
  }

  function testVideoConfigWithHdrMetadata(hdrMetadataType,
                                          colorGamut,
                                          transferFunction,
                                          queryType,
                                          contentType) {
    // Clear previous test result from title.
    document.title = '';

    log("Testing video content type: " + contentType +
        ", HDR metadata type: " + hdrMetadataType +
        ", color gamut: " + colorGamut +
        ", transfer function: " + transferFunction);

    const configuration = {
      type : queryType,
      video : {
        contentType : contentType,
        hdrMetadataType : hdrMetadataType,
        colorGamut : colorGamut,
        transferFunction : transferFunction,
        // Any reasonable value will do.
        width : 640,
        height : 480,
        bitrate : 10000,
        framerate : 30
      }
    };

    runTest(configuration);
  }

  function testVideoConfigWithoutHdrMetadata(colorGamut,
                                          transferFunction,
                                          queryType,
                                          contentType) {
    // Clear previous test result from title.
    document.title = '';

    log("Testing video content type: " + contentType +
        ", color gamut: " + colorGamut +
        ", transfer function: " + transferFunction);

    const configuration = {
      type : queryType,
      video : {
        contentType : contentType,
        colorGamut : colorGamut,
        transferFunction : transferFunction,

        // Any reasonable value will do.
        width : 640,
        height : 480,
        bitrate : 10000,
        framerate : 30
      }
    };

    runTest(configuration);
  }
</script>
