<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>VP9 in WebRTC</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <video id="video" autoplay playsInline width="320" height="240"></video>
        <canvas id="canvas1" width="320" height="240"></canvas>
        <canvas id="canvas2" width="320" height="240"></canvas>
        <canvas id="canvas3" width="320" height="240"></canvas>
        <script src ="routines.js"></script>
        <script>
let vp9Profile2;
test(() => {
    internals.setWebRTCVP9Support(false, true);
    codecs = RTCRtpSender.getCapabilities("video").codecs;
    vp9Profiles = codecs.filter(codec => { return codec.mimeType === "video/VP9" && codec.sdpFmtpLine === "profile-id=2"; });
    assert_equals(vp9Profiles.length, 1);
    vp9Profile2 = vp9Profiles[0];
}, "VP9 profile 2 in getCapabilities");

if (vp9Profile2) {
    promise_test(async (test) => {
        const pc = new RTCPeerConnection();
        const transceiver = pc.addTransceiver("video");
        transceiver.setCodecPreferences([vp9Profile2]);
        const description = await pc.createOffer();
        pc.close();
        assert_true(description.sdp.indexOf("VP9") !== -1, "VP9 codec is in the SDP");
    }, "Verify VP9 activation")

    var track;
    var remoteTrack;
    var receivingConnection;
    var sendingConnection;
    promise_test((test) => {
        return navigator.mediaDevices.getUserMedia({video: {width: 320, height: 240, facingMode: "environment"}}).then((localStream) => {
            return new Promise((resolve, reject) => {
                track = localStream.getVideoTracks()[0];

                createConnections((firstConnection) => {
                    sendingConnection = firstConnection;
                    firstConnection.addTrack(track, localStream);
                    firstConnection.getTransceivers()[0].setCodecPreferences([vp9Profile2]);
                }, (secondConnection) => {
                    receivingConnection = secondConnection;
                    secondConnection.ontrack = (trackEvent) => {
                        remoteTrack = trackEvent.track;
                        resolve(trackEvent.streams[0]);
                    };
                });
                setTimeout(() => reject("Test timed out"), 5000);
            });
        }).then((remoteStream) => {
            video.srcObject = remoteStream;
            return video.play();
        });
    }, "Setting video exchange");

    promise_test(() => {
        if (receivingConnection.connectionState === "connected")
            return Promise.resolve();
        return new Promise((resolve, reject) => {
            receivingConnection.onconnectionstatechange = () => {
                if (receivingConnection.connectionState === "connected")
                    resolve();
            };
            setTimeout(() => reject("Test timed out"), 5000);
        });
    }, "Ensuring connection state is connected");

    promise_test((test) => {
        return checkVideoBlack(false, canvas1, video);
    }, "Track is enabled, video should not be black");

    promise_test((test) => {
        track.enabled = false;
        return checkVideoBlack(true, canvas2, video);
    }, "Track is disabled, video should be black");

    promise_test((test) => {
        track.enabled = true;
        return checkVideoBlack(false, canvas2, video);
    }, "Track is enabled, video should not be black 2");
}
        </script>
    </body>
</html>
