Skip to content

Commit

Permalink
Splitting the insertable-stream test file into multiple test files
Browse files Browse the repository at this point in the history
Bug: 1068681
Change-Id: I496affdb20eda7209a66aed25859b04234ec9bbf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2401098
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Commit-Queue: Palak Agarwal <agpalak@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807792}
  • Loading branch information
palak8669 authored and chromium-wpt-export-bot committed Sep 17, 2020
1 parent 7efc877 commit 15a842e
Show file tree
Hide file tree
Showing 6 changed files with 474 additions and 417 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection Insertable Streams - Errors</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();
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());

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);

const videoSender = caller.addTrack(videoTrack);
assert_throws_dom("InvalidStateError", () => videoSender.createEncodedStreams());
}, 'RTCRtpSender.createEncodedStream() throws if not requested in PC configuration');

promise_test(async t => {
const caller = new RTCPeerConnection();
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 ontrackPromise = new Promise(resolve => {
callee.ontrack = t.step_func(() => {
const videoReceiver = callee.getReceivers().find(r => r.track.kind === 'video');
assert_true(videoReceiver !== undefined);
assert_throws_dom("InvalidStateError", () => videoReceiver.createEncodedStreams());
resolve();
});
});

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
return ontrackPromise;
}, 'RTCRtpReceiver.createEncodedStream() throws if not requested in PC configuration');

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 track = stream.getTracks()[0];
t.add_cleanup(() => track.stop());

const sender = caller.addTrack(track)
const streams = sender.createEncodedStreams();
const transformer = new TransformStream({
transform(frame, controller) {
// Inserting the same frame twice will result in failure since the frame
// will be neutered after the first insertion is processed.
controller.enqueue(frame);
controller.enqueue(frame);
}
});

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);

await promise_rejects_dom(
t, 'OperationError',
streams.readable.pipeThrough(transformer).pipeTo(streams.writable));
}, 'Enqueuing the same frame twice fails');

</script>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection Insertable Streams - Legacy API</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>
async function testNormalDataFlowWithInsertableStreamsForOtherKind(t, normalKind) {
const flowAudio = (normalKind == 'audio');
const pcConfig = flowAudio
? {forceEncodedVideoInsertableStreams:true}
: {forceEncodedAudioInsertableStreams:true};
const caller = new RTCPeerConnection(pcConfig);
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection(pcConfig);
t.add_cleanup(() => callee.close());

const stream = await navigator.mediaDevices.getUserMedia(
{audio: flowAudio, video: !flowAudio});
const track = stream.getTracks()[0];
t.add_cleanup(() => track.stop());

const sender = caller.addTrack(track, stream);
const ontrackPromise = new Promise((resolve,reject) => {
callee.ontrack = t.step_func(async e => {
let numGetStats = 0;
const intervalId = window.setInterval(async ()=> {
let statsReport = await callee.getStats();
statsReport.forEach(report => {
if (report.type == 'inbound-rtp' &&
report.kind == normalKind &&
report.bytesReceived > 0) {
clearInterval(intervalId);
resolve();
return;
}
});
if (++numGetStats >= 60) {
clearInterval(intervalId);
reject('No bytes received.');
return;
}
}, 50);
});
});

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);

return ontrackPromise;
}

promise_test(t => {
return testNormalDataFlowWithInsertableStreamsForOtherKind(t, 'audio');
}, 'Legacy: Audio flows when insertable streams is enabled for video and disabled for audio.');

promise_test(t => {
return testNormalDataFlowWithInsertableStreamsForOtherKind(t, 'video');
}, 'Legacy: Video flows when insertable streams is enabled for audio and disabled for audio.');

promise_test(async t => {
const caller = new RTCPeerConnection({encodedInsertableStreams:true});
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection({encodedInsertableStreams:true});
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 senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writable.getWriter();

let sentFrameInfo = null;
const ontrackPromise = new Promise(resolve => {
callee.ontrack = t.step_func(async e => {
const videoReceiver = e.receiver;

const receiverStreams = videoReceiver.createEncodedStreams();
const receiverReader = receiverStreams.readable.getReader();
receiverReader.read().then(t.step_func(receivedResult => {
assert_true(areFrameInfosEqual(receivedResult.value, sentFrameInfo));
verifyNonstandardAdditionalDataIfPresent(receivedResult.value);
resolve();
}));
});
});

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);

// Pass frames as they come from the encoder.
const result = await senderReader.read();
verifyNonstandardAdditionalDataIfPresent(result.value);
sentFrameInfo = {
timestamp: result.value.timestamp,
type: result.value.type,
data: result.value.data,
metadata: result.value.getMetadata(),
getMetadata() { return this.metadata; }
}
senderWriter.write(result.value);

return ontrackPromise;
}, 'Legacy API works');

</script>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection Insertable Streams - Video Frames</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({encodedInsertableStreams:true});
t.add_cleanup(() => callee.close());

const stream = await navigator.mediaDevices.getUserMedia({video:true});
const track = stream.getTracks()[0];
t.add_cleanup(() => track.stop());

const sender = caller.addTrack(track)
const senderStreams = sender.createEncodedStreams();
const senderReader = senderStreams.readable.getReader();
const senderWriter = senderStreams.writable.getWriter();
const numFramesToSend = 20;

const ontrackPromise = new Promise((resolve, reject) => {
callee.ontrack = async e => {
const receiverStreams = e.receiver.createEncodedStreams();
const receiverReader = receiverStreams.readable.getReader();

let numReceivedKeyFrames = 0;
let numReceivedDeltaFrames = 0;
for (let i = 0; i < numFramesToSend; i++) {
const result = await receiverReader.read();
if (result.value.type == 'key')
numReceivedKeyFrames++;
else if (result.value.type == 'delta')
numReceivedDeltaFrames++;

if (numReceivedKeyFrames > 0 && numReceivedDeltaFrames > 0)
resolve();
else if (numReceivedKeyFrames + numReceivedDeltaFrames >= numFramesToSend)
reject();
}
}
});

exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);

let numSentKeyFrames = 0;
let numSentDeltaFrames = 0;
// Pass frames as they come from the encoder.
for (let i = 0; i < numFramesToSend; i++) {
const result = await senderReader.read();
verifyNonstandardAdditionalDataIfPresent(result.value);
if (result.value.type == 'key') {
numSentKeyFrames++;
} else {
numSentDeltaFrames++;
}

senderWriter.write(result.value);
}

assert_greater_than(numSentKeyFrames, 0);
assert_greater_than(numSentDeltaFrames, 0);

return ontrackPromise;
}, 'Key and Delta frames are sent and received');

</script>
</body>
</html>
Loading

0 comments on commit 15a842e

Please sign in to comment.