@@ -4,7 +4,9 @@ use establish_peer_connection::connect;
4
4
5
5
use init_peer_connection:: init_peer_connection;
6
6
use packet_stream:: PacketStream ;
7
- use payloader:: { Payload , Payloader , PayloadingError } ;
7
+ use payloader:: {
8
+ AudioPayloaderOptions , Payload , Payloader , PayloadingError , VideoPayloaderOptions ,
9
+ } ;
8
10
use reqwest:: { Method , StatusCode } ;
9
11
use rtcp:: payload_feedbacks:: picture_loss_indication:: PictureLossIndication ;
10
12
use std:: {
@@ -18,7 +20,7 @@ use url::{ParseError, Url};
18
20
use webrtc:: {
19
21
api:: media_engine:: { MIME_TYPE_H264 , MIME_TYPE_OPUS , MIME_TYPE_VP8 } ,
20
22
rtp_transceiver:: {
21
- rtp_codec:: RTCRtpCodecCapability , rtp_sender:: RTCRtpSender , RTCRtpTransceiver ,
23
+ rtp_codec:: RTCRtpCodecCapability , rtp_sender:: RTCRtpSender , PayloadType , RTCRtpTransceiver ,
22
24
} ,
23
25
track:: track_local:: { track_local_static_rtp:: TrackLocalStaticRTP , TrackLocalWriter } ,
24
26
} ;
@@ -228,20 +230,29 @@ async fn run_whip_sender_task(
228
230
return ;
229
231
}
230
232
} ;
231
-
232
- let ( video_track, video_codec) =
233
+ let ( video_track, video_codec, video_payload_type) =
233
234
setup_track ( video_transceiver. clone ( ) , "video" . to_string ( ) ) . await ;
234
- let ( audio_track, audio_codec) =
235
+ let ( audio_track, audio_codec, audio_payload_type ) =
235
236
setup_track ( audio_transceiver. clone ( ) , "audio" . to_string ( ) ) . await ;
236
237
237
- let ( encoder, packet_stream) =
238
- match create_encoder_and_packet_stream ( whip_ctx. clone ( ) , video_codec, audio_codec) {
239
- Ok ( ( encoder, packet_stream) ) => ( encoder, packet_stream) ,
240
- Err ( err) => {
241
- error ! ( "Error message: {:?}" , err) ;
242
- return ;
243
- }
244
- } ;
238
+ println ! (
239
+ "Payload types: {:?}, {:?}" ,
240
+ video_payload_type, audio_payload_type
241
+ ) ;
242
+
243
+ let ( encoder, packet_stream) = match create_encoder_and_packet_stream (
244
+ whip_ctx. clone ( ) ,
245
+ video_codec,
246
+ video_payload_type,
247
+ audio_codec,
248
+ audio_payload_type,
249
+ ) {
250
+ Ok ( ( encoder, packet_stream) ) => ( encoder, packet_stream) ,
251
+ Err ( err) => {
252
+ error ! ( "Error message: {:?}" , err) ;
253
+ return ;
254
+ }
255
+ } ;
245
256
246
257
if let Some ( keyframe_sender) = encoder. keyframe_request_sender ( ) {
247
258
if let Some ( video_transceiver) = video_transceiver {
@@ -328,7 +339,9 @@ async fn run_whip_sender_task(
328
339
fn create_encoder_and_packet_stream (
329
340
whip_ctx : WhipCtx ,
330
341
video_codec : Option < RTCRtpCodecCapability > ,
342
+ video_payload_type : Option < PayloadType > ,
331
343
audio_codec : Option < RTCRtpCodecCapability > ,
344
+ audio_payload_type : Option < PayloadType > ,
332
345
) -> Result < ( Encoder , PacketStream ) , WhipError > {
333
346
let video_encoder_options = if let Some ( video_config) = whip_ctx. options . video {
334
347
let resolution = video_config. resolution ;
@@ -373,7 +386,16 @@ fn create_encoder_and_packet_stream(
373
386
return Err ( WhipError :: CannotInitEncoder ) ;
374
387
} ;
375
388
376
- let payloader = Payloader :: new ( video_encoder_options, audio_encoder_options) ;
389
+ let video_payloader_options = Some ( VideoPayloaderOptions {
390
+ encoder_options : video_encoder_options. unwrap ( ) ,
391
+ payload_type : video_payload_type. unwrap ( ) ,
392
+ } ) ;
393
+ let audio_payloader_options = Some ( AudioPayloaderOptions {
394
+ encoder_options : audio_encoder_options. unwrap ( ) ,
395
+ payload_type : audio_payload_type. unwrap ( ) ,
396
+ } ) ;
397
+
398
+ let payloader = Payloader :: new ( video_payloader_options, audio_payloader_options) ;
377
399
let packet_stream = PacketStream :: new ( packets_receiver, payloader, 1400 ) ;
378
400
379
401
Ok ( ( encoder, packet_stream) )
@@ -385,26 +407,32 @@ async fn setup_track(
385
407
) -> (
386
408
Option < Arc < TrackLocalStaticRTP > > ,
387
409
Option < RTCRtpCodecCapability > ,
410
+ Option < PayloadType > ,
388
411
) {
389
412
if let Some ( transceiver) = transceiver {
390
413
let sender = transceiver. sender ( ) . await ;
391
- let ( track, codec) = match sender. get_parameters ( ) . await . rtp_parameters . codecs . first ( ) {
392
- Some ( codec_parameters) => {
393
- let track = Arc :: new ( TrackLocalStaticRTP :: new (
394
- codec_parameters. capability . clone ( ) ,
395
- track_kind. clone ( ) ,
396
- "webrtc-rs" . to_string ( ) ,
397
- ) ) ;
398
- if let Err ( e) = sender. replace_track ( Some ( track. clone ( ) ) ) . await {
399
- error ! ( "Failed to replace {} track: {}" , track_kind, e) ;
414
+ let ( track, codec, payload_type) =
415
+ match sender. get_parameters ( ) . await . rtp_parameters . codecs . first ( ) {
416
+ Some ( codec_parameters) => {
417
+ let track = Arc :: new ( TrackLocalStaticRTP :: new (
418
+ codec_parameters. capability . clone ( ) ,
419
+ track_kind. clone ( ) ,
420
+ "webrtc-rs" . to_string ( ) ,
421
+ ) ) ;
422
+ if let Err ( e) = sender. replace_track ( Some ( track. clone ( ) ) ) . await {
423
+ error ! ( "Failed to replace {} track: {}" , track_kind, e) ;
424
+ }
425
+ (
426
+ Some ( track) ,
427
+ Some ( codec_parameters. capability . clone ( ) ) ,
428
+ Some ( codec_parameters. payload_type ) ,
429
+ )
400
430
}
401
- ( Some ( track) , Some ( codec_parameters. capability . clone ( ) ) )
402
- }
403
- None => ( None , None ) ,
404
- } ;
405
- ( track, codec)
431
+ None => ( None , None , None ) ,
432
+ } ;
433
+ ( track, codec, payload_type)
406
434
} else {
407
- ( None , None )
435
+ ( None , None , None )
408
436
}
409
437
}
410
438
0 commit comments