<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Trying to recycle m sections</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <script>
promise_test(async test => {
    const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});

    const firstConnection = new RTCPeerConnection({sdpSemantics:'unified-plan'});
    const secondConnection = new RTCPeerConnection({sdpSemantics:'unified-plan'});

    firstConnection.addTrack(stream.getAudioTracks()[0], stream);
    firstConnection.addTrack(stream.getVideoTracks()[0], stream);
    firstConnection.addTransceiver("audio", {direction: "recvonly"});
    firstConnection.addTransceiver("video", {direction: "recvonly"});

    let desc = await firstConnection.createOffer();
    await firstConnection.setLocalDescription(desc);

    await secondConnection.setRemoteDescription(desc);
    const desc2 = await secondConnection.createAnswer();

    let lines = desc2.sdp.trim().split('\r\n');

    let counter;
    for (counter = 0; counter < lines.length; ++counter) {
        if (lines[counter] == "a=mid:2")
            break;
    }
    for (;counter < lines.length; ++counter) {
        if (lines[counter].startsWith("m=video ")) {
            lines[counter] = "m=video 0 RTP/SAVPF 0";
            break;
        }
    }
    for (counter = 0; counter < lines.length; ++counter) {
        if (lines[counter] == "a=mid:3")
            break;
    }

    for (;counter < lines.length; ++counter) {
        if (lines[counter].startsWith("m=audio "))
            lines[counter] = "m=audio 0 RTP/SAVPF 0";
        else if (lines[counter].startsWith("m=video "))
            lines[counter] = "m=video 0 RTP/SAVPF 0";
        else if (lines[counter] === "a=inactive" || lines[counter].startsWith("a=mid")) {
        } else
            lines[counter] = "XXX";
    }
    lines = lines.filter((line) => { return line != "XXX"; });

    desc2.sdp = lines.join('\r\n') + '\r\n';

    await firstConnection.setRemoteDescription(desc2);

    firstConnection.addTransceiver("audio");
    firstConnection.addTransceiver("audio");

    await firstConnection.createOffer();
}, "Recycle m-section with different media type");
        </script>
    </body>
</html>
