| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>RTCPeerConnection Insertable Streams - Worker</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.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()); |
| |
| 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> |