summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc/protocol/codecs-filtered-by-direction.https.html
blob: ed1d65e4b00f8615046e16cd38b0345836863729 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>RTCPeerConnection Codecs in offer get filtered by direction</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../third_party/sdp/sdp.js"></script>
<script>
'use strict';

function codecEquals(c1, c2) {
  return c1.mimeType === c2.mimeType &&
          c1.sdpFmtpLine === c2.sdpFmtpLine &&
          c1.clockRate === c2.clockRate &&
          c1.channels === c2.channels;
}

function splitCodecs() {
  const sendCodecs = RTCRtpSender.getCapabilities('video').codecs;
  const receiveCodecs = RTCRtpReceiver.getCapabilities('video').codecs;
  const codecs = {
    sendrecv: [],
    sendonly: [],
    recvonly: [],
  };
  // Ignore RTX since it is present in capabilities once and has no apt.
  for (const receiveCodec of receiveCodecs) {
    if (receiveCodec.mimeType === 'video/rtx') continue;
    if (sendCodecs.find(sendCodec => codecEquals(sendCodec, receiveCodec))) {
      codecs.sendrecv.push(receiveCodec);
    }
  }

  for (const sendCodec of sendCodecs) {
    if (sendCodec.mimeType === 'video/rtx') continue;
    if (!receiveCodecs.find(receiveCodec => codecEquals(sendCodec, receiveCodec))) {
      codecs.sendonly.push(sendCodec);
    }
  }
  for (const receiveCodec of receiveCodecs) {
    if (receiveCodec.mimeType === 'video/rtx') continue;
    if (!sendCodecs.find(sendCodec => codecEquals(sendCodec, receiveCodec))) {
      codecs.recvonly.push(receiveCodec);
    }
  }
  return codecs;
}

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());

  const allCodecs = splitCodecs();
  const transceiver = pc.addTransceiver('video');

  transceiver.direction = 'sendonly'
  const offer = await pc.createOffer();
  const mediaSection = SDPUtils.getMediaSections(offer.sdp)[0];
  const rtpParameters = SDPUtils.parseRtpParameters(mediaSection);
  const sendonlyCodecs = rtpParameters.codecs.filter(c => c.name !== 'rtx');
  assert_equals(sendonlyCodecs.length, allCodecs.sendrecv.length + allCodecs.sendonly.length);
}, 'Codecs get filtered by direction for sendonly');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());

  const allCodecs = splitCodecs();
  const transceiver = pc.addTransceiver('video');

  transceiver.direction = 'recvonly'
  const offer = await pc.createOffer();
  const mediaSection = SDPUtils.getMediaSections(offer.sdp)[0];
  const rtpParameters = SDPUtils.parseRtpParameters(mediaSection);
  const recvonlyCodecs = rtpParameters.codecs.filter(c => c.name !== 'rtx');
  assert_equals(recvonlyCodecs.length, allCodecs.sendrecv.length + allCodecs.recvonly.length);
}, 'Codecs get filtered by direction for recvonly');

</script>