Skip to content

Commit f8a8b6f

Browse files
authored
Merge pull request webrtc-rs#429 from kolserdav/stop-pc-bug
Stop pc bug
2 parents c919e83 + 59c75bd commit f8a8b6f

File tree

7 files changed

+105
-54
lines changed

7 files changed

+105
-54
lines changed

webrtc/src/peer_connection/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ impl RTCPeerConnection {
473473
None => return true, // doesn't contain a single a=msid line
474474
};
475475

476-
let sender = t.sender();
476+
let sender = t.sender().await;
477477
// (...)or the number of MSIDs from the a=msid lines in this m= section,
478478
// or the MSID values themselves, differ from what is in
479479
// transceiver.sender.[[AssociatedMediaStreamIds]], return true.
@@ -1595,7 +1595,7 @@ impl RTCPeerConnection {
15951595
pub(crate) async fn start_rtp_senders(&self) -> Result<()> {
15961596
let current_transceivers = self.internal.rtp_transceivers.lock().await;
15971597
for transceiver in &*current_transceivers {
1598-
let sender = transceiver.sender();
1598+
let sender = transceiver.sender().await;
15991599
if sender.is_negotiated() && !sender.has_sent() {
16001600
sender.send(&sender.get_parameters().await).await?;
16011601
}
@@ -1653,7 +1653,7 @@ impl RTCPeerConnection {
16531653
let mut senders = vec![];
16541654
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16551655
for transceiver in &*rtp_transceivers {
1656-
let sender = transceiver.sender();
1656+
let sender = transceiver.sender().await;
16571657
senders.push(sender);
16581658
}
16591659
senders
@@ -1664,7 +1664,7 @@ impl RTCPeerConnection {
16641664
let mut receivers = vec![];
16651665
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16661666
for transceiver in &*rtp_transceivers {
1667-
receivers.push(transceiver.receiver());
1667+
receivers.push(transceiver.receiver().await);
16681668
}
16691669
receivers
16701670
}
@@ -1688,7 +1688,7 @@ impl RTCPeerConnection {
16881688
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16891689
for t in &*rtp_transceivers {
16901690
if !t.stopped.load(Ordering::SeqCst) && t.kind == track.kind() {
1691-
let sender = t.sender();
1691+
let sender = t.sender().await;
16921692
if sender.track().await.is_none() {
16931693
if let Err(err) = sender.replace_track(Some(track)).await {
16941694
let _ = sender.stop().await;
@@ -1715,7 +1715,7 @@ impl RTCPeerConnection {
17151715
.add_rtp_transceiver(Arc::clone(&transceiver))
17161716
.await;
17171717

1718-
Ok(transceiver.sender())
1718+
Ok(transceiver.sender().await)
17191719
}
17201720

17211721
/// remove_track removes a Track from the PeerConnection
@@ -1728,7 +1728,7 @@ impl RTCPeerConnection {
17281728
{
17291729
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
17301730
for t in &*rtp_transceivers {
1731-
if t.sender().id == sender.id {
1731+
if t.sender().await.id == sender.id {
17321732
if sender.track().await.is_none() {
17331733
return Ok(());
17341734
}

webrtc/src/peer_connection/peer_connection_internal.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl PeerConnectionInternal {
167167
self.undeclared_media_processor();
168168
} else {
169169
for t in &current_transceivers {
170-
let receiver = t.receiver();
170+
let receiver = t.receiver().await;
171171
let tracks = receiver.tracks().await;
172172
if tracks.is_empty() {
173173
continue;
@@ -217,7 +217,7 @@ impl PeerConnectionInternal {
217217
Arc::clone(&self.media_engine),
218218
interceptor,
219219
));
220-
t.set_receiver(receiver);
220+
t.set_receiver(receiver).await;
221221
}
222222
}
223223

@@ -338,7 +338,7 @@ impl PeerConnectionInternal {
338338
for incoming_track in incoming_tracks {
339339
// If we already have a TrackRemote for a given SSRC don't handle it again
340340
for t in local_transceivers {
341-
let receiver = t.receiver();
341+
let receiver = t.receiver().await;
342342
for track in receiver.tracks().await {
343343
for ssrc in &incoming_track.ssrcs {
344344
if *ssrc == track.ssrc() {
@@ -364,7 +364,7 @@ impl PeerConnectionInternal {
364364
continue;
365365
}
366366

367-
let receiver = t.receiver();
367+
let receiver = t.receiver().await;
368368
if receiver.have_received().await {
369369
continue;
370370
}
@@ -667,7 +667,7 @@ impl PeerConnectionInternal {
667667
}
668668

669669
// TODO: This is dubious because of rollbacks.
670-
t.sender().set_negotiated();
670+
t.sender().await.set_negotiated();
671671
media_sections.push(MediaSection {
672672
id: t.mid().unwrap().0.to_string(),
673673
transceivers: vec![Arc::clone(t)],
@@ -756,7 +756,7 @@ impl PeerConnectionInternal {
756756
}
757757

758758
if let Some(t) = find_by_mid(mid_value, &mut local_transceivers).await {
759-
t.sender().set_negotiated();
759+
t.sender().await.set_negotiated();
760760
let media_transceivers = vec![t];
761761

762762
// NB: The below could use `then_some`, but with our current MSRV
@@ -781,7 +781,7 @@ impl PeerConnectionInternal {
781781
// If we are offering also include unmatched local transceivers
782782
if include_unmatched {
783783
for t in &local_transceivers {
784-
t.sender().set_negotiated();
784+
t.sender().await.set_negotiated();
785785
media_sections.push(MediaSection {
786786
id: t.mid().unwrap().0.to_string(),
787787
transceivers: vec![Arc::clone(t)],
@@ -887,7 +887,7 @@ impl PeerConnectionInternal {
887887
)
888888
.await?;
889889

890-
let receiver = t.receiver();
890+
let receiver = t.receiver().await;
891891
PeerConnectionInternal::start_receiver(
892892
self.setting_engine.get_receive_mtu(),
893893
&incoming,
@@ -1008,7 +1008,7 @@ impl PeerConnectionInternal {
10081008
continue;
10091009
}
10101010

1011-
let receiver = t.receiver();
1011+
let receiver = t.receiver().await;
10121012

10131013
if !rsid.is_empty() {
10141014
return receiver
@@ -1210,7 +1210,7 @@ impl PeerConnectionInternal {
12101210
}
12111211
let mut track_infos = vec![];
12121212
for transeiver in transceivers {
1213-
let receiver = transeiver.receiver();
1213+
let receiver = transeiver.receiver().await;
12141214

12151215
if let Some(mid) = transeiver.mid() {
12161216
let tracks = receiver.tracks().await;
@@ -1335,7 +1335,7 @@ impl PeerConnectionInternal {
13351335
}
13361336
let mut track_infos = vec![];
13371337
for transceiver in transceivers {
1338-
let sender = transceiver.sender();
1338+
let sender = transceiver.sender().await;
13391339

13401340
let mid = match transceiver.mid() {
13411341
Some(mid) => mid,

webrtc/src/peer_connection/peer_connection_test.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
use super::*;
22

3+
use crate::api::interceptor_registry::register_default_interceptors;
4+
use crate::api::media_engine::MediaEngine;
35
use crate::api::media_engine::MIME_TYPE_VP8;
46
use crate::api::APIBuilder;
57
use crate::ice_transport::ice_candidate_pair::RTCIceCandidatePair;
8+
use crate::ice_transport::ice_server::RTCIceServer;
9+
use crate::peer_connection::configuration::RTCConfiguration;
610
use crate::rtp_transceiver::rtp_codec::RTCRtpCodecCapability;
711
use crate::stats::StatsReportType;
812
use crate::track::track_local::track_local_static_sample::TrackLocalStaticSample;
13+
use crate::Error;
14+
use interceptor::registry::Registry;
15+
916
use bytes::Bytes;
1017
use media::Sample;
1118
use std::sync::atomic::AtomicU32;
19+
use std::sync::Arc;
1220
use tokio::time::Duration;
1321
use util::vnet::net::{Net, NetConfig};
1422
use util::vnet::router::{Router, RouterConfig};
@@ -374,3 +382,43 @@ async fn test_get_stats() -> Result<()> {
374382

375383
Ok(())
376384
}
385+
386+
#[tokio::test]
387+
async fn test_peer_connection_close_is_send() -> Result<()> {
388+
let handle = tokio::spawn(async move { peer().await });
389+
tokio::join!(handle).0.unwrap()
390+
}
391+
392+
async fn peer() -> Result<()> {
393+
let mut m = MediaEngine::default();
394+
m.register_default_codecs()?;
395+
let mut registry = Registry::new();
396+
registry = register_default_interceptors(registry, &mut m)?;
397+
let api = APIBuilder::new()
398+
.with_media_engine(m)
399+
.with_interceptor_registry(registry)
400+
.build();
401+
402+
let config = RTCConfiguration {
403+
ice_servers: vec![RTCIceServer {
404+
urls: vec!["stun:stun.l.google.com:19302".to_owned()],
405+
..Default::default()
406+
}],
407+
..Default::default()
408+
};
409+
410+
let peer_connection = Arc::new(api.new_peer_connection(config).await?);
411+
412+
let offer = peer_connection.create_offer(None).await?;
413+
let mut gather_complete = peer_connection.gathering_complete_promise().await;
414+
peer_connection.set_local_description(offer).await?;
415+
let _ = gather_complete.recv().await;
416+
417+
if peer_connection.local_description().await.is_some() {
418+
//TODO?
419+
}
420+
421+
peer_connection.close().await?;
422+
423+
Ok(())
424+
}

webrtc/src/peer_connection/sdp/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ pub(crate) async fn add_transceiver_sdp(
463463
}
464464
if codecs.is_empty() {
465465
// If we are sender and we have no codecs throw an error early
466-
if t.sender().track().await.is_some() {
466+
if t.sender().await.track().await.is_some() {
467467
return Err(Error::ErrSenderWithNoCodecs);
468468
}
469469

@@ -530,7 +530,7 @@ pub(crate) async fn add_transceiver_sdp(
530530
}
531531

532532
for mt in transceivers {
533-
let sender = mt.sender();
533+
let sender = mt.sender().await;
534534
if let Some(track) = sender.track().await {
535535
media = media.with_media_source(
536536
sender.ssrc,

webrtc/src/peer_connection/sdp/sdp_test.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -642,17 +642,19 @@ async fn test_media_description_fingerprints() -> Result<()> {
642642
"video".to_owned(),
643643
"webrtc-rs".to_owned(),
644644
));
645-
media[i].transceivers[0].set_sender(Arc::new(
646-
RTCRtpSender::new(
647-
api.setting_engine.get_receive_mtu(),
648-
Some(track),
649-
Arc::new(RTCDtlsTransport::default()),
650-
Arc::clone(&api.media_engine),
651-
Arc::clone(&interceptor),
652-
false,
653-
)
654-
.await,
655-
));
645+
media[i].transceivers[0]
646+
.set_sender(Arc::new(
647+
RTCRtpSender::new(
648+
api.setting_engine.get_receive_mtu(),
649+
Some(track),
650+
Arc::new(RTCDtlsTransport::default()),
651+
Arc::clone(&api.media_engine),
652+
Arc::clone(&interceptor),
653+
false,
654+
)
655+
.await,
656+
))
657+
.await;
656658
media[i].transceivers[0].set_direction_internal(RTCRtpTransceiverDirection::Sendonly);
657659
}
658660

0 commit comments

Comments
 (0)