| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>RTCPeerConnection Insertable Streams - Worker</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src=/resources/testdriver.js></script> | |
| <script src=/resources/testdriver-vendor.js></script> | |
| <script src='../mediacapture-streams/permission-helper.js'></script> | |
| <script src="../webrtc/RTCPeerConnection-helper.js"></script> | |
| <script src="./RTCPeerConnection-insertable-streams.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| promise_test(async t => { | |
| const caller = new RTCPeerConnection({encodedInsertableStreams:true}); | |
| t.add_cleanup(() => caller.close()); | |
| const callee = new RTCPeerConnection(); | |
| t.add_cleanup(() => callee.close()); | |
| // Video is used in a later test, so we ask for both permissions | |
| await setMediaPermission(); | |
| const stream = await navigator.mediaDevices.getUserMedia({audio:true}); | |
| const track = stream.getTracks()[0]; | |
| t.add_cleanup(() => track.stop()); | |
| const sender = caller.addTrack(track) | |
| const senderStreams = sender.createEncodedStreams(); | |
| const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') | |
| t.add_cleanup(() => senderWorker.terminate()); | |
| senderWorker.postMessage( | |
| {readableStream: senderStreams.readable}, | |
| [senderStreams.readable]); | |
| let expectedFrameData = null; | |
| let verifiedFrameData = false; | |
| let numVerifiedFrames = 0; | |
| const onmessagePromise = new Promise(resolve => { | |
| senderWorker.onmessage = t.step_func(message => { | |
| if (!(message.data instanceof RTCEncodedAudioFrame)) { | |
| // This is the first message sent from the Worker to the test. | |
| // It contains an object (not an RTCEncodedAudioFrame) with the same | |
| // fields as the RTCEncodedAudioFrame to be sent in follow-up messages. | |
| // These serve as expected values to validate that the | |
| // RTCEncodedAudioFrame is sent correctly back to the test in the next | |
| // message. | |
| expectedFrameData = message.data; | |
| } else { | |
| // This is the frame sent by the Worker after reading it from the | |
| // readable stream. The Worker sends it twice after sending the | |
| // verification message. | |
| assert_equals(message.data.type, expectedFrameData.type); | |
| assert_equals(message.data.timestamp, expectedFrameData.timestamp); | |
| assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data)); | |
| if (++numVerifiedFrames == 2) | |
| resolve(); | |
| } | |
| }); | |
| }); | |
| exchangeIceCandidates(caller, callee); | |
| await exchangeOfferAnswer(caller, callee); | |
| return onmessagePromise; | |
| }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedAudioFrame back'); | |
| promise_test(async t => { | |
| const caller = new RTCPeerConnection({encodedInsertableStreams:true}); | |
| t.add_cleanup(() => caller.close()); | |
| const callee = new RTCPeerConnection(); | |
| t.add_cleanup(() => callee.close()); | |
| const stream = await navigator.mediaDevices.getUserMedia({video:true}); | |
| const videoTrack = stream.getVideoTracks()[0]; | |
| t.add_cleanup(() => videoTrack.stop()); | |
| const videoSender = caller.addTrack(videoTrack) | |
| const senderStreams = videoSender.createEncodedStreams(); | |
| const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') | |
| t.add_cleanup(() => senderWorker.terminate()); | |
| senderWorker.postMessage( | |
| {readableStream: senderStreams.readable}, | |
| [senderStreams.readable]); | |
| let expectedFrameData = null; | |
| let verifiedFrameData = false; | |
| let numVerifiedFrames = 0; | |
| const onmessagePromise = new Promise(resolve => { | |
| senderWorker.onmessage = t.step_func(message => { | |
| if (!(message.data instanceof RTCEncodedVideoFrame)) { | |
| // This is the first message sent from the Worker to the test. | |
| // It contains an object (not an RTCEncodedVideoFrame) with the same | |
| // fields as the RTCEncodedVideoFrame to be sent in follow-up messages. | |
| // These serve as expected values to validate that the | |
| // RTCEncodedVideoFrame is sent correctly back to the test in the next | |
| // message. | |
| expectedFrameData = message.data; | |
| } else { | |
| // This is the frame sent by the Worker after reading it from the | |
| // readable stream. The Worker sends it twice after sending the | |
| // verification message. | |
| assert_equals(message.data.type, expectedFrameData.type); | |
| assert_equals(message.data.timestamp, expectedFrameData.timestamp); | |
| assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data)); | |
| assert_equals(message.data.getMetadata().synchronizationSource, expectedFrameData.metadata.synchronizationSource); | |
| if (++numVerifiedFrames == 2) | |
| resolve(); | |
| } | |
| }); | |
| }); | |
| exchangeIceCandidates(caller, callee); | |
| await exchangeOfferAnswer(caller, callee); | |
| return onmessagePromise; | |
| }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedVideoFrame back'); | |
| </script> | |
| </body> | |
| </html> |