@@ -16,10 +16,8 @@ use webrtc::rtcp::payload_feedbacks::picture_loss_indication::PictureLossIndicat
16
16
use webrtc:: rtp_transceiver:: rtp_codec:: {
17
17
RTCRtpCodecCapability , RTCRtpCodecParameters , RTPCodecType ,
18
18
} ;
19
- use webrtc:: rtp_transceiver:: rtp_receiver:: RTCRtpReceiver ;
20
19
use webrtc:: track:: track_local:: track_local_static_rtp:: TrackLocalStaticRTP ;
21
20
use webrtc:: track:: track_local:: { TrackLocal , TrackLocalWriter } ;
22
- use webrtc:: track:: track_remote:: TrackRemote ;
23
21
24
22
#[ tokio:: main]
25
23
async fn main ( ) -> Result < ( ) > {
@@ -198,74 +196,71 @@ async fn main() -> Result<()> {
198
196
// Set a handler for when a new remote track starts, this handler copies inbound RTP packets,
199
197
// replaces the SSRC and sends them back
200
198
let pc = Arc :: downgrade ( & peer_connection) ;
201
- peer_connection. on_track ( Box :: new (
202
- move |track : Option < Arc < TrackRemote > > , _receiver : Option < Arc < RTCRtpReceiver > > | {
203
- if let Some ( track) = track {
204
- // Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
205
- // This is a temporary fix until we implement incoming RTCP events, then we would push a PLI only when a viewer requests it
206
- let media_ssrc = track. ssrc ( ) ;
207
-
208
- if track. kind ( ) == RTPCodecType :: Video {
209
- let pc2 = pc. clone ( ) ;
210
- tokio:: spawn ( async move {
211
- let mut result = Result :: < usize > :: Ok ( 0 ) ;
212
- while result. is_ok ( ) {
213
- let timeout = tokio:: time:: sleep ( Duration :: from_secs ( 3 ) ) ;
214
- tokio:: pin!( timeout) ;
215
-
216
- tokio:: select! {
217
- _ = timeout. as_mut( ) =>{
218
- if let Some ( pc) = pc2. upgrade( ) {
219
- result = pc. write_rtcp( & [ Box :: new( PictureLossIndication {
220
- sender_ssrc: 0 ,
221
- media_ssrc,
222
- } ) ] ) . await . map_err( Into :: into) ;
223
- } else{
224
- break ;
225
- }
226
- }
227
- } ;
199
+ peer_connection. on_track ( Box :: new ( move |track, _, _| {
200
+ // Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
201
+ // This is a temporary fix until we implement incoming RTCP events, then we would push a PLI only when a viewer requests it
202
+ let media_ssrc = track. ssrc ( ) ;
203
+
204
+ if track. kind ( ) == RTPCodecType :: Video {
205
+ let pc2 = pc. clone ( ) ;
206
+ tokio:: spawn ( async move {
207
+ let mut result = Result :: < usize > :: Ok ( 0 ) ;
208
+ while result. is_ok ( ) {
209
+ let timeout = tokio:: time:: sleep ( Duration :: from_secs ( 3 ) ) ;
210
+ tokio:: pin!( timeout) ;
211
+
212
+ tokio:: select! {
213
+ _ = timeout. as_mut( ) =>{
214
+ if let Some ( pc) = pc2. upgrade( ) {
215
+ result = pc. write_rtcp( & [ Box :: new( PictureLossIndication {
216
+ sender_ssrc: 0 ,
217
+ media_ssrc,
218
+ } ) ] ) . await . map_err( Into :: into) ;
219
+ } else{
220
+ break ;
221
+ }
228
222
}
229
- } ) ;
223
+ } ;
230
224
}
225
+ } ) ;
226
+ }
231
227
232
- let kind = if track. kind ( ) == RTPCodecType :: Audio {
233
- "audio"
234
- } else {
235
- "video"
236
- } ;
237
- let output_track = if let Some ( output_track) = output_tracks. get ( kind) {
238
- Arc :: clone ( output_track)
239
- } else {
240
- println ! ( "output_track not found for type = {}" , kind) ;
241
- return Box :: pin ( async { } ) ;
242
- } ;
243
-
244
- let output_track2 = Arc :: clone ( & output_track) ;
245
- tokio:: spawn ( async move {
246
- println ! (
247
- "Track has started, of type {}: {}" ,
248
- track. payload_type( ) ,
249
- track. codec( ) . await . capability. mime_type
250
- ) ;
251
- // Read RTP packets being sent to webrtc-rs
252
- while let Ok ( ( rtp, _) ) = track. read_rtp ( ) . await {
253
- if let Err ( err) = output_track2. write_rtp ( & rtp) . await {
254
- println ! ( "output track write_rtp got error: {}" , err) ;
255
- break ;
256
- }
257
- }
258
-
259
- println ! (
260
- "on_track finished, of type {}: {}" ,
261
- track. payload_type( ) ,
262
- track. codec( ) . await . capability. mime_type
263
- ) ;
264
- } ) ;
228
+ let kind = if track. kind ( ) == RTPCodecType :: Audio {
229
+ "audio"
230
+ } else {
231
+ "video"
232
+ } ;
233
+ let output_track = if let Some ( output_track) = output_tracks. get ( kind) {
234
+ Arc :: clone ( output_track)
235
+ } else {
236
+ println ! ( "output_track not found for type = {}" , kind) ;
237
+ return Box :: pin ( async { } ) ;
238
+ } ;
239
+
240
+ let output_track2 = Arc :: clone ( & output_track) ;
241
+ tokio:: spawn ( async move {
242
+ println ! (
243
+ "Track has started, of type {}: {}" ,
244
+ track. payload_type( ) ,
245
+ track. codec( ) . await . capability. mime_type
246
+ ) ;
247
+ // Read RTP packets being sent to webrtc-rs
248
+ while let Ok ( ( rtp, _) ) = track. read_rtp ( ) . await {
249
+ if let Err ( err) = output_track2. write_rtp ( & rtp) . await {
250
+ println ! ( "output track write_rtp got error: {}" , err) ;
251
+ break ;
252
+ }
265
253
}
266
- Box :: pin ( async { } )
267
- } ,
268
- ) ) ;
254
+
255
+ println ! (
256
+ "on_track finished, of type {}: {}" ,
257
+ track. payload_type( ) ,
258
+ track. codec( ) . await . capability. mime_type
259
+ ) ;
260
+ } ) ;
261
+
262
+ Box :: pin ( async { } )
263
+ } ) ) ;
269
264
270
265
let ( done_tx, mut done_rx) = tokio:: sync:: mpsc:: channel :: < ( ) > ( 1 ) ;
271
266
0 commit comments