blob: a55f766d03778c2eb0627da872d5bd382c006cf2 [file] [log] [blame]
Soares Chen172fe9d2017-07-18 09:30:181<!doctype html>
2<meta charset=utf-8>
3<title>RTCRtpReceiver.prototype.getParameters</title>
4<script src="/resources/testharness.js"></script>
5<script src="/resources/testharnessreport.js"></script>
6<script src="dictionary-helper.js"></script>
Harald Alvestrand4d7ec062024-06-20 14:27:087<script src="RTCPeerConnection-helper.js"></script>
Soares Chen172fe9d2017-07-18 09:30:188<script src="RTCRtpParameters-helper.js"></script>
9<script>
10 'use strict';
11
12 // Test is based on the following editor draft:
13 // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
14
15 // The following helper functions are called from RTCRtpParameters-helper.js:
16 // validateReceiverRtpParameters
17
18 /*
19 Validates the RTCRtpParameters returned from RTCRtpReceiver.prototype.getParameters
20
21 5.3. RTCRtpReceiver Interface
22 getParameters
23 When getParameters is called, the RTCRtpParameters dictionary is constructed
24 as follows:
25
Soares Chen172fe9d2017-07-18 09:30:1826 - The headerExtensions sequence is populated based on the header extensions that
27 the receiver is currently prepared to receive.
28
29 - The codecs sequence is populated based on the codecs that the receiver is currently
30 prepared to receive.
31
32 - rtcp.reducedSize is set to true if the receiver is currently prepared to receive
33 reduced-size RTCP packets, and false otherwise. rtcp.cname is left undefined.
Florent Castelli4f34fd42020-04-01 21:31:4934 */
Florent Castelli5dd605c2018-12-11 14:39:5535 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:1836 const pc = new RTCPeerConnection();
Florent Castelli5dd605c2018-12-11 14:39:5537 t.add_cleanup(() => pc.close());
38 pc.addTransceiver('audio');
39 const callee = await doOfferAnswerExchange(t, pc);
Dominique Hazael-Massieux24221e02020-09-30 14:08:2840 const param = callee.getTransceivers()[0].receiver.getParameters();
Soares Chen172fe9d2017-07-18 09:30:1841 validateReceiverRtpParameters(param);
Florent Castelli5dd605c2018-12-11 14:39:5542
43 assert_greater_than(param.headerExtensions.length, 0);
44 assert_greater_than(param.codecs.length, 0);
Florent Castelli5dd605c2018-12-11 14:39:5545 }, 'getParameters() with audio receiver');
46
47 promise_test(async t => {
48 const pc = new RTCPeerConnection();
49 t.add_cleanup(() => pc.close());
50 pc.addTransceiver('video');
51 const callee = await doOfferAnswerExchange(t, pc);
Dominique Hazael-Massieux24221e02020-09-30 14:08:2852 const param = callee.getTransceivers()[0].receiver.getParameters();
Florent Castelli5dd605c2018-12-11 14:39:5553 validateReceiverRtpParameters(param);
54
55 assert_greater_than(param.headerExtensions.length, 0);
56 assert_greater_than(param.codecs.length, 0);
Florent Castelli5dd605c2018-12-11 14:39:5557 }, 'getParameters() with video receiver');
58
59 promise_test(async t => {
60 const pc = new RTCPeerConnection();
61 t.add_cleanup(() => pc.close());
62 pc.addTransceiver('video', {
63 sendEncodings: [
64 { rid: "rid1" },
65 { rid: "rid2" }
66 ]
67 });
68 const callee = await doOfferAnswerExchange(t, pc);
Dominique Hazael-Massieux24221e02020-09-30 14:08:2869 const param = callee.getTransceivers()[0].receiver.getParameters();
Florent Castelli5dd605c2018-12-11 14:39:5570 validateReceiverRtpParameters(param);
Florent Castelli5dd605c2018-12-11 14:39:5571 assert_greater_than(param.headerExtensions.length, 0);
72 assert_greater_than(param.codecs.length, 0);
Florent Castelli5dd605c2018-12-11 14:39:5573 }, 'getParameters() with simulcast video receiver');
Harald Alvestrand4d7ec062024-06-20 14:27:0874
75 promise_test(async t => {
76 const stream = await getNoiseStream({video: true});
77 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
78 const [track] = stream.getTracks();
79 const caller = new RTCPeerConnection();
80 t.add_cleanup(() => caller.close());
81 caller.addTrack(track);
82 const callee = new RTCPeerConnection();
83 t.add_cleanup(() => callee.close());
84 callee.addTrack(track);
85 var callerReceiver = caller.getTransceivers()[0].receiver;
86 assert_equals(callerReceiver.getParameters().codecs.length, 0);
Harald Alvestranddc35ea72025-06-13 09:12:5087 assert_equals(callerReceiver.getParameters().headerExtensions.length, 0,
88 "no caller header extensions before offer");
Harald Alvestrand4d7ec062024-06-20 14:27:0889 const offer = await caller.createOffer();
90 await caller.setLocalDescription(offer);
91 await callee.setRemoteDescription(offer);
92 var calleeReceiver = callee.getTransceivers()[0].receiver;
Harald Alvestranddc35ea72025-06-13 09:12:5093 // Callee transceiver exists only after offer - population of parameters
94 // should only occur after answer.
95 assert_equals(calleeReceiver.getParameters().headerExtensions.length, 0,
96 "no callee header extensions before answer");
Harald Alvestrand4d7ec062024-06-20 14:27:0897 assert_equals(calleeReceiver.getParameters().codecs.length, 0);
98 const answer = await callee.createAnswer();
99 await callee.setLocalDescription(answer);
100 assert_greater_than(calleeReceiver.getParameters().codecs.length, 0,
101 "callee codecs after answer");
102 await caller.setRemoteDescription(answer);
103 assert_greater_than(callerReceiver.getParameters().codecs.length, 0,
104 "caller codecs after answer");
Harald Alvestranddc35ea72025-06-13 09:12:50105 assert_greater_than(callerReceiver.getParameters().headerExtensions.length, 0,
106 "caller header extensions after O/A");
107 assert_greater_than(calleeReceiver.getParameters().headerExtensions.length, 0,
108 "callee header extensions after O/A");
Harald Alvestrand4d7ec062024-06-20 14:27:08109 }, 'getParameters() surfaces codecs on two-way receiver at the right time');
110
Soares Chen172fe9d2017-07-18 09:30:18111</script>