@@ -3,7 +3,6 @@ use async_trait::async_trait;
3
3
use clap:: { App , AppSettings , Arg } ;
4
4
use hyper:: service:: { make_service_fn, service_fn} ;
5
5
use hyper:: { Body , Method , Request , Response , Server , StatusCode } ;
6
- use interceptor:: registry:: Registry ;
7
6
use std:: any:: Any ;
8
7
use std:: io:: Write ;
9
8
use std:: net:: SocketAddr ;
@@ -14,17 +13,19 @@ use tokio_util::codec::{BytesCodec, FramedRead};
14
13
use webrtc:: api:: interceptor_registry:: register_default_interceptors;
15
14
use webrtc:: api:: media_engine:: MediaEngine ;
16
15
use webrtc:: api:: APIBuilder ;
17
- use webrtc:: media:: rtp:: rtp_codec:: { RTCRtpCodecParameters , RTPCodecType } ;
18
- use webrtc:: media:: rtp:: rtp_receiver:: RTCRtpReceiver ;
19
- use webrtc:: media:: track:: track_local:: { TrackLocal , TrackLocalContext } ;
20
- use webrtc:: media:: track:: track_remote:: TrackRemote ;
21
- use webrtc:: peer:: configuration:: RTCConfiguration ;
22
- use webrtc:: peer:: ice:: ice_connection_state:: RTCIceConnectionState ;
23
- use webrtc:: peer:: ice:: ice_server:: RTCIceServer ;
24
- use webrtc:: peer:: peer_connection:: RTCPeerConnection ;
25
- use webrtc:: peer:: peer_connection_state:: RTCPeerConnectionState ;
26
- use webrtc:: peer:: sdp:: session_description:: RTCSessionDescription ;
27
- use webrtc:: peer:: signaling_state:: RTCSignalingState ;
16
+ use webrtc:: ice_transport:: ice_connection_state:: RTCIceConnectionState ;
17
+ use webrtc:: ice_transport:: ice_server:: RTCIceServer ;
18
+ use webrtc:: interceptor:: registry:: Registry ;
19
+ use webrtc:: peer_connection:: configuration:: RTCConfiguration ;
20
+ use webrtc:: peer_connection:: peer_connection_state:: RTCPeerConnectionState ;
21
+ use webrtc:: peer_connection:: sdp:: session_description:: RTCSessionDescription ;
22
+ use webrtc:: peer_connection:: signaling_state:: RTCSignalingState ;
23
+ use webrtc:: peer_connection:: RTCPeerConnection ;
24
+ use webrtc:: rtp_transceiver:: rtp_codec:: { RTCRtpCodecParameters , RTPCodecType } ;
25
+ use webrtc:: rtp_transceiver:: rtp_receiver:: RTCRtpReceiver ;
26
+ use webrtc:: rtp_transceiver:: RTCRtpTransceiver ;
27
+ use webrtc:: track:: track_local:: { TrackLocal , TrackLocalContext } ;
28
+ use webrtc:: track:: track_remote:: TrackRemote ;
28
29
29
30
#[ macro_use]
30
31
extern crate lazy_static;
@@ -173,8 +174,7 @@ async fn process_offer(req: Request<Body>) -> Result<Response<Body>, hyper::Erro
173
174
} ) ;
174
175
}
175
176
Box :: pin ( async { } )
176
- } ) )
177
- . await ;
177
+ } ) ) ;
178
178
179
179
let audio_track = Arc :: new ( EchoTrack :: new (
180
180
"audio" . to_owned ( ) ,
@@ -203,52 +203,51 @@ async fn process_offer(req: Request<Body>) -> Result<Response<Body>, hyper::Erro
203
203
} ;
204
204
205
205
pc. on_track ( Box :: new (
206
- move |track : Option < Arc < TrackRemote > > , _receiver : Option < Arc < RTCRtpReceiver > > | {
206
+ move |track : Arc < TrackRemote > ,
207
+ _receiver : Arc < RTCRtpReceiver > ,
208
+ _transceiver : Arc < RTCRtpTransceiver > | {
207
209
let audio_track2 = Arc :: clone ( & audio_track) ;
208
210
let video_track2 = Arc :: clone ( & video_track) ;
209
211
Box :: pin ( async move {
210
- if let Some ( track) = track {
211
- let mime_type = track. codec ( ) . await . capability . mime_type ;
212
- let out_track = if mime_type. starts_with ( "audio" ) {
213
- audio_track2
214
- } else {
215
- video_track2
212
+ let mime_type = track. codec ( ) . capability . mime_type ;
213
+ let out_track = if mime_type. starts_with ( "audio" ) {
214
+ audio_track2
215
+ } else {
216
+ video_track2
217
+ } ;
218
+
219
+ println ! (
220
+ "Track has started, of type {}: {}" ,
221
+ track. payload_type( ) ,
222
+ mime_type
223
+ ) ;
224
+ tokio:: spawn ( async move {
225
+ let ( ssrc, write_stream) = {
226
+ let ctx = out_track. ctx . lock ( ) . await ;
227
+ ( ctx[ 0 ] . ssrc ( ) , ctx[ 0 ] . write_stream ( ) )
216
228
} ;
229
+ while let Ok ( ( mut rtp, _) ) = track. read_rtp ( ) . await {
230
+ rtp. header . ssrc = ssrc;
231
+ if let Some ( ws) = & write_stream {
232
+ if let Err ( err) = ws. write_rtp ( & rtp) . await {
233
+ println ! ( "write_stream.write_rtp err: {}" , err) ;
234
+ break ;
235
+ }
236
+ } else {
237
+ println ! ( "write_stream is none" ) ;
238
+ break ;
239
+ }
240
+ }
217
241
218
242
println ! (
219
- "Track has started , of type {}: {}" ,
243
+ "Track has ended , of type {}: {}" ,
220
244
track. payload_type( ) ,
221
245
mime_type
222
246
) ;
223
- tokio:: spawn ( async move {
224
- let ( ssrc, write_stream) = {
225
- let ctx = out_track. ctx . lock ( ) . await ;
226
- ( ctx[ 0 ] . ssrc ( ) , ctx[ 0 ] . write_stream ( ) )
227
- } ;
228
- while let Ok ( ( mut rtp, _) ) = track. read_rtp ( ) . await {
229
- rtp. header . ssrc = ssrc;
230
- if let Some ( ws) = & write_stream {
231
- if let Err ( err) = ws. write_rtp ( & rtp) . await {
232
- println ! ( "write_stream.write_rtp err: {}" , err) ;
233
- break ;
234
- }
235
- } else {
236
- println ! ( "write_stream is none" ) ;
237
- break ;
238
- }
239
- }
240
-
241
- println ! (
242
- "Track has ended, of type {}: {}" ,
243
- track. payload_type( ) ,
244
- mime_type
245
- ) ;
246
- } ) ;
247
- }
247
+ } ) ;
248
248
} )
249
249
} ,
250
- ) )
251
- . await ;
250
+ ) ) ;
252
251
253
252
let stats_id = pc. get_stats_id ( ) . to_owned ( ) ;
254
253
pc. on_peer_connection_state_change ( Box :: new ( move |state : RTCPeerConnectionState | {
@@ -257,15 +256,13 @@ async fn process_offer(req: Request<Body>) -> Result<Response<Body>, hyper::Erro
257
256
stats_id, state
258
257
) ;
259
258
Box :: pin ( async { } )
260
- } ) )
261
- . await ;
259
+ } ) ) ;
262
260
263
261
let stats_id = pc. get_stats_id ( ) . to_owned ( ) ;
264
262
pc. on_signaling_state_change ( Box :: new ( move |state : RTCSignalingState | {
265
263
println ! ( "Signaling state {} has changed to {}." , stats_id, state) ;
266
264
Box :: pin ( async { } )
267
- } ) )
268
- . await ;
265
+ } ) ) ;
269
266
270
267
if let Err ( err) = pc. set_remote_description ( offer) . await {
271
268
panic ! ( "{}" , err) ;
@@ -418,7 +415,10 @@ impl EchoTrack {
418
415
419
416
#[ async_trait]
420
417
impl TrackLocal for EchoTrack {
421
- async fn bind ( & self , c : & TrackLocalContext ) -> std:: result:: Result < RTCRtpCodecParameters , webrtc:: Error > {
418
+ async fn bind (
419
+ & self ,
420
+ c : & TrackLocalContext ,
421
+ ) -> std:: result:: Result < RTCRtpCodecParameters , webrtc:: Error > {
422
422
let mut ctx = self . ctx . lock ( ) . await ;
423
423
ctx. push ( c. clone ( ) ) ;
424
424
0 commit comments