@@ -2,7 +2,7 @@ use std::collections::VecDeque;
2
2
use std:: sync:: Weak ;
3
3
4
4
use super :: * ;
5
- use crate :: rtp_transceiver:: create_stream_info;
5
+ use crate :: rtp_transceiver:: { create_stream_info, PayloadType } ;
6
6
use crate :: stats:: stats_collector:: StatsCollector ;
7
7
use crate :: stats:: {
8
8
InboundRTPStats , OutboundRTPStats , RTCStatsType , RemoteInboundRTPStats , RemoteOutboundRTPStats ,
@@ -15,7 +15,6 @@ use arc_swap::ArcSwapOption;
15
15
use portable_atomic:: AtomicIsize ;
16
16
use smol_str:: SmolStr ;
17
17
use tokio:: time:: Instant ;
18
- use util:: Unmarshal ;
19
18
20
19
pub ( crate ) struct PeerConnectionInternal {
21
20
/// a value containing the last known greater mid value
@@ -309,8 +308,12 @@ impl PeerConnectionInternal {
309
308
}
310
309
} ;
311
310
312
- let stream = match srtp_session. accept ( ) . await {
313
- Ok ( stream) => stream,
311
+ let ( stream, header) = match srtp_session. accept ( ) . await {
312
+ Ok ( ( stream, Some ( header) ) ) => ( stream, header) ,
313
+ Ok ( ( _, None ) ) => {
314
+ log:: error!( "Accepting RTP session, without RTP header?" ) ;
315
+ return ;
316
+ }
314
317
Err ( err) => {
315
318
log:: warn!( "Failed to accept RTP {}" , err) ;
316
319
return ;
@@ -338,16 +341,16 @@ impl PeerConnectionInternal {
338
341
let pci = Arc :: clone ( & pci) ;
339
342
tokio:: spawn ( async move {
340
343
let ssrc = stream. get_ssrc ( ) ;
341
-
342
344
dtls_transport
343
345
. store_simulcast_stream ( ssrc, Arc :: clone ( & stream) )
344
346
. await ;
345
347
346
- if let Err ( err) = pci. handle_incoming_ssrc ( stream, ssrc) . await {
348
+ if let Err ( err) = pci
349
+ . handle_incoming_rtp_stream ( stream, header. payload_type )
350
+ . await
351
+ {
347
352
log:: warn!(
348
- "Incoming unhandled RTP ssrc({}), on_track will not be fired. {}" ,
349
- ssrc,
350
- err
353
+ "Incoming unhandled RTP ssrc({ssrc}), on_track will not be fired. {err}"
351
354
) ;
352
355
}
353
356
@@ -370,17 +373,18 @@ impl PeerConnectionInternal {
370
373
}
371
374
} ;
372
375
373
- let stream = match srtcp_session. accept ( ) . await {
374
- Ok ( stream) => stream,
376
+ match srtcp_session. accept ( ) . await {
377
+ Ok ( ( stream, _) ) => {
378
+ let ssrc = stream. get_ssrc ( ) ;
379
+ log:: warn!(
380
+ "Incoming unhandled RTCP ssrc({ssrc}), on_track will not be fired"
381
+ ) ;
382
+ }
375
383
Err ( err) => {
376
- log:: warn!( "Failed to accept RTCP {}" , err ) ;
384
+ log:: warn!( "Failed to accept RTCP {err}" ) ;
377
385
return ;
378
386
}
379
387
} ;
380
- log:: warn!(
381
- "Incoming unhandled RTCP ssrc({}), on_track will not be fired" ,
382
- stream. get_ssrc( )
383
- ) ;
384
388
}
385
389
} ) ;
386
390
}
@@ -1002,18 +1006,18 @@ impl PeerConnectionInternal {
1002
1006
Ok ( true )
1003
1007
}
1004
1008
1005
- async fn handle_incoming_ssrc (
1009
+ async fn handle_incoming_rtp_stream (
1006
1010
self : & Arc < Self > ,
1007
1011
rtp_stream : Arc < Stream > ,
1008
- ssrc : SSRC ,
1012
+ payload_type : PayloadType ,
1009
1013
) -> Result < ( ) > {
1014
+ let ssrc = rtp_stream. get_ssrc ( ) ;
1010
1015
let parsed = match self . remote_description ( ) . await . and_then ( |rd| rd. parsed ) {
1011
1016
Some ( r) => r,
1012
1017
None => return Err ( Error :: ErrPeerConnRemoteDescriptionNil ) ,
1013
1018
} ;
1014
1019
// If the remote SDP was only one media section the ssrc doesn't have to be explicitly declared
1015
- let handled = self . handle_undeclared_ssrc ( ssrc, & parsed) . await ?;
1016
- if handled {
1020
+ if self . handle_undeclared_ssrc ( ssrc, & parsed) . await ? {
1017
1021
return Ok ( ( ) ) ;
1018
1022
}
1019
1023
@@ -1046,26 +1050,6 @@ impl PeerConnectionInternal {
1046
1050
} )
1047
1051
. await ;
1048
1052
1049
- // Packets that we read as part of simulcast probing that we need to make available
1050
- // if we do find a track later.
1051
- let mut buffered_packets: VecDeque < ( rtp:: packet:: Packet , Attributes ) > = VecDeque :: default ( ) ;
1052
-
1053
- let mut buf = vec ! [ 0u8 ; self . setting_engine. get_receive_mtu( ) ] ;
1054
- let n = rtp_stream. read ( & mut buf) . await ?;
1055
- let mut b = & buf[ ..n] ;
1056
-
1057
- let ( mut mid, mut rid, mut rsid, payload_type) = handle_unknown_rtp_packet (
1058
- b,
1059
- mid_extension_id as u8 ,
1060
- sid_extension_id as u8 ,
1061
- rsid_extension_id as u8 ,
1062
- ) ?;
1063
-
1064
- let packet = rtp:: packet:: Packet :: unmarshal ( & mut b) . unwrap ( ) ;
1065
-
1066
- // TODO: Can we have attributes on the first packets?
1067
- buffered_packets. push_back ( ( packet, Attributes :: new ( ) ) ) ;
1068
-
1069
1053
let params = self
1070
1054
. media_engine
1071
1055
. get_rtp_parameters_by_payload_type ( payload_type)
@@ -1089,21 +1073,24 @@ impl PeerConnectionInternal {
1089
1073
. streams_for_ssrc ( ssrc, & stream_info, & icpr)
1090
1074
. await ?;
1091
1075
1092
- let a = Attributes :: new ( ) ;
1076
+ // Packets that we read as part of simulcast probing that we need to make available
1077
+ // if we do find a track later.
1078
+ let mut buffered_packets: VecDeque < ( rtp:: packet:: Packet , Attributes ) > = VecDeque :: default ( ) ;
1079
+ let mut buf = vec ! [ 0u8 ; self . setting_engine. get_receive_mtu( ) ] ;
1080
+
1093
1081
for _ in 0 ..=SIMULCAST_PROBE_COUNT {
1082
+ let ( pkt, a) = rtp_interceptor
1083
+ . read ( & mut buf, & stream_info. attributes )
1084
+ . await ?;
1085
+ let ( mid, rid, rsid) = get_stream_mid_rid (
1086
+ & pkt. header ,
1087
+ mid_extension_id as u8 ,
1088
+ sid_extension_id as u8 ,
1089
+ rsid_extension_id as u8 ,
1090
+ ) ?;
1091
+ buffered_packets. push_back ( ( pkt, a. clone ( ) ) ) ;
1092
+
1094
1093
if mid. is_empty ( ) || ( rid. is_empty ( ) && rsid. is_empty ( ) ) {
1095
- let ( pkt, _) = rtp_interceptor. read ( & mut buf, & a) . await ?;
1096
- let ( m, r, rs, _) = handle_unknown_rtp_packet (
1097
- & buf[ ..n] ,
1098
- mid_extension_id as u8 ,
1099
- sid_extension_id as u8 ,
1100
- rsid_extension_id as u8 ,
1101
- ) ?;
1102
- mid = m;
1103
- rid = r;
1104
- rsid = rs;
1105
-
1106
- buffered_packets. push_back ( ( pkt, a. clone ( ) ) ) ;
1107
1094
continue ;
1108
1095
}
1109
1096
@@ -1544,3 +1531,34 @@ fn capitalize(s: &str) -> String {
1544
1531
1545
1532
result
1546
1533
}
1534
+
1535
+ fn get_stream_mid_rid (
1536
+ header : & rtp:: header:: Header ,
1537
+ mid_extension_id : u8 ,
1538
+ sid_extension_id : u8 ,
1539
+ rsid_extension_id : u8 ,
1540
+ ) -> Result < ( String , String , String ) > {
1541
+ if !header. extension {
1542
+ return Ok ( ( String :: new ( ) , String :: new ( ) , String :: new ( ) ) ) ;
1543
+ }
1544
+
1545
+ let mid = if let Some ( payload) = header. get_extension ( mid_extension_id) {
1546
+ String :: from_utf8 ( payload. to_vec ( ) ) ?
1547
+ } else {
1548
+ String :: new ( )
1549
+ } ;
1550
+
1551
+ let rid = if let Some ( payload) = header. get_extension ( sid_extension_id) {
1552
+ String :: from_utf8 ( payload. to_vec ( ) ) ?
1553
+ } else {
1554
+ String :: new ( )
1555
+ } ;
1556
+
1557
+ let srid = if let Some ( payload) = header. get_extension ( rsid_extension_id) {
1558
+ String :: from_utf8 ( payload. to_vec ( ) ) ?
1559
+ } else {
1560
+ String :: new ( )
1561
+ } ;
1562
+
1563
+ Ok ( ( mid, rid, srid) )
1564
+ }
0 commit comments