| 'use strict'; |
| |
| // Test is based on the following editor draft: |
| // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html |
| |
| // Helper function for testing RTCRtpParameters dictionary fields |
| |
| // This file depends on dictionary-helper.js which should |
| // be loaded from the main HTML file. |
| |
| // An offer/answer exchange is necessary for getParameters() to have any |
| // negotiated parameters to return. |
| async function doOfferAnswerExchange(t, caller) { |
| const callee = new RTCPeerConnection(); |
| t.add_cleanup(() => callee.close()); |
| const offer = await caller.createOffer(); |
| await caller.setLocalDescription(offer); |
| await callee.setRemoteDescription(offer); |
| const answer = await callee.createAnswer(); |
| await callee.setLocalDescription(answer); |
| await caller.setRemoteDescription(answer); |
| |
| return callee; |
| } |
| |
| /* |
| Validates the RTCRtpParameters returned from RTCRtpSender.prototype.getParameters |
| |
| 5.2. RTCRtpSender Interface |
| getParameters |
| - transactionId is set to a new unique identifier, used to match this getParameters |
| call to a setParameters call that may occur later. |
| |
| - encodings is set to the value of the [[SendEncodings]] internal slot. |
| |
| - The headerExtensions sequence is populated based on the header extensions that |
| have been negotiated for sending. |
| |
| - The codecs sequence is populated based on the codecs that have been negotiated |
| for sending, and which the user agent is currently capable of sending. If |
| setParameters has removed or reordered codecs, getParameters MUST return the |
| shortened/reordered list. However, every time codecs are renegotiated by a |
| new offer/answer exchange, the list of codecs MUST be restored to the full |
| negotiated set, in the priority order indicated by the remote description, |
| in effect discarding the effects of setParameters. |
| |
| - rtcp.cname is set to the CNAME of the associated RTCPeerConnection. rtcp.reducedSize |
| is set to true if reduced-size RTCP has been negotiated for sending, and false otherwise. |
| |
| - degradationPreference is set to the last value passed into setParameters, or the |
| default value of "balanced" if setParameters hasn't been called. |
| */ |
| function validateSenderRtpParameters(param) { |
| validateRtpParameters(param); |
| |
| assert_not_equals(param.transactionId, undefined, |
| 'Expect sender param.transactionId to be set'); |
| |
| assert_not_equals(param.rtcp.cname, undefined, |
| 'Expect sender param.rtcp.cname to be set'); |
| |
| assert_not_equals(param.rtcp.reducedSize, undefined, |
| 'Expect sender param.rtcp.reducedSize to be set to either true or false'); |
| } |
| |
| /* |
| Validates the RTCRtpParameters returned from RTCRtpReceiver.prototype.getParameters |
| |
| 5.3. RTCRtpReceiver Interface |
| getParameters |
| When getParameters is called, the RTCRtpParameters dictionary is constructed |
| as follows: |
| |
| - The headerExtensions sequence is populated based on the header extensions that |
| the receiver is currently prepared to receive. |
| |
| - The codecs sequence is populated based on the codecs that the receiver is currently |
| prepared to receive. |
| |
| - rtcp.reducedSize is set to true if the receiver is currently prepared to receive |
| reduced-size RTCP packets, and false otherwise. rtcp.cname is left undefined. |
| |
| - transactionId and degradationPreference are left undefined. |
| */ |
| function validateReceiverRtpParameters(param) { |
| validateRtpParameters(param); |
| |
| assert_equals(param.transactionId, undefined, |
| 'Expect receiver param.transactionId to be unset'); |
| |
| assert_not_equals(param.rtcp.reducedSize, undefined, |
| 'Expect receiver param.rtcp.reducedSize to be set'); |
| |
| assert_equals(param.rtcp.cname, undefined, |
| 'Expect receiver param.rtcp.cname to be unset'); |
| |
| assert_equals(param.degradationPreference, undefined, |
| 'Expect receiver param.degradationPreference to be unset'); |
| } |
| |
| /* |
| dictionary RTCRtpParameters { |
| DOMString transactionId; |
| sequence<RTCRtpEncodingParameters> encodings; |
| sequence<RTCRtpHeaderExtensionParameters> headerExtensions; |
| RTCRtcpParameters rtcp; |
| sequence<RTCRtpCodecParameters> codecs; |
| RTCDegradationPreference degradationPreference; |
| }; |
| |
| enum RTCDegradationPreference { |
| "maintain-framerate", |
| "maintain-resolution", |
| "balanced" |
| }; |
| */ |
| function validateRtpParameters(param) { |
| assert_optional_string_field(param, 'transactionId'); |
| |
| assert_array_field(param, 'encodings'); |
| for(const encoding of param.encodings) { |
| validateEncodingParameters(encoding); |
| } |
| |
| assert_array_field(param, 'headerExtensions'); |
| for(const headerExt of param.headerExtensions) { |
| validateHeaderExtensionParameters(headerExt); |
| } |
| |
| assert_dict_field(param, 'rtcp'); |
| validateRtcpParameters(param.rtcp); |
| |
| assert_array_field(param, 'codecs'); |
| for(const codec of param.codecs) { |
| validateCodecParameters(codec); |
| } |
| |
| assert_optional_enum_field(param, 'degradationPreference', |
| ['maintain-framerate', 'maintain-resolution', 'balanced']); |
| } |
| |
| /* |
| dictionary RTCRtpEncodingParameters { |
| RTCDtxStatus dtx; |
| boolean active; |
| RTCPriorityType priority; |
| RTCPriorityType networkPriority; |
| unsigned long ptime; |
| unsigned long maxBitrate; |
| double maxFramerate; |
| |
| [readonly] |
| DOMString rid; |
| |
| double scaleResolutionDownBy; |
| }; |
| |
| enum RTCDtxStatus { |
| "disabled", |
| "enabled" |
| }; |
| |
| enum RTCPriorityType { |
| "very-low", |
| "low", |
| "medium", |
| "high" |
| }; |
| */ |
| function validateEncodingParameters(encoding) { |
| assert_optional_enum_field(encoding, 'dtx', |
| ['disabled', 'enabled']); |
| |
| assert_optional_boolean_field(encoding, 'active'); |
| assert_optional_enum_field(encoding, 'priority', |
| ['very-low', 'low', 'medium', 'high']); |
| assert_optional_enum_field(encoding, 'networkPriority', |
| ['very-low', 'low', 'medium', 'high']); |
| |
| assert_optional_unsigned_int_field(encoding, 'ptime'); |
| assert_optional_unsigned_int_field(encoding, 'maxBitrate'); |
| assert_optional_number_field(encoding, 'maxFramerate'); |
| |
| assert_optional_string_field(encoding, 'rid'); |
| assert_optional_number_field(encoding, 'scaleResolutionDownBy'); |
| } |
| |
| /* |
| dictionary RTCRtcpParameters { |
| [readonly] |
| DOMString cname; |
| |
| [readonly] |
| boolean reducedSize; |
| }; |
| */ |
| function validateRtcpParameters(rtcp) { |
| assert_optional_string_field(rtcp, 'cname'); |
| assert_optional_boolean_field(rtcp, 'reducedSize'); |
| } |
| |
| /* |
| dictionary RTCRtpHeaderExtensionParameters { |
| [readonly] |
| DOMString uri; |
| |
| [readonly] |
| unsigned short id; |
| |
| [readonly] |
| boolean encrypted; |
| }; |
| */ |
| function validateHeaderExtensionParameters(headerExt) { |
| assert_optional_string_field(headerExt, 'uri'); |
| assert_optional_unsigned_int_field(headerExt, 'id'); |
| assert_optional_boolean_field(headerExt, 'encrypted'); |
| } |
| |
| /* |
| dictionary RTCRtpCodecParameters { |
| [readonly] |
| unsigned short payloadType; |
| |
| [readonly] |
| DOMString mimeType; |
| |
| [readonly] |
| unsigned long clockRate; |
| |
| [readonly] |
| unsigned short channels; |
| |
| [readonly] |
| DOMString sdpFmtpLine; |
| }; |
| */ |
| function validateCodecParameters(codec) { |
| assert_optional_unsigned_int_field(codec, 'payloadType'); |
| assert_optional_string_field(codec, 'mimeType'); |
| assert_optional_unsigned_int_field(codec, 'clockRate'); |
| assert_optional_unsigned_int_field(codec, 'channels'); |
| assert_optional_string_field(codec, 'sdpFmtpLine'); |
| } |