| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCRtpTransceiver.prototype.setCodecPreferences</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| 'use strict'; |
| |
| // Test is based on the following editor draft: |
| // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html |
| |
| /* |
| 5.4. RTCRtpTransceiver Interface |
| interface RTCRtpTransceiver { |
| ... |
| void setCodecPreferences(sequence<RTCRtpCodecCapability> codecs); |
| }; |
| |
| setCodecPreferences |
| - Setting codecs to an empty sequence resets codec preferences to any |
| default value. |
| |
| - The codecs sequence passed into setCodecPreferences can only contain |
| codecs that are returned by RTCRtpSender.getCapabilities(kind) or |
| RTCRtpReceiver.getCapabilities(kind), where kind is the kind of the |
| RTCRtpTransceiver on which the method is called. Additionally, the |
| RTCRtpCodecParameters dictionary members cannot be modified. If |
| codecs does not fulfill these requirements, the user agent MUST throw |
| an InvalidAccessError. |
| */ |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities = RTCRtpSender.getCapabilities('audio'); |
| transceiver.setCodecPreferences(capabilities.codecs); |
| |
| }, `setCodecPreferences() on audio transceiver with codecs returned from RTCRtpSender.getCapabilities('audio') should succeed`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('video'); |
| const capabilities = RTCRtpReceiver.getCapabilities('video'); |
| transceiver.setCodecPreferences(capabilities.codecs); |
| |
| }, `setCodecPreferences() on video transceiver with codecs returned from RTCRtpReceiver.getCapabilities('video') should succeed`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities1 = RTCRtpSender.getCapabilities('audio'); |
| const capabilities2 = RTCRtpReceiver.getCapabilities('audio'); |
| transceiver.setCodecPreferences([...capabilities1.codecs, ... capabilities2.codecs]); |
| |
| }, `setCodecPreferences() with both sender receiver codecs combined should succeed`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| transceiver.setCodecPreferences([]); |
| |
| }, `setCodecPreferences([]) should succeed`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities = RTCRtpSender.getCapabilities('audio'); |
| const { codecs } = capabilities; |
| |
| if(codecs.length >= 2) { |
| const tmp = codecs[0]; |
| codecs[0] = codecs[1]; |
| codecs[1] = tmp; |
| } |
| |
| transceiver.setCodecPreferences(codecs); |
| |
| }, `setCodecPreferences() with reordered codecs should succeed`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities = RTCRtpSender.getCapabilities('video'); |
| assert_throws(() => transceiver.setCodecPreferences(capabilities.codecs)); |
| |
| }, `setCodecPreferences() on audio transceiver with codecs returned from getCapabilities('video') should throw InvalidAccessError`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const codecs = [{ |
| mimeType: 'audio/piepiper', |
| clockRate: 2000, |
| channels: 2, |
| sdpFmtpLine: 'a=fmtp:98 0-15' |
| }]; |
| |
| assert_throws(() => transceiver.setCodecPreferences(codecs)); |
| |
| }, `setCodecPreferences() with user defined codec should throw InvalidAccessError`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities = RTCRtpSender.getCapabilities('audio'); |
| const codecs = [ |
| ...capabilities.codecs, |
| { |
| mimeType: 'audio/piepiper', |
| clockRate: 2000, |
| channels: 2, |
| sdpFmtpLine: 'a=fmtp:98 0-15' |
| }]; |
| |
| assert_throws(() => transceiver.setCodecPreferences(codecs)); |
| |
| }, `setCodecPreferences() with user defined codec together with codecs returned from getCapabilities() should throw InvalidAccessError`); |
| |
| test(() => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| const capabilities = RTCRtpSender.getCapabilities('audio'); |
| |
| const { codecs } = capabilities; |
| assert_greater_than(codecs.length, 0, |
| 'Expect at least one codec available'); |
| |
| const [ codec ] = codecs; |
| const { channels=2 } = codec; |
| codec.channels = channels+1; |
| |
| assert_throws(() => transceiver.setCodecPreferences(codecs)); |
| |
| }, `setCodecPreferences() with modified codecs returned from getCapabilities() should throw InvalidAccessError`); |
| |
| </script> |