blob: aa2d07af3b97f94bd72e58a5b5844bf86ae8d594 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<canvas id="canvas0" width=320px height=240px></canvas>
<canvas id="canvas1" width=100px height=100px></canvas>
<video id="video" autoplay width=320px height=240px></video>
<canvas id="canvas2" width=320px height=240px></canvas>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../webrtc/routines.js"></script>
<script>
function printRectangle(canvas)
{
var context = canvas.getContext("2d");
context.fillStyle = canvas.color;
context.fillRect(0, 0, 100, 100);
setTimeout(() => printRectangle(canvas), 50);
}
if (window.internals)
internals.setH264HardwareEncoderAllowed(false);
function testCanvas(testName, canvas, isSame, count)
{
var array1 = canvas.getContext("2d").getImageData(20, 20, 60, 60).data;
if (count === undefined)
count = 0;
canvas2.getContext("2d").drawImage(video, 0 ,0);
array2 = canvas2.getContext("2d").getImageData(20, 20, 60, 60).data;
var isEqual = true;
for (var index = 0; index < array1.length; ++index) {
// Rough comparison since we are compressing data.
// This test still catches errors since we are going from green to blue to red.
if (Math.abs(array1[index] - array2[index]) > 100) {
isEqual = false;
continue;
}
}
if (isEqual === isSame)
return;
if (count === 40)
return Promise.reject(testName + " failed");
return waitFor(100).then(() => {
return testCanvas(testName, canvas, isSame, ++count);
});
}
var canvas0Track;
var sender;
promise_test((test) => {
canvas0.color = "green";
printRectangle(canvas0);
const shouldMatchCanvas1AfterReplaceTrack = window.internals ? internals.supportsVCPEncoder() : true;
return new Promise((resolve, reject) => {
createConnections((firstConnection) => {
var stream = canvas0.captureStream();
canvas0Track = stream.getVideoTracks()[0];
sender = firstConnection.addTrack(canvas0Track, stream);
}, (secondConnection) => {
secondConnection.ontrack = (trackEvent) => {
resolve(trackEvent.streams[0]);
};
});
setTimeout(() => reject("Test timed out"), 5000);
}).then((stream) => {
video.srcObject = stream;
return video.play();
}).then(() => {
return testCanvas("test1", canvas0, true);
}).then(() => {
canvas1.color = "blue";
printRectangle(canvas1);
var stream = canvas1.captureStream();
return sender.replaceTrack(stream.getVideoTracks()[0]);
}).then(() => {
return waitFor(200);
}).then(() => {
return testCanvas("test2", canvas1, shouldMatchCanvas1AfterReplaceTrack);
}).then(() => {
return testCanvas("test3", canvas0, !shouldMatchCanvas1AfterReplaceTrack);
}).then(() => {
return sender.replaceTrack(canvas0Track);
}).then(() => {
canvas0.color = "red";
// Let's wait for red color to be printed on canvas0
return waitFor(200);
}).then(() => {
return testCanvas("test4", canvas0, true);
}).catch((error) => {
if (window.internals)
internals.setH264HardwareEncoderAllowed(true);
return Promise.reject(error);
});
}, "captureStream with webrtc");
</script>
</head>
</html>