@@ -19,11 +19,11 @@ use crate::track::{TrackStream, TrackStreams};
19
19
use interceptor:: stream_info:: RTPHeaderExtension ;
20
20
use interceptor:: { Attributes , Interceptor } ;
21
21
use std:: sync:: Arc ;
22
- use tokio:: sync:: { mpsc, Mutex , Notify } ;
22
+ use tokio:: sync:: { mpsc, Mutex , Notify , RwLock } ;
23
23
24
24
pub struct RTPReceiverInternal {
25
25
pub ( crate ) kind : RTPCodecType ,
26
- tracks : Mutex < Vec < TrackStreams > > ,
26
+ tracks : RwLock < Vec < TrackStreams > > ,
27
27
closed_rx : Arc < Notify > ,
28
28
received_rx : Mutex < mpsc:: Receiver < ( ) > > ,
29
29
@@ -37,65 +37,71 @@ pub struct RTPReceiverInternal {
37
37
impl RTPReceiverInternal {
38
38
/// read reads incoming RTCP for this RTPReceiver
39
39
async fn read ( & self , b : & mut [ u8 ] ) -> Result < ( usize , Attributes ) > {
40
- let mut received_rx = self . received_rx . lock ( ) . await ;
41
-
42
- tokio:: select! {
43
- _ = received_rx. recv( ) =>{
44
- let tracks = self . tracks. lock( ) . await ;
45
- if let Some ( t) = tracks. first( ) {
46
- if let Some ( rtcp_interceptor) = & t. stream. rtcp_interceptor{
47
- let a = Attributes :: new( ) ;
48
- tokio:: select! {
49
- _ = self . closed_rx. notified( ) => {
50
- Err ( Error :: ErrClosedPipe )
51
- }
52
- result = rtcp_interceptor. read( b, & a) => {
53
- Ok ( result?)
54
- }
55
- }
56
- } else{
57
- Err ( Error :: ErrInterceptorNotBind )
58
- }
59
- } else{
60
- Err ( Error :: ErrExistingTrack )
40
+ {
41
+ let mut received_rx = self . received_rx . lock ( ) . await ;
42
+ tokio:: select! {
43
+ _ = received_rx. recv( ) =>{
44
+ // Drop into the below code and don't hold this lock any longer
45
+ }
46
+ _ = self . closed_rx. notified( ) => {
47
+ return Err ( Error :: ErrClosedPipe ) ;
61
48
}
62
49
}
63
- _ = self . closed_rx. notified( ) => {
64
- Err ( Error :: ErrClosedPipe )
50
+ }
51
+
52
+ let tracks = self . tracks . read ( ) . await ;
53
+ if let Some ( t) = tracks. first ( ) {
54
+ if let Some ( rtcp_interceptor) = & t. stream . rtcp_interceptor {
55
+ let a = Attributes :: new ( ) ;
56
+ tokio:: select! {
57
+ _ = self . closed_rx. notified( ) => {
58
+ Err ( Error :: ErrClosedPipe )
59
+ }
60
+ result = rtcp_interceptor. read( b, & a) => {
61
+ Ok ( result?)
62
+ }
63
+ }
64
+ } else {
65
+ Err ( Error :: ErrInterceptorNotBind )
65
66
}
67
+ } else {
68
+ Err ( Error :: ErrExistingTrack )
66
69
}
67
70
}
68
71
69
72
/// read_simulcast reads incoming RTCP for this RTPReceiver for given rid
70
73
async fn read_simulcast ( & self , b : & mut [ u8 ] , rid : & str ) -> Result < ( usize , Attributes ) > {
71
- let mut received_rx = self . received_rx . lock ( ) . await ;
72
-
73
- tokio:: select! {
74
- _ = received_rx. recv( ) =>{
75
- let tracks = self . tracks. lock( ) . await ;
76
- for t in & * tracks{
77
- if t. track. rid( ) == rid {
78
- if let Some ( rtcp_interceptor) = & t. stream. rtcp_interceptor{
79
- let a = Attributes :: new( ) ;
80
- tokio:: select! {
81
- _ = self . closed_rx. notified( ) => {
82
- return Err ( Error :: ErrClosedPipe ) ;
83
- }
84
- result = rtcp_interceptor. read( b, & a) => {
85
- return Ok ( result?) ;
86
- }
87
- }
88
- } else{
89
- return Err ( Error :: ErrInterceptorNotBind ) ;
74
+ {
75
+ let mut received_rx = self . received_rx . lock ( ) . await ;
76
+ tokio:: select! {
77
+ _ = received_rx. recv( ) =>{
78
+ // Drop into the below code and don't hold this lock any longer
79
+ }
80
+ _ = self . closed_rx. notified( ) => {
81
+ return Err ( Error :: ErrClosedPipe ) ;
82
+ }
83
+ }
84
+ }
85
+
86
+ let tracks = self . tracks . read ( ) . await ;
87
+ for t in & * tracks {
88
+ if t. track . rid ( ) == rid {
89
+ if let Some ( rtcp_interceptor) = & t. stream . rtcp_interceptor {
90
+ let a = Attributes :: new ( ) ;
91
+ tokio:: select! {
92
+ _ = self . closed_rx. notified( ) => {
93
+ return Err ( Error :: ErrClosedPipe ) ;
94
+ }
95
+ result = rtcp_interceptor. read( b, & a) => {
96
+ return Ok ( result?) ;
90
97
}
91
98
}
99
+ } else {
100
+ return Err ( Error :: ErrInterceptorNotBind ) ;
92
101
}
93
- Err ( Error :: ErrRTPReceiverForRIDTrackStreamNotFound )
94
- }
95
- _ = self . closed_rx. notified( ) => {
96
- Err ( Error :: ErrClosedPipe )
97
102
}
98
103
}
104
+ Err ( Error :: ErrRTPReceiverForRIDTrackStreamNotFound )
99
105
}
100
106
101
107
/// read_rtcp is a convenience method that wraps Read and unmarshal for you.
@@ -138,7 +144,7 @@ impl RTPReceiverInternal {
138
144
let mut rtp_interceptor = None ;
139
145
//let mut ssrc = 0;
140
146
{
141
- let tracks = self . tracks . lock ( ) . await ;
147
+ let tracks = self . tracks . read ( ) . await ;
142
148
for t in & * tracks {
143
149
if t. track . tid ( ) == tid {
144
150
rtp_interceptor = t. stream . rtp_interceptor . clone ( ) ;
@@ -246,7 +252,7 @@ impl RTCRtpReceiver {
246
252
internal : Arc :: new ( RTPReceiverInternal {
247
253
kind,
248
254
249
- tracks : Mutex :: new ( vec ! [ ] ) ,
255
+ tracks : RwLock :: new ( vec ! [ ] ) ,
250
256
transport,
251
257
media_engine,
252
258
interceptor,
@@ -296,7 +302,7 @@ impl RTCRtpReceiver {
296
302
} ) ;
297
303
}
298
304
299
- let mut tracks = self . internal . tracks . lock ( ) . await ;
305
+ let mut tracks = self . internal . tracks . write ( ) . await ;
300
306
for ( idx, codec) in params. codecs . iter ( ) . enumerate ( ) {
301
307
let t = & mut tracks[ idx] ;
302
308
if let Some ( stream_info) = & mut t. stream . stream_info {
@@ -311,18 +317,18 @@ impl RTCRtpReceiver {
311
317
312
318
/// track returns the RtpTransceiver TrackRemote
313
319
pub async fn track ( & self ) -> Option < Arc < TrackRemote > > {
314
- let tracks = self . internal . tracks . lock ( ) . await ;
320
+ let tracks = self . internal . tracks . read ( ) . await ;
315
321
if tracks. len ( ) != 1 {
316
322
None
317
323
} else {
318
324
tracks. first ( ) . map ( |t| Arc :: clone ( & t. track ) )
319
325
}
320
326
}
321
327
322
- /// tracks returns the RtpTransceiver tracks
328
+ /// tracks returns the RtpTransceiver traclockks
323
329
/// A RTPReceiver to support Simulcast may now have multiple tracks
324
330
pub async fn tracks ( & self ) -> Vec < Arc < TrackRemote > > {
325
- let tracks = self . internal . tracks . lock ( ) . await ;
331
+ let tracks = self . internal . tracks . read ( ) . await ;
326
332
tracks. iter ( ) . map ( |t| Arc :: clone ( & t. track ) ) . collect ( )
327
333
}
328
334
@@ -406,7 +412,7 @@ impl RTCRtpReceiver {
406
412
} ;
407
413
408
414
{
409
- let mut tracks = self . internal . tracks . lock ( ) . await ;
415
+ let mut tracks = self . internal . tracks . write ( ) . await ;
410
416
tracks. push ( t) ;
411
417
} ;
412
418
@@ -517,7 +523,7 @@ impl RTCRtpReceiver {
517
523
518
524
let mut errs = vec ! [ ] ;
519
525
if received_tx_is_none {
520
- let tracks = self . internal . tracks . lock ( ) . await ;
526
+ let tracks = self . internal . tracks . write ( ) . await ;
521
527
for t in & * tracks {
522
528
if let Some ( rtcp_read_stream) = & t. stream . rtcp_read_stream {
523
529
if let Err ( err) = rtcp_read_stream. close ( ) . await {
@@ -575,7 +581,7 @@ impl RTCRtpReceiver {
575
581
params : RTCRtpParameters ,
576
582
stream : TrackStream ,
577
583
) -> Result < Arc < TrackRemote > > {
578
- let mut tracks = self . internal . tracks . lock ( ) . await ;
584
+ let mut tracks = self . internal . tracks . write ( ) . await ;
579
585
for t in & mut * tracks {
580
586
if t. track . rid ( ) == rid {
581
587
t. track . set_kind ( self . kind ) ;
@@ -602,7 +608,7 @@ impl RTCRtpReceiver {
602
608
rsid : String ,
603
609
repair_stream : TrackStream ,
604
610
) -> Result < ( ) > {
605
- let mut tracks = self . internal . tracks . lock ( ) . await ;
611
+ let mut tracks = self . internal . tracks . write ( ) . await ;
606
612
let l = tracks. len ( ) ;
607
613
for t in & mut * tracks {
608
614
if ( ssrc != 0 && l == 1 ) || t. track . rid ( ) == rsid {
0 commit comments