Commit 50b1fbed authored by Harald Alvestrand's avatar Harald Alvestrand Committed by Commit Bot

Allow RTCRtpReceiver to have a track without streams.

Also add tests on what happens when Unified Plan talks to
Plan B in some combinations.

Bug: 799030, 802938
Change-Id: I8d17fd42221c5e8f3d34bfc93d6bfe4c99c6ddd1
Reviewed-on: https://chromium-review.googlesource.com/852272
Commit-Queue: Harald Alvestrand <hta@chromium.org>
Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#534064}
parent 4af20f07
......@@ -30,40 +30,6 @@
var invalidStateError = new DOMException('', 'InvalidStateError');
return promise_rejects(this, invalidStateError, closedPC.createOffer({iceRestart:true}));
}, 'createOffer() with closed peer connection' );
// These tests are testing the non-standard "sdpFormat" extension.
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "plan-b"});
return navigator.mediaDevices.getUserMedia({audio:true})
.then((stream) => {
console.log('got stream');
stream2 = stream.clone();
pc.addTrack(stream.getAudioTracks()[0]);
pc.addTrack(stream2.getAudioTracks()[0]);
return pc.createOffer();
})
.then((offer) => {
let section_count = offer.sdp.match(/\nm=audio /g || []).length;
assert_equals(section_count, 1);
});
}, 'plan B create offer creates only one media section');
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "unified-plan"});
return navigator.mediaDevices.getUserMedia({audio:true})
.then((stream) => {
console.log('got stream');
stream2 = stream.clone();
pc.addTrack(stream.getAudioTracks()[0]);
pc.addTrack(stream2.getAudioTracks()[0]);
return pc.createOffer();
})
.then((offer) => {
let section_count = offer.sdp.match(/\nm=audio /g || []).length;
assert_equals(section_count, 2);
});
}, 'Unified plan create offer creates two media sections');
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection.createOffer</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
// These tests are testing the non-standard "sdpFormat" extension.
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "plan-b"});
return navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {
stream2 = stream.clone();
pc.addTrack(stream.getAudioTracks()[0]);
pc.addTrack(stream2.getAudioTracks()[0]);
return pc.createOffer();
})
.then(offer => {
let section_count = offer.sdp.match(/\nm=audio /g || []).length;
assert_equals(section_count, 1);
});
}, 'Plan B createOffer creates only one media section for two audio tracks');
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "unified-plan"});
return navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {
stream2 = stream.clone();
pc.addTrack(stream.getAudioTracks()[0]);
pc.addTrack(stream2.getAudioTracks()[0]);
return pc.createOffer();
})
.then(offer => {
let section_count = (offer.sdp.match(/\nm=audio /g) || []).length;
assert_equals(section_count, 2);
});
}, 'Unified plan createOffer for audio creates two media sections ' +
'for two audio tracks');
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "plan-b"});
return navigator.mediaDevices.getUserMedia({video:true})
.then(stream => {
stream2 = stream.clone();
pc.addTrack(stream.getVideoTracks()[0]);
pc.addTrack(stream2.getVideoTracks()[0]);
return pc.createOffer();
})
.then(offer => {
let section_count = offer.sdp.match(/\nm=video /g || []).length;
assert_equals(section_count, 1);
});
}, 'Plan B createOffer for video creates one media section for two ' +
'video tracks');
promise_test(function() {
pc = new RTCPeerConnection({sdpSemantics: "unified-plan"});
return navigator.mediaDevices.getUserMedia({video:true})
.then(stream => {
stream2 = stream.clone();
pc.addTrack(stream.getVideoTracks()[0]);
pc.addTrack(stream2.getVideoTracks()[0]);
return pc.createOffer();
})
.then(offer => {
let section_count = offer.sdp.match(/\nm=video /g || []).length;
assert_equals(section_count, 2);
});
}, 'Unified plan createOffer for video creates two media sections ' +
'for two video tracks');
// TODO(hta): Add a test case with both audio and video tracks.
promise_test(function() {
pc1 = new RTCPeerConnection({sdpSemantics: "plan-b"});
pc2 = new RTCPeerConnection({sdpSemantics: "plan-b"});
return navigator.mediaDevices.getUserMedia({video: true})
.then(stream => {
pc1.addTrack(stream.getVideoTracks()[0]);
return pc1.createOffer();
})
.then(offer => {
return Promise.all([pc2.setRemoteDescription(offer),
pc1.setLocalDescription(offer)]);
})
.then(() => {
return pc2.createAnswer();
})
.then(answer => {
return Promise.all([pc2.setLocalDescription(answer),
pc1.setRemoteDescription(answer)]);
});
}, 'Plan B can connect to itself');
promise_test(function() {
pc1 = new RTCPeerConnection({sdpSemantics: "unified-plan"});
pc2 = new RTCPeerConnection({sdpSemantics: "unified-plan"});
return navigator.mediaDevices.getUserMedia({video: true})
.then(stream => {
pc1.addTrack(stream.getVideoTracks()[0]);
return pc1.createOffer();
})
.then(offer => {
return Promise.all([pc2.setRemoteDescription(offer),
pc1.setLocalDescription(offer)]);
})
.then(() => {
return pc2.createAnswer();
})
.then(answer => {
return Promise.all([pc2.setLocalDescription(answer),
pc1.setRemoteDescription(answer)]);
});
}, 'Unified Plan can connect to itself');
promise_test(function() {
pc1 = new RTCPeerConnection({sdpSemantics: "unified-plan"});
pc2 = new RTCPeerConnection({sdpSemantics: "plan-b"});
return navigator.mediaDevices.getUserMedia({video: true})
.then(stream => {
pc1.addTrack(stream.getVideoTracks()[0]);
return pc1.createOffer();
})
.then(offer => {
return Promise.all([pc2.setRemoteDescription(offer),
pc1.setLocalDescription(offer)]);
})
.then(() => {
return pc2.createAnswer();
})
.then(answer => {
return Promise.all([pc2.setLocalDescription(answer),
pc1.setRemoteDescription(answer)]);
});
}, 'Unified plan with one video track can connect to Plan B');
promise_test(function() {
pc1 = new RTCPeerConnection({sdpSemantics: "plan-b"});
pc2 = new RTCPeerConnection({sdpSemantics: "unified-plan"});
return navigator.mediaDevices.getUserMedia({video: true})
.then(stream => {
pc1.addTrack(stream.getVideoTracks()[0]);
return pc1.createOffer();
})
.then(offer => {
return Promise.all([pc2.setRemoteDescription(offer),
pc1.setLocalDescription(offer)]);
})
.then(() => {
return pc2.createAnswer();
})
.then(answer => {
return Promise.all([pc2.setLocalDescription(answer),
pc1.setRemoteDescription(answer)]);
});
}, 'Plan B with one video track can connect to Unified plan');
</script>
</body>
</html>
......@@ -1621,7 +1621,11 @@ void RTCPeerConnection::DidAddRemoteTrack(
}
DCHECK(FindReceiver(*web_rtp_receiver) == rtp_receivers_.end());
MediaStreamTrack* track = GetTrack(web_rtp_receiver->Track());
DCHECK(track);
if (!track) {
// Receiver with track, without a stream. May be created by Unified Plan.
track = MediaStreamTrack::Create(GetExecutionContext(),
web_rtp_receiver->Track());
}
RTCRtpReceiver* rtp_receiver =
new RTCRtpReceiver(std::move(web_rtp_receiver), track, streams);
rtp_receivers_.push_back(rtp_receiver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment