<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.createOffer</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../RTCPeerConnection-helper.js"></script>
<script>
'use strict';

/*
 * Chromium note: this requires build bots with H264 support. See
 *   https://bugs.chromium.org/p/chromium/issues/detail?id=840659
 * for details on how to enable support.
 */
// Tests for conformance to RFC 7742,
// "WebRTC Video Processing and Codec Requirements"
// The document was formerly known as draft-ietf-rtcweb-video-codecs.
//
// This tests that the browser is a WebRTC Browser as defined there.

// TODO: Section 3.2: screen capture video MUST be prepared
// to handle resolution changes.

// TODO: Section 4: MUST support generating CVO (orientation)

// Section 5: Browsers MUST implement VP8 and H.264 Constrained Baseline
promise_test(async t => {
  const pc = new RTCPeerConnection();
  const offer = await generateVideoReceiveOnlyOffer(pc);
  let video_section_found = false;
  for (let section of offer.sdp.split(/\r\nm=/)) {
    if (section.search('video') != 0) {
      continue;
    }
    video_section_found = true;
    // RTPMAP lines have the format a=rtpmap:<pt> <codec>/<clock rate>
    let rtpmap_regex = /\r\na=rtpmap:(\d+) (\S+)\/\d+\r\n/g;
    let match = rtpmap_regex.exec(offer.sdp);
    let payload_type_map = new Array();
    while (match) {
      payload_type_map[match[1]] = match[2];
      match = rtpmap_regex.exec(offer.sdp);
    }
    assert_true(payload_type_map.indexOf('VP8') > -1,
                'VP8 is supported');
    assert_true(payload_type_map.indexOf('H264') > -1,
                'H.264 is supported');
    // TODO: Verify that one of the H.264 PTs supports constrained baseline
  }
  assert_true(video_section_found);
}, 'H.264 and VP8 should be supported in initial offer');

async function negotiateParameters() {
  const pc1 = new RTCPeerConnection();
  const pc2 = new RTCPeerConnection();
  let [track, streams] = await getTrackFromUserMedia('video');
  const sender = pc1.addTrack(track);
  await exchangeOfferAnswer(pc1, pc2);
  return sender.getParameters();
}

function parseFmtp(fmtp) {
  const params = fmtp.split(';');
  return params.map(param => param.split('='));
}

promise_test(async t => {
  const params = await negotiateParameters();
  assert_true(!!params.codecs.find(codec => codec.mimeType.toLowerCase() === 'video/h264'));
  assert_true(!!params.codecs.find(codec => codec.mimeType.toLowerCase() === 'video/vp8'));
}, 'H.264 and VP8 should be negotiated after handshake');

// TODO: Section 6: Recipients MUST be able to decode 320x240@20 fps
// TODO: Section 6.1: VP8 MUST support RFC 7741 payload formats
// TODO: Section 6.1: VP8 MUST respect max-fr/max-fs
// TODO: Section 6.1: VP8 MUST encode and decode square pixels
// TODO: Section 6.2: H.264 MUST support RFC 6184 payload formats
// TODO: Section 6.2: MUST support Constrained Baseline level 1.2
// TODO: Section 6.2: SHOULD support Constrained High level 1.3
// TODO: Section 6.2: MUST support packetization mode 1.
promise_test(async t => {
  const params = await negotiateParameters();
  const h264 = params.codecs.filter(codec => codec.mimeType === 'video/H264');
  h264.map(codec => {
    const codec_params = parseFmtp(codec.sdpFmtpLine);
    assert_true(!!codec_params.find(x => x[0] === 'profile-level-id'));
  })
}, 'All H.264 codecs MUST include profile-level-id');

// TODO: Section 6.2: SHOULD interpret max-mbps, max-smbps, max-fs et al
// TODO: Section 6.2: MUST NOT include sprop-parameter-sets
// TODO: Section 6.2: MUST support SEI "filler payload"
// TODO: Section 6.2: MUST support SEI "full frame freeze"
// TODO: Section 6.2: MUST be prepared to receive User Data messages
// TODO: Section 6.2: MUST encode and decode square pixels unless signaled
</script>
