mirror of
https://github.com/servo/servo.git
synced 2025-10-04 02:29:12 +01:00
Update web-platform-tests to revision 81962ac8802223d038b188b6f9cb88a0a9c5beee
This commit is contained in:
parent
fe1a057bd1
commit
24183668c4
1960 changed files with 29853 additions and 10555 deletions
|
@ -148,7 +148,7 @@
|
|||
|
||||
7. Set the object's toneBuffer attribute to tones.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
return createDtmfSender()
|
||||
.then(dtmfSender => {
|
||||
dtmfSender.insertDTMF('123');
|
||||
|
|
|
@ -118,7 +118,7 @@
|
|||
validateCandidateParameter(iceTransport.getRemoteParameters());
|
||||
}
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
@ -163,7 +163,7 @@
|
|||
});
|
||||
}, 'Two connected iceTransports should has matching local/remote candidates returned');
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
pc1.createDataChannel('');
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>RTCPeerConnection addTrack does not deadlock</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
// This test sets up two peer connections using a sequence of operations
|
||||
// that triggered a deadlock in Chrome. See https://crbug.com/736725.
|
||||
// If a deadlock is introduced again, this test times out.
|
||||
promise_test(async t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const stream = await navigator.mediaDevices.getUserMedia(
|
||||
{audio: false, video: true});
|
||||
const videoTrack = stream.getVideoTracks()[0];
|
||||
t.add_cleanup(() => videoTrack.stop());
|
||||
pc1.addTrack(videoTrack, stream);
|
||||
const offer = await pc1.createOffer();
|
||||
await pc1.setLocalDescription(offer);
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
const srdPromise = pc2.setRemoteDescription(offer);
|
||||
pc2.addTrack(videoTrack, stream);
|
||||
// The deadlock encountered in https://crbug.com/736725 occured here.
|
||||
await srdPromise;
|
||||
await pc2.createAnswer();
|
||||
}, 'RTCPeerConnection addTrack does not deadlock.');
|
||||
</script>
|
|
@ -35,7 +35,7 @@
|
|||
assert_equals(pc.canTrickleIceCandidates, null, 'canTrickleIceCandidates property is null');
|
||||
}, 'canTrickleIceCandidates property is null prior to setRemoteDescription');
|
||||
|
||||
promise_test(function() {
|
||||
promise_test(function(t) {
|
||||
var pc = new RTCPeerConnection();
|
||||
|
||||
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp}))
|
||||
|
@ -44,7 +44,7 @@
|
|||
})
|
||||
}, 'canTrickleIceCandidates property is true after setRemoteDescription with a=ice-options:trickle');
|
||||
|
||||
promise_test(function() {
|
||||
promise_test(function(t) {
|
||||
var pc = new RTCPeerConnection();
|
||||
|
||||
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.replace('a=ice-options:trickle\r\n', '')}))
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
DOMString peerIdentity;
|
||||
};
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const port = window.location.port;
|
||||
|
||||
|
@ -95,7 +95,7 @@
|
|||
|
||||
// When generating assertion, the RTCPeerConnection doesn't care if the returned assertion
|
||||
// represents identity of different domain
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const port = window.location.port;
|
||||
|
||||
|
@ -217,7 +217,7 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
pc.setIdentityProvider('nonexistent-origin.web-platform.test', {
|
||||
pc.setIdentityProvider('nonexistent.web-platform.test', {
|
||||
protocol: `non-existent`,
|
||||
usernameHint: `alice@example.org`,
|
||||
});
|
||||
|
@ -278,7 +278,7 @@
|
|||
value is provided for the peerIdentity member of RTCConfiguration, the value from
|
||||
RTCConfiguration is used.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection({
|
||||
peerIdentity: 'bob@example.net'
|
||||
});
|
||||
|
@ -302,7 +302,7 @@
|
|||
9.6. setIdentityProvider
|
||||
3. If any identity provider value has changed, discard any stored identity assertion.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const port = window.location.port;
|
||||
const [idpDomain] = getIdpDomains();
|
||||
|
|
|
@ -39,12 +39,12 @@
|
|||
1. Gather the stats indicated by selector according to the stats selection algorithm.
|
||||
2. Resolve p with the resulting RTCStatsReport object, containing the gathered stats.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
return pc.getStats();
|
||||
}, 'getStats() with no argument should succeed');
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
return pc.getStats(null);
|
||||
}, 'getStats(null) should succeed');
|
||||
|
@ -160,7 +160,7 @@
|
|||
- All stats objects referenced directly or indirectly by the RTCOutboundRTPStreamStats
|
||||
objects added.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
|
@ -183,7 +183,7 @@
|
|||
- All stats objects referenced directly or indirectly by the RTCInboundRTPStreamStats
|
||||
added.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
is, there is a current value for peerIdentity ), then this also establishes a
|
||||
target peer identity.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
2. Set transceiver's mid value to the mid of the corresponding media
|
||||
description.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver.mid, null);
|
||||
|
@ -97,7 +97,7 @@
|
|||
transceiver be the result.
|
||||
3. Set transceiver's mid value to the mid of the corresponding media description.
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
@ -109,7 +109,7 @@
|
|||
.then(offer => {
|
||||
return Promise.all([
|
||||
pc1.setLocalDescription(offer),
|
||||
pc2.setRemoteDescrption(offer)
|
||||
pc2.setRemoteDescription(offer)
|
||||
])
|
||||
.then(() => {
|
||||
const transceivers = pc2.getTransceivers();
|
||||
|
@ -137,7 +137,7 @@
|
|||
the RTCSessionDescription that is being rolled back, set the mid value
|
||||
of that transceiver to null, as described by [JSEP] (section 4.1.8.2.).
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver.mid, null);
|
||||
|
@ -157,7 +157,7 @@
|
|||
});
|
||||
}, 'setLocalDescription(rollback) should unset transceiver.mid');
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const transceiver1 = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver1.mid, null);
|
||||
|
@ -202,7 +202,7 @@
|
|||
addTrack, remove that transceiver from connection's set of transceivers,
|
||||
as described by [JSEP] (section 4.1.8.2.).
|
||||
*/
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
|
|
@ -11,11 +11,8 @@
|
|||
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
|
||||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// generateOffer()
|
||||
// generateAnswer()
|
||||
// assert_session_desc_not_equals()
|
||||
// assert_session_desc_equals()
|
||||
// test_state_change_event()
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -48,76 +45,101 @@
|
|||
/*
|
||||
4.6.1. enum RTCSdpType
|
||||
*/
|
||||
promise_test(t => {
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
// SDP is validated after WebIDL validation
|
||||
return promise_rejects(t, new TypeError(),
|
||||
pc.setRemoteDescription({
|
||||
type: 'bogus',
|
||||
sdp: 'bogus'
|
||||
}));
|
||||
try {
|
||||
await pc.setRemoteDescription({ type: 'bogus', sdp: 'bogus' });
|
||||
t.unreached_func("Should have rejected.");
|
||||
} catch (e) {
|
||||
assert_throws(new TypeError(), () => { throw e });
|
||||
}
|
||||
}, 'setRemoteDescription with invalid type and invalid SDP should reject with TypeError');
|
||||
|
||||
promise_test(t => {
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
// SDP is validated after validating type
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
pc.setRemoteDescription({
|
||||
type: 'answer',
|
||||
sdp: 'invalid'
|
||||
}));
|
||||
try {
|
||||
await pc.setRemoteDescription({ type: 'answer', sdp: 'invalid' });
|
||||
t.unreached_func("Should have rejected.");
|
||||
} catch (e) {
|
||||
assert_throws('InvalidStateError', () => { throw e });
|
||||
}
|
||||
}, 'setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError');
|
||||
|
||||
/* Dedicated signalingstate events test. */
|
||||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
let eventCount = 0;
|
||||
const states = [
|
||||
'stable', 'have-local-offer', 'stable', 'have-remote-offer', 'closed'
|
||||
];
|
||||
pc.onsignalingstatechange = () =>
|
||||
assert_equals(pc.signalingState, states[++eventCount]);
|
||||
|
||||
const assert_state = state => {
|
||||
assert_equals(state, pc.signalingState);
|
||||
assert_equals(state, states[eventCount]);
|
||||
};
|
||||
|
||||
const offer = await pc.createOffer({ offerToReceiveAudio: true });
|
||||
assert_state('stable');
|
||||
await pc.setLocalDescription(offer);
|
||||
assert_state('have-local-offer');
|
||||
await pc2.setRemoteDescription(offer);
|
||||
await pc2.setLocalDescription(await pc2.createAnswer());
|
||||
await pc.setRemoteDescription(pc2.localDescription);
|
||||
assert_state('stable');
|
||||
await pc.setRemoteDescription(await pc2.createOffer());
|
||||
assert_state('have-remote-offer');
|
||||
pc.close();
|
||||
assert_state('closed');
|
||||
}, 'Negotiation should fire signalingsstate events');
|
||||
|
||||
/* Operations after returning to stable state */
|
||||
|
||||
promise_test(t => {
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
test_state_change_event(t, pc,
|
||||
['have-remote-offer', 'stable', 'have-remote-offer']);
|
||||
|
||||
return pc2.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer1 =>
|
||||
pc.setRemoteDescription(offer1)
|
||||
.then(() => pc.createAnswer())
|
||||
.then(answer => pc.setLocalDescription(answer))
|
||||
.then(() => pc2.createOffer({ offerToReceiveVideo: true }))
|
||||
.then(offer2 => {
|
||||
return pc.setRemoteDescription(offer2)
|
||||
.then(() => {
|
||||
assert_equals(pc.signalingState, 'have-remote-offer');
|
||||
assert_session_desc_not_equals(offer1, offer2);
|
||||
assert_session_desc_equals(pc.remoteDescription, offer2);
|
||||
assert_session_desc_equals(pc.currentRemoteDescription, offer1);
|
||||
assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
|
||||
});
|
||||
}));
|
||||
const offer1 = await pc2.createOffer({ offerToReceiveAudio: true });
|
||||
await pc.setRemoteDescription(offer1);
|
||||
await pc.setLocalDescription(await pc.createAnswer());
|
||||
const offer2 = await pc2.createOffer({ offerToReceiveVideo: true });
|
||||
await pc.setRemoteDescription(offer2);
|
||||
assert_session_desc_not_equals(offer1, offer2);
|
||||
assert_session_desc_equals(pc.remoteDescription, offer2);
|
||||
assert_session_desc_equals(pc.currentRemoteDescription, offer1);
|
||||
assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
|
||||
}, 'Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
test_state_change_event(t, pc,
|
||||
['have-local-offer', 'stable', 'have-remote-offer']);
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer =>
|
||||
pc.setLocalDescription(offer)
|
||||
.then(() => generateAnswer(offer)))
|
||||
.then(answer =>
|
||||
pc.setRemoteDescription(answer)
|
||||
.then(() => generateOffer({ pc, data: true }))
|
||||
.then(offer =>
|
||||
pc.setRemoteDescription(offer)
|
||||
.then(() => {
|
||||
assert_equals(pc.signalingState, 'have-remote-offer');
|
||||
assert_session_desc_equals(pc.remoteDescription, offer);
|
||||
assert_session_desc_equals(pc.currentRemoteDescription, answer);
|
||||
assert_session_desc_equals(pc.pendingRemoteDescription, offer);
|
||||
})));
|
||||
const offer = await pc.createOffer({ offerToReceiveAudio: true });
|
||||
await pc.setLocalDescription(offer);
|
||||
await pc2.setRemoteDescription(offer);
|
||||
const answer = await pc2.createAnswer();
|
||||
await pc2.setLocalDescription(answer);
|
||||
await pc.setRemoteDescription(answer);
|
||||
await pc.setRemoteDescription(await pc2.createOffer());
|
||||
assert_equals(pc.remoteDescription.sdp, pc.pendingRemoteDescription.sdp);
|
||||
assert_session_desc_equals(pc.remoteDescription, offer);
|
||||
assert_session_desc_equals(pc.currentRemoteDescription, answer);
|
||||
}, 'Switching role from offerer to answerer after going back to stable state should succeed');
|
||||
|
||||
/*
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
possibly encode, and 127 represents silence.
|
||||
*/
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
added.
|
||||
*/
|
||||
|
||||
promise_test(async () => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
const callee = new RTCPeerConnection();
|
||||
const { receiver } = caller.addTransceiver('audio');
|
||||
|
@ -55,7 +55,7 @@
|
|||
assert_stats_report_has_stats(statsReport, ['inbound-rtp']);
|
||||
}, 'receiver.getStats() via addTransceiver should return stats report containing inbound-rtp stats');
|
||||
|
||||
promise_test(async () => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
const callee = new RTCPeerConnection();
|
||||
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
};
|
||||
*/
|
||||
|
||||
promise_test(() => {
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
objects added.
|
||||
*/
|
||||
|
||||
promise_test(async () => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
const callee = new RTCPeerConnection();
|
||||
const { sender } = caller.addTransceiver('audio');
|
||||
|
@ -50,7 +50,7 @@
|
|||
assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
|
||||
}, 'sender.getStats() via addTransceiver should return stats report containing outbound-rtp stats');
|
||||
|
||||
promise_test(async () => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
const callee = new RTCPeerConnection();
|
||||
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
127.0.0.1 www2.web-platform.test
|
||||
127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
|
||||
127.0.0.1 xn--lve-6lad.web-platform.test
|
||||
0.0.0.0 nonexistent-origin.web-platform.test
|
||||
0.0.0.0 nonexistent.web-platform.test
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
21
tests/wpt/web-platform-tests/webrtc/protocol/README.txt
Normal file
21
tests/wpt/web-platform-tests/webrtc/protocol/README.txt
Normal file
|
@ -0,0 +1,21 @@
|
|||
This directory contains files that test for behavior relevant to webrtc,
|
||||
but which is specified in protocol specifications from the IETF, not in
|
||||
API recommendations from the W3C.
|
||||
|
||||
The main specifications are given in the following internet-drafts:
|
||||
|
||||
- draft-ietf-rtcweb-overview
|
||||
- draft-ietf-rtcweb-transports
|
||||
- draft-ietf-rtcweb-security-arch
|
||||
- draft-ietf-rtcweb-security
|
||||
- draft-ietf-rtcweb-rtp-usage
|
||||
- draft-ietf-rtcweb-jsep
|
||||
- draft-ietf-rtcweb-ip-handling
|
||||
- draft-ietf-rtcweb-fec
|
||||
- draft-ietf-rtcweb-data-protocol
|
||||
- draft-ietf-rtcweb-data-channel
|
||||
|
||||
- RFC 7742, "WebRTC Video Processing and Codec Requirements"
|
||||
- RFC 7874, "WebRTC Audio Codec and Processing Requirements"
|
||||
|
||||
An overview of the dependencies involved is in draft-jennings-rtcweb-deps
|
|
@ -0,0 +1,63 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>RTCPeerConnection.prototype.createOffer</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/webrtc/RTCPeerConnection-helper.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
// Tests for conformance to RFC 7742,
|
||||
// "WebRTC Video Processing and Codec Requirements"
|
||||
// The document was formerly known as draft-ietf-rtcweb-video-codecs.
|
||||
//
|
||||
// This tests that the browser is a WebRTC Browser as defined there.
|
||||
|
||||
// TODO: Section 3.2: screen capture video MUST be prepared
|
||||
// to handle resolution changes.
|
||||
|
||||
// TODO: Section 4: MUST support generating CVO (orientation)
|
||||
|
||||
// Section 5: Browsers MUST implement VP8 and H.264 Constrained Baseline
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const offer = await pc.createOffer({offerToReceiveVideo: true});
|
||||
let video_section_found = false;
|
||||
for (let section of offer.sdp.split(/\r\nm=/)) {
|
||||
if (section.search('video') != 0) {
|
||||
continue;
|
||||
}
|
||||
video_section_found = true;
|
||||
// RTPMAP lines have the format a=rtpmap:<pt> <codec>/<clock rate>
|
||||
let rtpmap_regex = /\r\na=rtpmap:(\d+) (\S+)\/\d+\r\n/g;
|
||||
let match = rtpmap_regex.exec(offer.sdp);
|
||||
let payload_type_map = new Array();
|
||||
while (match) {
|
||||
payload_type_map[match[1]] = match[2];
|
||||
match = rtpmap_regex.exec(offer.sdp);
|
||||
}
|
||||
assert_true(payload_type_map.indexOf('VP8') > -1,
|
||||
'VP8 is supported');
|
||||
assert_true(payload_type_map.indexOf('H264') > -1,
|
||||
'H.264 is supported');
|
||||
// TODO: Verify that one of the H.264 PTs supports constrained baseline
|
||||
}
|
||||
assert_true(video_section_found);
|
||||
}, 'H.264 and VP8 should be supported in initial offer');
|
||||
|
||||
// TODO: Section 6: Recipients MUST be able to decode 320x240@20 fps
|
||||
// TODO: Section 6.1: VP8 MUST support RFC 7741 payload formats
|
||||
// TODO: Section 6.1: VP8 MUST respect max-fr/max-fs
|
||||
// TODO: Section 6.1: VP8 MUST encode and decode square pixels
|
||||
// TODO: Section 6.2: H.264 MUST support RFC 6184 payload formats
|
||||
// TODO: Section 6.2: MUST support Constrained Baseline level 1.2
|
||||
// TODO: Section 6.2: SHOULD support Constrained High level 1.3
|
||||
// TODO: Section 6.2: MUST support packetization mode 1.
|
||||
// TODO: Section 6.2: MUST include profile-level-id
|
||||
// TODO: Section 6.2: SHOULD interpret max-mbps, max-smbps, max-fs et al
|
||||
// TODO: Section 6.2: MUST NOT include sprop-parameter-sets
|
||||
// TODO: Section 6.2: MUST support SEI "filler payload"
|
||||
// TODO: Section 6.2: MUST support SEI "full frame freeze"
|
||||
// TODO: Section 6.2: MUST be prepared to receive User Data messages
|
||||
// TODO: Section 6.2: MUST encode and decode square pixels unless signaled
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue