Skip to content

Commit fe8b78d

Browse files
authored
Make RTCRtpTransceiver (Sender, Receiver) spec-compliant (#377)
1 parent ade6a87 commit fe8b78d

File tree

18 files changed

+473
-435
lines changed

18 files changed

+473
-435
lines changed

examples/examples/broadcast/broadcast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ async fn main() -> Result<()> {
115115

116116
// Allow us to receive 1 video track
117117
peer_connection
118-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
118+
.add_transceiver_from_kind(RTPCodecType::Video, None)
119119
.await?;
120120

121121
let (local_track_chan_tx, mut local_track_chan_rx) =

examples/examples/rtp-forwarder/rtp-forwarder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ async fn main() -> Result<()> {
137137

138138
// Allow us to receive 1 audio track, and 1 video track
139139
peer_connection
140-
.add_transceiver_from_kind(RTPCodecType::Audio, &[])
140+
.add_transceiver_from_kind(RTPCodecType::Audio, None)
141141
.await?;
142142
peer_connection
143-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
143+
.add_transceiver_from_kind(RTPCodecType::Video, None)
144144
.await?;
145145

146146
// Prepare udp conns

examples/examples/save-to-disk-h264/save-to-disk-h264.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,10 @@ async fn main() -> Result<()> {
191191

192192
// Allow us to receive 1 audio track, and 1 video track
193193
peer_connection
194-
.add_transceiver_from_kind(RTPCodecType::Audio, &[])
194+
.add_transceiver_from_kind(RTPCodecType::Audio, None)
195195
.await?;
196196
peer_connection
197-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
197+
.add_transceiver_from_kind(RTPCodecType::Video, None)
198198
.await?;
199199

200200
let notify_tx = Arc::new(Notify::new());

examples/examples/save-to-disk-vpx/save-to-disk-vpx.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,10 @@ async fn main() -> Result<()> {
216216

217217
// Allow us to receive 1 audio track, and 1 video track
218218
peer_connection
219-
.add_transceiver_from_kind(RTPCodecType::Audio, &[])
219+
.add_transceiver_from_kind(RTPCodecType::Audio, None)
220220
.await?;
221221
peer_connection
222-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
222+
.add_transceiver_from_kind(RTPCodecType::Video, None)
223223
.await?;
224224

225225
let notify_tx = Arc::new(Notify::new());

webrtc/CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,24 @@
1111

1212
* Change `RTCPeerConnection::on_track` callback signature to `|track: Arc<TrackRemote>, receiver: Arc<RTCRtpReceiver>, transceiver: Arc<RTCRtpTransceiver>|` [#355](https://github.com/webrtc-rs/webrtc/pull/355).
1313

14+
* Change `RTCRtpSender::new` signature to `|receive_mtu: usize, track: Option<Arc<dyn TrackLocal + Send + Sync>>, transport: Arc<RTCDtlsTransport>, media_engine: Arc<MediaEngine>, interceptor: Arc<dyn Interceptor + Send + Sync>, start_paused: bool,|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
15+
16+
* Change `API::new_rtp_sender` signature to `|&self, track: Option<Arc<dyn TrackLocal + Send + Sync>>, transport: Arc<RTCDtlsTransport>, interceptor: Arc<dyn Interceptor + Send + Sync>,|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
17+
18+
* Change `RTCRtpTransceiver::sender` signature to `|&self| -> Arc<RTCRtpSender>` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
19+
20+
* Change `RTCRtpTransceiver::set_sender_track` signature to `|self: &Arc<Self>, sender: Arc<RTCRtpSender>, track: Option<Arc<dyn TrackLocal + Send + Sync>>,|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
21+
22+
* Change `RTCRtpTransceiver::set_sender` signature to `|self: &Arc<Self>, s: Arc<RTCRtpSender>|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
23+
24+
* Change `RTCRtpTransceiver::receiver` signature to `|&self| -> Arc<RTCRtpReceiver>` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
25+
26+
* Change `RTCRtpTransceiver::set_receiver` signature to `|&self, r: Arc<RTCRtpReceiver>|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
27+
28+
* Change `RTCPeerConnection::add_transceiver_from_kind` signature to `|&self, kind: RTPCodecType, init: Option<RTCRtpTransceiverInit>,|`, `RTCRtpTransceiver::RTCRtpSender` сreated without a track [#377](https://github.com/webrtc-rs/webrtc/pull/377).
29+
30+
* Change `RTCPeerConnection::add_transceiver_from_track` signature to `|&self, track: Arc<dyn TrackLocal + Send + Sync>, init: Option<RTCRtpTransceiverInit>,|` [#377](https://github.com/webrtc-rs/webrtc/pull/377).
31+
1432
* Change `RTCPeerConnection::mid` return signature to `Option<String>` [#375](https://github.com/webrtc-rs/webrtc/pull/375).
1533

1634
## v0.6.0

webrtc/src/api/media_engine/media_engine_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ async fn test_opus_case() -> Result<()> {
1212
let api = APIBuilder::new().with_media_engine(m).build();
1313

1414
let pc = api.new_peer_connection(RTCConfiguration::default()).await?;
15-
pc.add_transceiver_from_kind(RTPCodecType::Audio, &[])
15+
pc.add_transceiver_from_kind(RTPCodecType::Audio, None)
1616
.await?;
1717

1818
let offer = pc.create_offer(None).await?;
@@ -32,7 +32,7 @@ async fn test_video_case() -> Result<()> {
3232
let api = APIBuilder::new().with_media_engine(m).build();
3333

3434
let pc = api.new_peer_connection(RTCConfiguration::default()).await?;
35-
pc.add_transceiver_from_kind(RTPCodecType::Video, &[])
35+
pc.add_transceiver_from_kind(RTPCodecType::Video, None)
3636
.await?;
3737

3838
let offer = pc.create_offer(None).await?;

webrtc/src/api/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ impl API {
154154
/// new_rtp_sender constructs a new RTPSender
155155
pub async fn new_rtp_sender(
156156
&self,
157-
track: Arc<dyn TrackLocal + Send + Sync>,
157+
track: Option<Arc<dyn TrackLocal + Send + Sync>>,
158158
transport: Arc<RTCDtlsTransport>,
159159
interceptor: Arc<dyn Interceptor + Send + Sync>,
160160
) -> RTCRtpSender {

webrtc/src/api/setting_engine/setting_engine_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ async fn test_setting_engine_set_disable_media_engine_copy() -> Result<()> {
161161
let (mut offerer, mut answerer) = new_pair(&api).await?;
162162

163163
offerer
164-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
164+
.add_transceiver_from_kind(RTPCodecType::Video, None)
165165
.await?;
166166

167167
signal_pair(&mut offerer, &mut answerer).await?;
@@ -244,7 +244,7 @@ async fn test_setting_engine_set_disable_media_engine_copy() -> Result<()> {
244244
let (mut offerer, mut answerer) = new_pair(&api).await?;
245245

246246
offerer
247-
.add_transceiver_from_kind(RTPCodecType::Video, &[])
247+
.add_transceiver_from_kind(RTPCodecType::Video, None)
248248
.await?;
249249

250250
signal_pair(&mut offerer, &mut answerer).await?;

webrtc/src/peer_connection/mod.rs

Lines changed: 58 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ use crate::sctp_transport::sctp_transport_capabilities::SCTPTransportCapabilitie
6464
use crate::sctp_transport::sctp_transport_state::RTCSctpTransportState;
6565
use crate::sctp_transport::RTCSctpTransport;
6666
use crate::stats::StatsReport;
67-
use crate::track::track_local::track_local_static_sample::TrackLocalStaticSample;
6867
use crate::track::track_local::TrackLocal;
6968
use crate::track::track_remote::TrackRemote;
7069

@@ -470,17 +469,7 @@ impl RTCPeerConnection {
470469
None => return true, // doesn't contain a single a=msid line
471470
};
472471

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;
484473
// (...)or the number of MSIDs from the a=msid lines in this m= section,
485474
// or the MSID values themselves, differ from what is in
486475
// transceiver.sender.[[AssociatedMediaStreamIds]], return true.
@@ -1372,23 +1361,38 @@ impl RTCPeerConnection {
13721361
t.set_mid(mid_value.to_owned())?;
13731362
}
13741363
} 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+
13751373
let receiver = Arc::new(RTCRtpReceiver::new(
1376-
self.internal.setting_engine.get_receive_mtu(),
1374+
receive_mtu,
13771375
kind,
13781376
Arc::clone(&self.internal.dtls_transport),
13791377
Arc::clone(&self.internal.media_engine),
13801378
Arc::clone(&self.interceptor),
13811379
));
13821380

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+
13891393
let t = RTCRtpTransceiver::new(
1390-
Some(receiver),
1391-
None,
1394+
receiver,
1395+
sender,
13921396
local_direction,
13931397
kind,
13941398
vec![],
@@ -1581,10 +1585,9 @@ impl RTCPeerConnection {
15811585
pub(crate) async fn start_rtp_senders(&self) -> Result<()> {
15821586
let current_transceivers = self.internal.rtp_transceivers.lock().await;
15831587
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?;
15881591
}
15891592
}
15901593

@@ -1640,9 +1643,8 @@ impl RTCPeerConnection {
16401643
let mut senders = vec![];
16411644
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16421645
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);
16461648
}
16471649
senders
16481650
}
@@ -1652,9 +1654,7 @@ impl RTCPeerConnection {
16521654
let mut receivers = vec![];
16531655
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16541656
for transceiver in &*rtp_transceivers {
1655-
if let Some(receiver) = transceiver.receiver().await {
1656-
receivers.push(receiver);
1657-
}
1657+
receivers.push(transceiver.receiver().await);
16581658
}
16591659
receivers
16601660
}
@@ -1677,34 +1677,22 @@ impl RTCPeerConnection {
16771677
{
16781678
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
16791679
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+
}
17041687

1705-
self.internal.trigger_negotiation_needed().await;
1688+
t.set_direction_internal(RTCRtpTransceiverDirection::from_send_recv(
1689+
true,
1690+
t.direction().has_recv(),
1691+
));
17061692

1707-
return Ok(sender);
1693+
self.internal.trigger_negotiation_needed().await;
1694+
return Ok(sender);
1695+
}
17081696
}
17091697
}
17101698
}
@@ -1717,10 +1705,7 @@ impl RTCPeerConnection {
17171705
.add_rtp_transceiver(Arc::clone(&transceiver))
17181706
.await;
17191707

1720-
match transceiver.sender().await {
1721-
Some(sender) => Ok(sender),
1722-
None => Err(Error::ErrRTPSenderNil),
1723-
}
1708+
Ok(transceiver.sender().await)
17241709
}
17251710

17261711
/// remove_track removes a Track from the PeerConnection
@@ -1733,11 +1718,12 @@ impl RTCPeerConnection {
17331718
{
17341719
let rtp_transceivers = self.internal.rtp_transceivers.lock().await;
17351720
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(());
17401724
}
1725+
transceiver = Some(t.clone());
1726+
break;
17411727
}
17421728
}
17431729
}
@@ -1766,26 +1752,24 @@ impl RTCPeerConnection {
17661752
pub async fn add_transceiver_from_kind(
17671753
&self,
17681754
kind: RTPCodecType,
1769-
init: &[RTCRtpTransceiverInit],
1755+
init: Option<RTCRtpTransceiverInit>,
17701756
) -> Result<Arc<RTCRtpTransceiver>> {
17711757
self.internal.add_transceiver_from_kind(kind, init).await
17721758
}
17731759

17741760
/// 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,
17771763
track: Arc<dyn TrackLocal + Send + Sync>,
1778-
init: &'a [RTCRtpTransceiverInit],
1764+
init: Option<RTCRtpTransceiverInit>,
17791765
) -> Result<Arc<RTCRtpTransceiver>> {
17801766
if self.internal.is_closed.load(Ordering::SeqCst) {
17811767
return Err(Error::ErrConnectionClosed);
17821768
}
17831769

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);
17891773

17901774
let t = self
17911775
.internal

0 commit comments

Comments
 (0)