commit f3c88f78b20ca3d4226533b497504bec6a02016e parent 1248ecb2efb7404d22f1c8c3a193426f2f88b631 Author: Jan-Ivar Bruaroey <jib@mozilla.com> Date: Tue, 21 Oct 2025 20:02:34 +0000 Bug 1993997 - Test RTCEncodedVideoFrame & RTCEncodedAudioFrame in webrtc-encoded-transform/idlharness. r=bwc Differential Revision: https://phabricator.services.mozilla.com/D268396 Diffstat:
4 files changed, 40 insertions(+), 27 deletions(-)
diff --git a/testing/web-platform/tests/webrtc-encoded-transform/helper.js b/testing/web-platform/tests/webrtc-encoded-transform/helper.js @@ -1,26 +1,33 @@ -"use strict"; +'use strict'; -async function setupLoopbackWithCodecAndGetReader(t, codec) { - const caller = new RTCPeerConnection({encodedInsertableStreams:true}); - t.add_cleanup(() => caller.close()); - const callee = new RTCPeerConnection(); - t.add_cleanup(() => callee.close()); +// Returns an RTCEncodedVideoFrame or RTCEncodedAudioFrame +// on main thread. Spins up a peer connection and worker. +// Relies on serialization being implemented. - await setMediaPermission("granted", ["camera"]); - const stream = await navigator.mediaDevices.getUserMedia({video:true}); - const videoTrack = stream.getVideoTracks()[0]; - t.add_cleanup(() => videoTrack.stop()); - - const transceiver = caller.addTransceiver(videoTrack); - const codecCapability = - RTCRtpSender.getCapabilities('video').codecs.find(capability => { - return capability.mimeType.includes(codec); - }); - assert_not_equals(codecCapability, undefined); - transceiver.setCodecPreferences([codecCapability]); - - const senderStreams = transceiver.sender.createEncodedStreams(); - exchangeIceCandidates(caller, callee); - await exchangeOfferAnswer(caller, callee); - return senderStreams.readable.getReader(); +async function createRTCEncodedFrameFromScratch(kind) { + function work() { + onrtctransform = async ({transformer: {readable}}) => { + try { + const reader = readable.getReader(); + const {value, done} = await reader.read(); + if (done) throw {name: "done"}; + self.postMessage(value, {transfer: [value.data]}); + } catch (e) { + self.postMessage(e.name); + } + } + } + const worker = new Worker(`data:text/javascript,(${work.toString()})()`); + const pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection(); + pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate); + pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate); + pc1.onnegotiationneeded = async () => { + await pc1.setLocalDescription(); await pc2.setRemoteDescription(pc1.localDescription); + await pc2.setLocalDescription(); await pc1.setRemoteDescription(pc2.localDescription); + } + const stream = await getNoiseStream({[kind]: true}); + const sender = pc1.addTrack(stream.getTracks()[0], stream); + sender.transform = new RTCRtpScriptTransform(worker); + const {data} = await new Promise(r => worker.onmessage = r); + return data; } diff --git a/testing/web-platform/tests/webrtc-encoded-transform/idlharness.https.window.js b/testing/web-platform/tests/webrtc-encoded-transform/idlharness.https.window.js @@ -3,19 +3,25 @@ // META: script=/common/subset-tests-by-key.js // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js -// META: script=./RTCPeerConnection-helper.js +// META: script=../webrtc/RTCPeerConnection-helper.js +// META: script=helper.js +// META: timeout=long 'use strict'; +const idlTestObjects = {}; + idl_test( ['webrtc-encoded-transform'], ['webrtc', 'streams', 'html', 'dom'], async idlArray => { idlArray.add_objects({ - // TODO: RTCEncodedVideoFrame - // TODO: RTCEncodedAudioFrame RTCRtpSender: [`new RTCPeerConnection().addTransceiver('audio').sender`], RTCRtpReceiver: [`new RTCPeerConnection().addTransceiver('audio').receiver`], + RTCEncodedVideoFrame: [`idlTestObjects.videoFrame`], + RTCEncodedAudioFrame: [`idlTestObjects.audioFrame`], }); + idlTestObjects.videoFrame = await createRTCEncodedFrameFromScratch("video"); + idlTestObjects.audioFrame = await createRTCEncodedFrameFromScratch("audio"); } ); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html b/testing/web-platform/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html @@ -6,7 +6,7 @@ <script src='../../mediacapture-streams/permission-helper.js'></script> <script src="../../webrtc/RTCPeerConnection-helper.js"></script> <script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script> -<script src='./../helper.js'></script> +<script src='helper.js'></script> <script> "use strict"; diff --git a/testing/web-platform/tests/webrtc-encoded-transform/helper.js b/testing/web-platform/tests/webrtc-encoded-transform/tentative/helper.js