Files
sousa-gecko/testing/web-platform/tests/webrtc/protocol/h265-loopback.https.html
T
Rune Lillesveen d9eb8552ed Bug 1955022 [wpt PR 51449] - Support complex CSS pow() parameters, a=testonly
Automatic update from web-platform-tests
Support complex CSS pow() parameters

Parameters may not be possible to simplify at parse time. Support
representing pow() parameters as complex expression to be evaluated as
computed value time.

Bug: 404174133
Change-Id: I8e974882fb08cfd25a3f2ab0bb9c92582d948a42
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6368381
Reviewed-by: Daniil Sakhapov <sakhapov@chromium.org>
Commit-Queue: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1434770}

--

wpt-commits: 8ba10db942eeafa368b94e4a25312172abc6b80e
wpt-pr: 51449
2025-03-23 08:12:23 +00:00

77 lines
2.7 KiB
HTML

<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../RTCPeerConnection-helper.js"></script>
<script>
'use strict';
async function pollGetStatsUntil(t, pc, condition, pollingMs = 100) {
while (true) {
const report = await pc.getStats();
for (const stats of report.values()) {
if (condition(report, stats) == true) {
// Condition satisfied, stop polling.
return;
}
}
await new Promise(r => t.step_timeout(r, pollingMs));
}
}
function isRtpWithCodec(report, stats, mimeType) {
if (stats.type != 'outbound-rtp' && stats.type != 'inbound-rtp') {
return false; // Not an RTP stats object.
}
const codec = report.get(stats.codecId);
return codec && codec.mimeType == mimeType;
}
promise_test(async t => {
const sendCodec = RTCRtpSender.getCapabilities('video').codecs.find(
codec => codec.mimeType == 'video/H265');
const recvCodec = RTCRtpReceiver.getCapabilities('video').codecs.find(
codec => codec.mimeType == 'video/H265');
assert_implements_optional(
sendCodec != undefined && recvCodec != undefined,
'H265 not available for sending or receiving. Loopback requires both.');
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate);
const stream = await getNoiseStream({video:{width:640, height:360}});
const [track] = stream.getVideoTracks();
t.add_cleanup(() => track.stop());
// Negotiate H265.
const transceiver = pc1.addTransceiver(track);
transceiver.setCodecPreferences([sendCodec]);
await pc1.setLocalDescription();
await pc2.setRemoteDescription(pc1.localDescription);
await pc2.setLocalDescription();
await pc1.setRemoteDescription(pc2.localDescription);
// Wait for H265 frames to be encoded and sent.
await pollGetStatsUntil(t, pc1, (report, stats) => {
if (!isRtpWithCodec(report, stats, 'video/H265')) {
return false;
}
assert_equals(stats.type, 'outbound-rtp');
return stats.framesEncoded > 0 && stats.framesSent > 0;
});
// Wait for H265 frames to be received and decoded.
await pollGetStatsUntil(t, pc2, (report, stats) => {
if (!isRtpWithCodec(report, stats, 'video/H265')) {
return false;
}
assert_equals(stats.type, 'inbound-rtp');
return stats.framesReceived > 0 && stats.framesDecoded > 0;
});
}, `Negotiate H265 loopback and verify frames are flowing`);
</script>