Commit a6460afd authored by Guido Urdaneta's avatar Guido Urdaneta Committed by Commit Bot

[RTCInsertableStreams] Add support for readable/writable fields

This CL adds the readable and writable fields to the
RTCInsertableStreams dictionary.
These are equivalent to and will replace readableStream and writableStream.
The reason for this is consistency with other APIs that use stream pairs.

Drive-by: rename RTCCodedVideoFrameType to RTCEncodedVideoFrameType to
match the spec and update tests to comply with other API changes.

Bug: 1119653
Change-Id: I64bcafb2602fb952722f1845abaeebd09f3e77d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2366592Reviewed-by: default avatarHarald Alvestrand <hta@chromium.org>
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800032}
parent 7a8fca54
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md#api // https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md#api
// TODO(crbug.com/1052765): Add link to standard when available. // TODO(crbug.com/1052765): Add link to standard when available.
enum RTCCodedVideoFrameType { enum RTCEncodedVideoFrameType {
"empty", "empty",
"key", "key",
"delta", "delta",
...@@ -16,7 +16,7 @@ enum RTCCodedVideoFrameType { ...@@ -16,7 +16,7 @@ enum RTCCodedVideoFrameType {
Exposed=Window, Exposed=Window,
RuntimeEnabled=RTCInsertableStreams RuntimeEnabled=RTCInsertableStreams
] interface RTCEncodedVideoFrame { ] interface RTCEncodedVideoFrame {
readonly attribute RTCCodedVideoFrameType type; readonly attribute RTCEncodedVideoFrameType type;
readonly attribute unsigned long long timestamp; // microseconds readonly attribute unsigned long long timestamp; // microseconds
attribute ArrayBuffer data; attribute ArrayBuffer data;
RTCEncodedVideoFrameMetadata getMetadata(); RTCEncodedVideoFrameMetadata getMetadata();
......
...@@ -2,10 +2,13 @@ ...@@ -2,10 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md#api // https://w3c.github.io/webrtc-insertable-streams/#dictdef-rtcinsertablestreams
// TODO(guidou): Add standards link when available.
dictionary RTCInsertableStreams { dictionary RTCInsertableStreams {
ReadableStream readableStream; ReadableStream readable;
WritableStream writableStream; WritableStream writable;
// Deprecated
[RuntimeEnabled=RTCInsertableStreams] ReadableStream readableStream;
[RuntimeEnabled=RTCInsertableStreams] WritableStream writableStream;
}; };
...@@ -399,10 +399,12 @@ void RTCRtpReceiver::InitializeEncodedAudioStreams(ScriptState* script_state) { ...@@ -399,10 +399,12 @@ void RTCRtpReceiver::InitializeEncodedAudioStreams(ScriptState* script_state) {
/*is_receiver=*/true); /*is_receiver=*/true);
// The high water mark for the readable stream is set to 0 so that frames are // The high water mark for the readable stream is set to 0 so that frames are
// removed from the queue right away, without introducing a new buffer. // removed from the queue right away, without introducing a new buffer.
encoded_audio_streams_->setReadableStream( ReadableStream* readable_stream =
ReadableStream::CreateWithCountQueueingStrategy( ReadableStream::CreateWithCountQueueingStrategy(
script_state, audio_from_depacketizer_underlying_source_, script_state, audio_from_depacketizer_underlying_source_,
/*high_water_mark=*/0)); /*high_water_mark=*/0);
encoded_audio_streams_->setReadableStream(readable_stream);
encoded_audio_streams_->setReadable(readable_stream);
// Set up writable. // Set up writable.
audio_to_decoder_underlying_sink_ = audio_to_decoder_underlying_sink_ =
...@@ -418,10 +420,12 @@ void RTCRtpReceiver::InitializeEncodedAudioStreams(ScriptState* script_state) { ...@@ -418,10 +420,12 @@ void RTCRtpReceiver::InitializeEncodedAudioStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the stream is set to 1 so that the stream seems // The high water mark for the stream is set to 1 so that the stream seems
// ready to write, but without queuing frames. // ready to write, but without queuing frames.
encoded_audio_streams_->setWritableStream( WritableStream* writable_stream =
WritableStream::CreateWithCountQueueingStrategy( WritableStream::CreateWithCountQueueingStrategy(
script_state, audio_to_decoder_underlying_sink_, script_state, audio_to_decoder_underlying_sink_,
/*high_water_mark=*/1)); /*high_water_mark=*/1);
encoded_audio_streams_->setWritableStream(writable_stream);
encoded_audio_streams_->setWritable(writable_stream);
} }
void RTCRtpReceiver::OnAudioFrameFromDepacketizer( void RTCRtpReceiver::OnAudioFrameFromDepacketizer(
...@@ -467,10 +471,12 @@ void RTCRtpReceiver::InitializeEncodedVideoStreams(ScriptState* script_state) { ...@@ -467,10 +471,12 @@ void RTCRtpReceiver::InitializeEncodedVideoStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the readable stream is set to 0 so that frames are // The high water mark for the readable stream is set to 0 so that frames are
// removed from the queue right away, without introducing a new buffer. // removed from the queue right away, without introducing a new buffer.
encoded_video_streams_->setReadableStream( ReadableStream* readable_stream =
ReadableStream::CreateWithCountQueueingStrategy( ReadableStream::CreateWithCountQueueingStrategy(
script_state, video_from_depacketizer_underlying_source_, script_state, video_from_depacketizer_underlying_source_,
/*high_water_mark=*/0)); /*high_water_mark=*/0);
encoded_video_streams_->setReadableStream(readable_stream);
encoded_video_streams_->setReadable(readable_stream);
// Set up writable. // Set up writable.
video_to_decoder_underlying_sink_ = video_to_decoder_underlying_sink_ =
...@@ -486,10 +492,12 @@ void RTCRtpReceiver::InitializeEncodedVideoStreams(ScriptState* script_state) { ...@@ -486,10 +492,12 @@ void RTCRtpReceiver::InitializeEncodedVideoStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the stream is set to 1 so that the stream seems // The high water mark for the stream is set to 1 so that the stream seems
// ready to write, but without queuing frames. // ready to write, but without queuing frames.
encoded_video_streams_->setWritableStream( WritableStream* writable_stream =
WritableStream::CreateWithCountQueueingStrategy( WritableStream::CreateWithCountQueueingStrategy(
script_state, video_to_decoder_underlying_sink_, script_state, video_to_decoder_underlying_sink_,
/*high_water_mark=*/1)); /*high_water_mark=*/1);
encoded_video_streams_->setWritableStream(writable_stream);
encoded_video_streams_->setWritable(writable_stream);
} }
void RTCRtpReceiver::OnVideoFrameFromDepacketizer( void RTCRtpReceiver::OnVideoFrameFromDepacketizer(
......
...@@ -806,10 +806,12 @@ void RTCRtpSender::InitializeEncodedAudioStreams(ScriptState* script_state) { ...@@ -806,10 +806,12 @@ void RTCRtpSender::InitializeEncodedAudioStreams(ScriptState* script_state) {
/*is_receiver=*/false); /*is_receiver=*/false);
// The high water mark for the readable stream is set to 0 so that frames are // The high water mark for the readable stream is set to 0 so that frames are
// removed from the queue right away, without introducing any buffering. // removed from the queue right away, without introducing any buffering.
encoded_audio_streams_->setReadableStream( ReadableStream* readable_stream =
ReadableStream::CreateWithCountQueueingStrategy( ReadableStream::CreateWithCountQueueingStrategy(
script_state, audio_from_encoder_underlying_source_, script_state, audio_from_encoder_underlying_source_,
/*high_water_mark=*/0)); /*high_water_mark=*/0);
encoded_audio_streams_->setReadableStream(readable_stream);
encoded_audio_streams_->setReadable(readable_stream);
// Set up writable stream. // Set up writable stream.
audio_to_packetizer_underlying_sink_ = audio_to_packetizer_underlying_sink_ =
...@@ -824,10 +826,12 @@ void RTCRtpSender::InitializeEncodedAudioStreams(ScriptState* script_state) { ...@@ -824,10 +826,12 @@ void RTCRtpSender::InitializeEncodedAudioStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the stream is set to 1 so that the stream is // The high water mark for the stream is set to 1 so that the stream is
// ready to write, but without queuing frames. // ready to write, but without queuing frames.
encoded_audio_streams_->setWritableStream( WritableStream* writable_stream =
WritableStream::CreateWithCountQueueingStrategy( WritableStream::CreateWithCountQueueingStrategy(
script_state, audio_to_packetizer_underlying_sink_, script_state, audio_to_packetizer_underlying_sink_,
/*high_water_mark=*/1)); /*high_water_mark=*/1);
encoded_audio_streams_->setWritableStream(writable_stream);
encoded_audio_streams_->setWritable(writable_stream);
} }
void RTCRtpSender::OnAudioFrameFromEncoder( void RTCRtpSender::OnAudioFrameFromEncoder(
...@@ -867,10 +871,12 @@ void RTCRtpSender::InitializeEncodedVideoStreams(ScriptState* script_state) { ...@@ -867,10 +871,12 @@ void RTCRtpSender::InitializeEncodedVideoStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the readable stream is set to 0 so that frames are // The high water mark for the readable stream is set to 0 so that frames are
// removed from the queue right away, without introducing any buffering. // removed from the queue right away, without introducing any buffering.
encoded_video_streams_->setReadableStream( ReadableStream* readable_stream =
ReadableStream::CreateWithCountQueueingStrategy( ReadableStream::CreateWithCountQueueingStrategy(
script_state, video_from_encoder_underlying_source_, script_state, video_from_encoder_underlying_source_,
/*high_water_mark=*/0)); /*high_water_mark=*/0);
encoded_video_streams_->setReadableStream(readable_stream);
encoded_video_streams_->setReadable(readable_stream);
// Set up writable stream. // Set up writable stream.
video_to_packetizer_underlying_sink_ = video_to_packetizer_underlying_sink_ =
...@@ -885,10 +891,12 @@ void RTCRtpSender::InitializeEncodedVideoStreams(ScriptState* script_state) { ...@@ -885,10 +891,12 @@ void RTCRtpSender::InitializeEncodedVideoStreams(ScriptState* script_state) {
WrapWeakPersistent(this))); WrapWeakPersistent(this)));
// The high water mark for the stream is set to 1 so that the stream is // The high water mark for the stream is set to 1 so that the stream is
// ready to write, but without queuing frames. // ready to write, but without queuing frames.
encoded_video_streams_->setWritableStream( WritableStream* writable_stream =
WritableStream::CreateWithCountQueueingStrategy( WritableStream::CreateWithCountQueueingStrategy(
script_state, video_to_packetizer_underlying_sink_, script_state, video_to_packetizer_underlying_sink_,
/*high_water_mark=*/1)); /*high_water_mark=*/1);
encoded_video_streams_->setWritableStream(writable_stream);
encoded_video_streams_->setWritable(writable_stream);
} }
void RTCRtpSender::OnVideoFrameFromEncoder( void RTCRtpSender::OnVideoFrameFromEncoder(
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<script> <script>
"use strict"; "use strict";
promise_test(async t => { promise_test(async t => {
const caller = new RTCPeerConnection({forceEncodedAudioInsertableStreams:true}); const caller = new RTCPeerConnection({encodedInsertableStreams:true});
t.add_cleanup(() => caller.close()); t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection(); const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close()); t.add_cleanup(() => callee.close());
...@@ -20,9 +20,9 @@ promise_test(async t => { ...@@ -20,9 +20,9 @@ promise_test(async t => {
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
const sender = caller.addTrack(track) const sender = caller.addTrack(track)
const streams = sender.createEncodedAudioStreams(); const streams = sender.createEncodedStreams();
const reader = streams.readableStream.getReader(); const reader = streams.readable.getReader();
const writer = streams.writableStream.getWriter(); const writer = streams.writable.getWriter();
exchangeIceCandidates(caller, callee); exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee); await exchangeOfferAnswer(caller, callee);
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<script> <script>
"use strict"; "use strict";
promise_test(async t => { promise_test(async t => {
const caller = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true}); const caller = new RTCPeerConnection({encodedInsertableStreams:true});
t.add_cleanup(() => caller.close()); t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection(); const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close()); t.add_cleanup(() => callee.close());
...@@ -20,9 +20,9 @@ promise_test(async t => { ...@@ -20,9 +20,9 @@ promise_test(async t => {
t.add_cleanup(() => videoTrack.stop()); t.add_cleanup(() => videoTrack.stop());
const videoSender = caller.addTrack(videoTrack) const videoSender = caller.addTrack(videoTrack)
const senderStreams = videoSender.createEncodedVideoStreams(); const senderStreams = videoSender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
exchangeIceCandidates(caller, callee); exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee); await exchangeOfferAnswer(caller, callee);
......
...@@ -21,8 +21,8 @@ async function testAudioFlow(t, negotiationFunction) { ...@@ -21,8 +21,8 @@ async function testAudioFlow(t, negotiationFunction) {
const audioSender = caller.addTrack(audioTrack) const audioSender = caller.addTrack(audioTrack)
const senderStreams = audioSender.createEncodedStreams(); const senderStreams = audioSender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
const frameInfos = []; const frameInfos = [];
const numFramesPassthrough = 5; const numFramesPassthrough = 5;
...@@ -37,8 +37,8 @@ async function testAudioFlow(t, negotiationFunction) { ...@@ -37,8 +37,8 @@ async function testAudioFlow(t, negotiationFunction) {
const receiverStreams = const receiverStreams =
audioReceiver.createEncodedStreams(); audioReceiver.createEncodedStreams();
const receiverReader = receiverStreams.readableStream.getReader(); const receiverReader = receiverStreams.readable.getReader();
const receiverWriter = receiverStreams.writableStream.getWriter(); const receiverWriter = receiverStreams.writable.getWriter();
const maxFramesToReceive = numFramesToSend; const maxFramesToReceive = numFramesToSend;
let numVerifiedFrames = 0; let numVerifiedFrames = 0;
...@@ -177,8 +177,8 @@ promise_test(async t => { ...@@ -177,8 +177,8 @@ promise_test(async t => {
const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js')
senderWorker.postMessage( senderWorker.postMessage(
{readableStream: senderStreams.readableStream}, {readableStream: senderStreams.readable},
[senderStreams.readableStream]); [senderStreams.readable]);
let expectedFrameData = null; let expectedFrameData = null;
let verifiedFrameData = false; let verifiedFrameData = false;
...@@ -238,7 +238,7 @@ promise_test(async t => { ...@@ -238,7 +238,7 @@ promise_test(async t => {
await promise_rejects_dom( await promise_rejects_dom(
t, 'OperationError', t, 'OperationError',
streams.readableStream.pipeThrough(transformer).pipeTo(streams.writableStream)); streams.readable.pipeThrough(transformer).pipeTo(streams.writable));
}, 'Enqueuing the same frame twice fails'); }, 'Enqueuing the same frame twice fails');
promise_test(async t => { promise_test(async t => {
...@@ -252,17 +252,17 @@ promise_test(async t => { ...@@ -252,17 +252,17 @@ promise_test(async t => {
t.add_cleanup(() => audioTrack.stop()); t.add_cleanup(() => audioTrack.stop());
const audioSender = caller.addTrack(audioTrack) const audioSender = caller.addTrack(audioTrack)
const senderStreams = audioSender.createEncodedAudioStreams(); const senderStreams = audioSender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
let sentFrameInfo = null; let sentFrameInfo = null;
const ontrackPromise = new Promise(resolve => { const ontrackPromise = new Promise(resolve => {
callee.ontrack = e => { callee.ontrack = e => {
const audioReceiver = e.receiver; const audioReceiver = e.receiver;
const receiverStreams = audioReceiver.createEncodedAudioStreams(); const receiverStreams = audioReceiver.createEncodedStreams();
const receiverReader = receiverStreams.readableStream.getReader(); const receiverReader = receiverStreams.readable.getReader();
receiverReader.read().then(t.step_func(receivedResult => { receiverReader.read().then(t.step_func(receivedResult => {
assert_true(areFrameInfosEqual(receivedResult.value, sentFrameInfo)); assert_true(areFrameInfosEqual(receivedResult.value, sentFrameInfo));
resolve(); resolve();
......
...@@ -29,9 +29,9 @@ promise_test(async t => { ...@@ -29,9 +29,9 @@ promise_test(async t => {
} }
}); });
const receiverStreams = e.receiver.createEncodedStreams(); const receiverStreams = e.receiver.createEncodedStreams();
receiverStreams.readableStream receiverStreams.readable
.pipeThrough(receiverTransformer) .pipeThrough(receiverTransformer)
.pipeTo(receiverStreams.writableStream); .pipeTo(receiverStreams.writable);
const stream = e.streams[0]; const stream = e.streams[0];
const v = document.createElement('video'); const v = document.createElement('video');
...@@ -60,9 +60,9 @@ promise_test(async t => { ...@@ -60,9 +60,9 @@ promise_test(async t => {
controller.enqueue(chunk); controller.enqueue(chunk);
} }
}); });
senderStreams.readableStream senderStreams.readable
.pipeThrough(senderTransformer) .pipeThrough(senderTransformer)
.pipeTo(senderStreams.writableStream); .pipeTo(senderStreams.writable);
const offer = await pc1.createOffer(); const offer = await pc1.createOffer();
await pc1.setLocalDescription(offer), await pc1.setLocalDescription(offer),
......
...@@ -24,8 +24,8 @@ async function testVideoFlow(t, negotiationFunction) { ...@@ -24,8 +24,8 @@ async function testVideoFlow(t, negotiationFunction) {
const videoSender = caller.addTrack(videoTrack) const videoSender = caller.addTrack(videoTrack)
const senderStreams = videoSender.createEncodedStreams(); const senderStreams = videoSender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
const frameInfos = []; const frameInfos = [];
const numFramesPassthrough = 5; const numFramesPassthrough = 5;
...@@ -40,8 +40,8 @@ async function testVideoFlow(t, negotiationFunction) { ...@@ -40,8 +40,8 @@ async function testVideoFlow(t, negotiationFunction) {
const receiverStreams = const receiverStreams =
videoReceiver.createEncodedStreams(); videoReceiver.createEncodedStreams();
const receiverReader = receiverStreams.readableStream.getReader(); const receiverReader = receiverStreams.readable.getReader();
const receiverWriter = receiverStreams.writableStream.getWriter(); const receiverWriter = receiverStreams.writable.getWriter();
const maxFramesToReceive = numFramesToSend; const maxFramesToReceive = numFramesToSend;
let numVerifiedFrames = 0; let numVerifiedFrames = 0;
...@@ -185,8 +185,8 @@ promise_test(async t => { ...@@ -185,8 +185,8 @@ promise_test(async t => {
const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js')
senderWorker.postMessage( senderWorker.postMessage(
{readableStream: senderStreams.readableStream}, {readableStream: senderStreams.readable},
[senderStreams.readableStream]); [senderStreams.readable]);
let expectedFrameData = null; let expectedFrameData = null;
let verifiedFrameData = false; let verifiedFrameData = false;
...@@ -286,14 +286,14 @@ promise_test(async t => { ...@@ -286,14 +286,14 @@ promise_test(async t => {
const sender = caller.addTrack(track) const sender = caller.addTrack(track)
const senderStreams = sender.createEncodedStreams(); const senderStreams = sender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
const numFramesToSend = 20; const numFramesToSend = 20;
const ontrackPromise = new Promise((resolve, reject) => { const ontrackPromise = new Promise((resolve, reject) => {
callee.ontrack = async e => { callee.ontrack = async e => {
const receiverStreams = e.receiver.createEncodedStreams(); const receiverStreams = e.receiver.createEncodedStreams();
const receiverReader = receiverStreams.readableStream.getReader(); const receiverReader = receiverStreams.readable.getReader();
let numReceivedKeyFrames = 0; let numReceivedKeyFrames = 0;
let numReceivedDeltaFrames = 0; let numReceivedDeltaFrames = 0;
...@@ -361,13 +361,13 @@ promise_test(async t => { ...@@ -361,13 +361,13 @@ promise_test(async t => {
await promise_rejects_dom( await promise_rejects_dom(
t, 'OperationError', t, 'OperationError',
streams.readableStream.pipeThrough(transformer).pipeTo(streams.writableStream)); streams.readable.pipeThrough(transformer).pipeTo(streams.writable));
}, 'Enqueuing the same frame twice fails'); }, 'Enqueuing the same frame twice fails');
promise_test(async t => { promise_test(async t => {
const caller = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true}); const caller = new RTCPeerConnection({encodedInsertableStreams:true});
t.add_cleanup(() => caller.close()); t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true}); const callee = new RTCPeerConnection({encodedInsertableStreams:true});
t.add_cleanup(() => callee.close()); t.add_cleanup(() => callee.close());
const stream = await navigator.mediaDevices.getUserMedia({video:true}); const stream = await navigator.mediaDevices.getUserMedia({video:true});
...@@ -375,17 +375,17 @@ promise_test(async t => { ...@@ -375,17 +375,17 @@ promise_test(async t => {
t.add_cleanup(() => videoTrack.stop()); t.add_cleanup(() => videoTrack.stop());
const videoSender = caller.addTrack(videoTrack) const videoSender = caller.addTrack(videoTrack)
const senderStreams = videoSender.createEncodedVideoStreams(); const senderStreams = videoSender.createEncodedStreams();
const senderReader = senderStreams.readableStream.getReader(); const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writableStream.getWriter(); const senderWriter = senderStreams.writable.getWriter();
let sentFrameInfo = null; let sentFrameInfo = null;
const ontrackPromise = new Promise(resolve => { const ontrackPromise = new Promise(resolve => {
callee.ontrack = t.step_func(async e => { callee.ontrack = t.step_func(async e => {
const videoReceiver = e.receiver; const videoReceiver = e.receiver;
const receiverStreams = videoReceiver.createEncodedVideoStreams(); const receiverStreams = videoReceiver.createEncodedStreams();
const receiverReader = receiverStreams.readableStream.getReader(); const receiverReader = receiverStreams.readable.getReader();
receiverReader.read().then(t.step_func(receivedResult => { receiverReader.read().then(t.step_func(receivedResult => {
assert_true(areFrameInfosEqual(receivedResult.value, sentFrameInfo)); assert_true(areFrameInfosEqual(receivedResult.value, sentFrameInfo));
resolve(); resolve();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment