146 lines
5.9 KiB
HTML
146 lines
5.9 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Clone a video track.</title>
|
|
<script src="../../resources/gc.js"></script>
|
|
<script src="../../resources/testharness.js"></script>
|
|
<script src="../../resources/testharnessreport.js"></script>
|
|
</head>
|
|
<body>
|
|
<video id='video1' autoplay playsinline></video>
|
|
<br>
|
|
<video id='video2' autoplay playsinline></video>
|
|
<br>
|
|
<video id='video3' autoplay playsinline></video>
|
|
<script>
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 160 } });
|
|
const streamClone = stream.clone();
|
|
|
|
video1.srcObject = stream;
|
|
video2.srcObject = streamClone;
|
|
|
|
const videoTrack = stream.getVideoTracks()[0];
|
|
const videoTrackClone = streamClone.getVideoTracks()[0];
|
|
|
|
assert_equals(videoTrack.enabled, videoTrackClone.enabled);
|
|
videoTrack.enabled = false;
|
|
assert_true(videoTrackClone.enabled);
|
|
videoTrack.enabled = true;
|
|
|
|
await videoTrackClone.applyConstraints({width: 640});
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().width, 640);
|
|
assert_equals(videoTrack.getSettings().width, 160);
|
|
}, "Check cloned track settings after applying width constraints");
|
|
|
|
const videoTrackClone2 = videoTrackClone.clone();
|
|
await videoTrackClone.applyConstraints({width: 1280});
|
|
video3.srcObject = new MediaStream([videoTrackClone2]);
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().width, 1280);
|
|
assert_equals(videoTrackClone2.getSettings().width, 640);
|
|
}, "Check cloned track settings after applying width constraint to original track");
|
|
}, "Setup for width test");
|
|
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { height: 100 } });
|
|
const streamClone = stream.clone();
|
|
|
|
video1.srcObject = stream;
|
|
video2.srcObject = streamClone;
|
|
|
|
const videoTrack = stream.getVideoTracks()[0];
|
|
const videoTrackClone = streamClone.getVideoTracks()[0];
|
|
|
|
assert_equals(videoTrack.enabled, videoTrackClone.enabled);
|
|
videoTrack.enabled = false;
|
|
assert_true(videoTrackClone.enabled);
|
|
videoTrack.enabled = true;
|
|
|
|
await videoTrackClone.applyConstraints({height: 200});
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().height, 200);
|
|
assert_equals(videoTrack.getSettings().height, 100);
|
|
}, "Check cloned track settings after applying height constraints");
|
|
|
|
const videoTrackClone2 = videoTrackClone.clone();
|
|
await videoTrackClone.applyConstraints({height: 400});
|
|
video3.srcObject = new MediaStream([videoTrackClone2]);
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().height, 400);
|
|
assert_equals(videoTrackClone2.getSettings().height, 200);
|
|
}, "Check cloned track settings after applying height constraints to original track");
|
|
}, "Setup for height test");
|
|
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 100, height: 100 } });
|
|
const streamClone = stream.clone();
|
|
|
|
video1.srcObject = stream;
|
|
video2.srcObject = streamClone;
|
|
|
|
const videoTrack = stream.getVideoTracks()[0];
|
|
const videoTrackClone = streamClone.getVideoTracks()[0];
|
|
|
|
assert_equals(videoTrack.enabled, videoTrackClone.enabled);
|
|
videoTrack.enabled = false;
|
|
assert_true(videoTrackClone.enabled);
|
|
videoTrack.enabled = true;
|
|
|
|
await videoTrackClone.applyConstraints({width: 100, height: 200});
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().width, 100);
|
|
assert_equals(videoTrackClone.getSettings().height, 200);
|
|
assert_equals(videoTrack.getSettings().height, 100);
|
|
assert_equals(videoTrack.getSettings().width, 100);
|
|
}, "Check cloned track settings after applying width+height constraints");
|
|
|
|
const videoTrackClone2 = videoTrackClone.clone();
|
|
await videoTrackClone.applyConstraints({width: 400, height: 200});
|
|
video3.srcObject = new MediaStream([videoTrackClone2]);
|
|
test(() => {
|
|
assert_equals(videoTrackClone.getSettings().width, 400);
|
|
assert_equals(videoTrackClone.getSettings().height, 200);
|
|
assert_equals(videoTrackClone2.getSettings().width, 100);
|
|
assert_equals(videoTrackClone2.getSettings().height, 200);
|
|
}, "Check cloned track settings after applying width+height constraints to original track");
|
|
}, "Setup for width+height test");
|
|
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 100, height: 100 } });
|
|
const streamClone = stream.clone();
|
|
|
|
video1.srcObject = streamClone;
|
|
stream.getVideoTracks()[0].stop();
|
|
|
|
await video1.play();
|
|
assert_equals(video1.videoWidth, 100);
|
|
}, "Stopping a track should not stop its clone");
|
|
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 100, height: 100 } });
|
|
const streamClone = stream.clone();
|
|
|
|
video1.srcObject = stream;
|
|
streamClone.getVideoTracks()[0].stop();
|
|
|
|
await video1.play();
|
|
assert_equals(video1.videoWidth, 100);
|
|
}, "Stopping a cloned track should not stop the original track");
|
|
|
|
promise_test(async (t) => {
|
|
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 100, height: 100 } });
|
|
stream.clone().getVideoTracks()[0].stop();
|
|
gc();
|
|
|
|
video1.srcObject = stream;
|
|
|
|
await video1.play();
|
|
assert_equals(video1.videoWidth, 100);
|
|
}, "Collecting a cloned track should not stop the original track");
|
|
</script>
|
|
</body>
|
|
</html>
|