<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection Insertable Streams - Video Frames</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../webrtc/RTCPeerConnection-helper.js"></script>
<script src="./RTCPeerConnection-insertable-streams.js"></script>
</head>
<body>
<script>
promise_test(async t => {
  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
  t.add_cleanup(() => caller.close());
  const callee = new RTCPeerConnection({encodedInsertableStreams:true});
  t.add_cleanup(() => callee.close());

  const stream = await navigator.mediaDevices.getUserMedia({video:true});
  const track = stream.getTracks()[0];
  t.add_cleanup(() => track.stop());

  const sender = caller.addTrack(track)
  const senderStreams = sender.createEncodedStreams();
  const senderReader = senderStreams.readable.getReader();
  const senderWriter = senderStreams.writable.getWriter();
  const numFramesToSend = 20;

  const ontrackPromise = new Promise((resolve, reject) => {
    callee.ontrack = async e => {
      const receiverStreams = e.receiver.createEncodedStreams();
      const receiverReader = receiverStreams.readable.getReader();

      let numReceivedKeyFrames = 0;
      let numReceivedDeltaFrames = 0;
      for (let i = 0; i < numFramesToSend; i++) {
        const result = await receiverReader.read();
        if (result.value.type == 'key')
          numReceivedKeyFrames++;
        else if (result.value.type == 'delta')
          numReceivedDeltaFrames++;

        if (numReceivedKeyFrames > 0 && numReceivedDeltaFrames > 0)
          resolve();
        else if (numReceivedKeyFrames + numReceivedDeltaFrames >= numFramesToSend)
          reject();
      }
    }
  });

  exchangeIceCandidates(caller, callee);
  await exchangeOfferAnswer(caller, callee);

  let numSentKeyFrames = 0;
  let numSentDeltaFrames = 0;
  // Pass frames as they come from the encoder.
  for (let i = 0; i < numFramesToSend; i++) {
    const result = await senderReader.read();
    verifyNonstandardAdditionalDataIfPresent(result.value);
    if (result.value.type == 'key') {
      numSentKeyFrames++;
    } else {
      numSentDeltaFrames++;
    }

    senderWriter.write(result.value);
  }

  assert_greater_than(numSentKeyFrames, 0);
  assert_greater_than(numSentDeltaFrames, 0);

  return ontrackPromise;
}, 'Key and Delta frames are sent and received');

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