@@ -64,7 +64,6 @@ use crate::sctp_transport::sctp_transport_capabilities::SCTPTransportCapabilitie
64
64
use crate :: sctp_transport:: sctp_transport_state:: RTCSctpTransportState ;
65
65
use crate :: sctp_transport:: RTCSctpTransport ;
66
66
use crate :: stats:: StatsReport ;
67
- use crate :: track:: track_local:: track_local_static_sample:: TrackLocalStaticSample ;
68
67
use crate :: track:: track_local:: TrackLocal ;
69
68
use crate :: track:: track_remote:: TrackRemote ;
70
69
@@ -470,17 +469,7 @@ impl RTCPeerConnection {
470
469
None => return true , // doesn't contain a single a=msid line
471
470
} ;
472
471
473
- let sender = match t. sender ( ) . await {
474
- Some ( s) => s. clone ( ) ,
475
- None => {
476
- log:: warn!(
477
- "RtpSender missing for transeceiver with sending direction {} for mid {:?}" ,
478
- t. direction( ) ,
479
- mid
480
- ) ;
481
- continue ;
482
- }
483
- } ;
472
+ let sender = t. sender ( ) . await ;
484
473
// (...)or the number of MSIDs from the a=msid lines in this m= section,
485
474
// or the MSID values themselves, differ from what is in
486
475
// transceiver.sender.[[AssociatedMediaStreamIds]], return true.
@@ -1372,23 +1361,38 @@ impl RTCPeerConnection {
1372
1361
t. set_mid ( mid_value. to_owned ( ) ) ?;
1373
1362
}
1374
1363
} else {
1364
+ let local_direction =
1365
+ if direction == RTCRtpTransceiverDirection :: Recvonly {
1366
+ RTCRtpTransceiverDirection :: Sendonly
1367
+ } else {
1368
+ RTCRtpTransceiverDirection :: Recvonly
1369
+ } ;
1370
+
1371
+ let receive_mtu = self . internal . setting_engine . get_receive_mtu ( ) ;
1372
+
1375
1373
let receiver = Arc :: new ( RTCRtpReceiver :: new (
1376
- self . internal . setting_engine . get_receive_mtu ( ) ,
1374
+ receive_mtu ,
1377
1375
kind,
1378
1376
Arc :: clone ( & self . internal . dtls_transport ) ,
1379
1377
Arc :: clone ( & self . internal . media_engine ) ,
1380
1378
Arc :: clone ( & self . interceptor ) ,
1381
1379
) ) ;
1382
1380
1383
- let local_direction =
1384
- if direction == RTCRtpTransceiverDirection :: Recvonly {
1385
- RTCRtpTransceiverDirection :: Sendonly
1386
- } else {
1387
- RTCRtpTransceiverDirection :: Recvonly
1388
- } ;
1381
+ let sender = Arc :: new (
1382
+ RTCRtpSender :: new (
1383
+ receive_mtu,
1384
+ None ,
1385
+ Arc :: clone ( & self . internal . dtls_transport ) ,
1386
+ Arc :: clone ( & self . internal . media_engine ) ,
1387
+ Arc :: clone ( & self . interceptor ) ,
1388
+ false ,
1389
+ )
1390
+ . await ,
1391
+ ) ;
1392
+
1389
1393
let t = RTCRtpTransceiver :: new (
1390
- Some ( receiver) ,
1391
- None ,
1394
+ receiver,
1395
+ sender ,
1392
1396
local_direction,
1393
1397
kind,
1394
1398
vec ! [ ] ,
@@ -1581,10 +1585,9 @@ impl RTCPeerConnection {
1581
1585
pub ( crate ) async fn start_rtp_senders ( & self ) -> Result < ( ) > {
1582
1586
let current_transceivers = self . internal . rtp_transceivers . lock ( ) . await ;
1583
1587
for transceiver in & * current_transceivers {
1584
- if let Some ( sender) = transceiver. sender ( ) . await {
1585
- if sender. is_negotiated ( ) && !sender. has_sent ( ) . await {
1586
- sender. send ( & sender. get_parameters ( ) . await ) . await ?;
1587
- }
1588
+ let sender = transceiver. sender ( ) . await ;
1589
+ if sender. is_negotiated ( ) && !sender. has_sent ( ) . await {
1590
+ sender. send ( & sender. get_parameters ( ) . await ) . await ?;
1588
1591
}
1589
1592
}
1590
1593
@@ -1640,9 +1643,8 @@ impl RTCPeerConnection {
1640
1643
let mut senders = vec ! [ ] ;
1641
1644
let rtp_transceivers = self . internal . rtp_transceivers . lock ( ) . await ;
1642
1645
for transceiver in & * rtp_transceivers {
1643
- if let Some ( sender) = transceiver. sender ( ) . await {
1644
- senders. push ( sender) ;
1645
- }
1646
+ let sender = transceiver. sender ( ) . await ;
1647
+ senders. push ( sender) ;
1646
1648
}
1647
1649
senders
1648
1650
}
@@ -1652,9 +1654,7 @@ impl RTCPeerConnection {
1652
1654
let mut receivers = vec ! [ ] ;
1653
1655
let rtp_transceivers = self . internal . rtp_transceivers . lock ( ) . await ;
1654
1656
for transceiver in & * rtp_transceivers {
1655
- if let Some ( receiver) = transceiver. receiver ( ) . await {
1656
- receivers. push ( receiver) ;
1657
- }
1657
+ receivers. push ( transceiver. receiver ( ) . await ) ;
1658
1658
}
1659
1659
receivers
1660
1660
}
@@ -1677,34 +1677,22 @@ impl RTCPeerConnection {
1677
1677
{
1678
1678
let rtp_transceivers = self . internal . rtp_transceivers . lock ( ) . await ;
1679
1679
for t in & * rtp_transceivers {
1680
- if !t. stopped . load ( Ordering :: SeqCst )
1681
- && t. kind == track. kind ( )
1682
- && t. sender ( ) . await . is_none ( )
1683
- {
1684
- let sender = Arc :: new (
1685
- RTCRtpSender :: new (
1686
- self . internal . setting_engine . get_receive_mtu ( ) ,
1687
- Arc :: clone ( & track) ,
1688
- Arc :: clone ( & self . internal . dtls_transport ) ,
1689
- Arc :: clone ( & self . internal . media_engine ) ,
1690
- Arc :: clone ( & self . interceptor ) ,
1691
- false , // adding a track sets a send direction.
1692
- )
1693
- . await ,
1694
- ) ;
1695
-
1696
- if let Err ( err) = t
1697
- . set_sender_track ( Some ( Arc :: clone ( & sender) ) , Some ( Arc :: clone ( & track) ) )
1698
- . await
1699
- {
1700
- let _ = sender. stop ( ) . await ;
1701
- t. set_sender ( None ) . await ;
1702
- return Err ( err) ;
1703
- }
1680
+ if !t. stopped . load ( Ordering :: SeqCst ) && t. kind == track. kind ( ) {
1681
+ let sender = t. sender ( ) . await ;
1682
+ if sender. track ( ) . await . is_none ( ) {
1683
+ if let Err ( err) = sender. replace_track ( Some ( track) ) . await {
1684
+ let _ = sender. stop ( ) . await ;
1685
+ return Err ( err) ;
1686
+ }
1704
1687
1705
- self . internal . trigger_negotiation_needed ( ) . await ;
1688
+ t. set_direction_internal ( RTCRtpTransceiverDirection :: from_send_recv (
1689
+ true ,
1690
+ t. direction ( ) . has_recv ( ) ,
1691
+ ) ) ;
1706
1692
1707
- return Ok ( sender) ;
1693
+ self . internal . trigger_negotiation_needed ( ) . await ;
1694
+ return Ok ( sender) ;
1695
+ }
1708
1696
}
1709
1697
}
1710
1698
}
@@ -1717,10 +1705,7 @@ impl RTCPeerConnection {
1717
1705
. add_rtp_transceiver ( Arc :: clone ( & transceiver) )
1718
1706
. await ;
1719
1707
1720
- match transceiver. sender ( ) . await {
1721
- Some ( sender) => Ok ( sender) ,
1722
- None => Err ( Error :: ErrRTPSenderNil ) ,
1723
- }
1708
+ Ok ( transceiver. sender ( ) . await )
1724
1709
}
1725
1710
1726
1711
/// remove_track removes a Track from the PeerConnection
@@ -1733,11 +1718,12 @@ impl RTCPeerConnection {
1733
1718
{
1734
1719
let rtp_transceivers = self . internal . rtp_transceivers . lock ( ) . await ;
1735
1720
for t in & * rtp_transceivers {
1736
- if let Some ( s) = t. sender ( ) . await {
1737
- if s. id == sender. id {
1738
- transceiver = Some ( t. clone ( ) ) ;
1739
- break ;
1721
+ if t. sender ( ) . await . id == sender. id {
1722
+ if sender. track ( ) . await . is_none ( ) {
1723
+ return Ok ( ( ) ) ;
1740
1724
}
1725
+ transceiver = Some ( t. clone ( ) ) ;
1726
+ break ;
1741
1727
}
1742
1728
}
1743
1729
}
@@ -1766,26 +1752,24 @@ impl RTCPeerConnection {
1766
1752
pub async fn add_transceiver_from_kind (
1767
1753
& self ,
1768
1754
kind : RTPCodecType ,
1769
- init : & [ RTCRtpTransceiverInit ] ,
1755
+ init : Option < RTCRtpTransceiverInit > ,
1770
1756
) -> Result < Arc < RTCRtpTransceiver > > {
1771
1757
self . internal . add_transceiver_from_kind ( kind, init) . await
1772
1758
}
1773
1759
1774
1760
/// add_transceiver_from_track Create a new RtpTransceiver(SendRecv or SendOnly) and add it to the set of transceivers.
1775
- pub async fn add_transceiver_from_track < ' a > (
1776
- & ' a self ,
1761
+ pub async fn add_transceiver_from_track (
1762
+ & self ,
1777
1763
track : Arc < dyn TrackLocal + Send + Sync > ,
1778
- init : & ' a [ RTCRtpTransceiverInit ] ,
1764
+ init : Option < RTCRtpTransceiverInit > ,
1779
1765
) -> Result < Arc < RTCRtpTransceiver > > {
1780
1766
if self . internal . is_closed . load ( Ordering :: SeqCst ) {
1781
1767
return Err ( Error :: ErrConnectionClosed ) ;
1782
1768
}
1783
1769
1784
- let direction = match init. len ( ) {
1785
- 0 => RTCRtpTransceiverDirection :: Sendrecv ,
1786
- 1 => init[ 0 ] . direction ,
1787
- _ => return Err ( Error :: ErrPeerConnAddTransceiverFromTrackOnlyAcceptsOne ) ,
1788
- } ;
1770
+ let direction = init
1771
+ . map ( |init| init. direction )
1772
+ . unwrap_or ( RTCRtpTransceiverDirection :: Sendrecv ) ;
1789
1773
1790
1774
let t = self
1791
1775
. internal
0 commit comments