Skip to content

Commit 71529ab

Browse files
committed
changes from review
1 parent e652bdf commit 71529ab

File tree

5 files changed

+177
-136
lines changed

5 files changed

+177
-136
lines changed

compositor_api/src/types/from_register_output.rs

+23-26
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,19 @@ impl TryFrom<WhipOutput> for pipeline::RegisterOutputOptions<output::OutputOptio
170170
));
171171
}
172172

173-
if video.as_ref().filter(|v| v.encoder.is_some()).is_some() {
173+
if let Some(OutputWhipVideoOptions {
174+
encoder: Some(_encoder),
175+
..
176+
}) = &video
177+
{
174178
warn!("Field 'encoder' is deprecated. The codec will now be set automatically based on WHIP negotiation; manual specification is no longer needed.")
175179
}
176180

177-
if audio.as_ref().filter(|a| a.encoder.is_some()).is_some() {
181+
if let Some(OutputWhipAudioOptions {
182+
encoder: Some(_encoder),
183+
..
184+
}) = &audio
185+
{
178186
warn!("Field 'encoder' is deprecated. The codec will now be set automatically based on WHIP negotiation; manual specification is no longer needed.")
179187
}
180188

@@ -184,7 +192,19 @@ impl TryFrom<WhipOutput> for pipeline::RegisterOutputOptions<output::OutputOptio
184192
};
185193
}
186194

187-
let (output_video_options, video_whip_options) = maybe_whip_video_options(video)?;
195+
let (output_video_options, video_whip_options) = if let Some(options) = video {
196+
let output_options = pipeline::OutputVideoOptions {
197+
initial: options.initial.try_into()?,
198+
end_condition: options.send_eos_when.unwrap_or_default().try_into()?,
199+
};
200+
let video_whip_options = VideoWhipOptions {
201+
resolution: options.resolution.into(),
202+
};
203+
(Some(output_options), Some(video_whip_options))
204+
} else {
205+
(None, None)
206+
};
207+
188208
let (output_audio_options, audio_whip_options) = match audio {
189209
Some(OutputWhipAudioOptions {
190210
mixing_strategy,
@@ -304,29 +324,6 @@ fn maybe_video_options(
304324
Ok((Some(encoder_options), Some(output_options)))
305325
}
306326

307-
fn maybe_whip_video_options(
308-
options: Option<OutputWhipVideoOptions>,
309-
) -> Result<
310-
(
311-
Option<pipeline::OutputVideoOptions>,
312-
Option<VideoWhipOptions>,
313-
),
314-
TypeError,
315-
> {
316-
let Some(options) = options else {
317-
return Ok((None, None));
318-
};
319-
let output_options = pipeline::OutputVideoOptions {
320-
initial: options.initial.try_into()?,
321-
end_condition: options.send_eos_when.unwrap_or_default().try_into()?,
322-
};
323-
let video_whip_options = VideoWhipOptions {
324-
resolution: options.resolution.into(),
325-
};
326-
327-
Ok((Some(output_options), Some(video_whip_options)))
328-
}
329-
330327
impl From<Mp4AudioEncoderOptions> for pipeline::encoder::AudioEncoderOptions {
331328
fn from(value: Mp4AudioEncoderOptions) -> Self {
332329
match value {

compositor_api/src/types/register_output.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub struct OutputWhipVideoOptions {
8383
pub send_eos_when: Option<OutputEndCondition>,
8484
/// Video encoder options.
8585
pub encoder: Option<VideoEncoderOptions>,
86-
/// Root of a component tree/scene that should be rendered for the output. Use [`update_output` request](../routes.md#update-output) to update this value after registration. [Learn more](../../concept/component.md).
86+
/// Root of a component tree/scene that should be rendered for the output.
8787
pub initial: Video,
8888
}
8989

compositor_pipeline/src/pipeline/output/whip.rs

+57-29
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use establish_peer_connection::connect;
44

55
use init_peer_connection::init_peer_connection;
66
use packet_stream::PacketStream;
7-
use payloader::{Payload, Payloader, PayloadingError};
7+
use payloader::{
8+
AudioPayloaderOptions, Payload, Payloader, PayloadingError, VideoPayloaderOptions,
9+
};
810
use reqwest::{Method, StatusCode};
911
use rtcp::payload_feedbacks::picture_loss_indication::PictureLossIndication;
1012
use std::{
@@ -18,7 +20,7 @@ use url::{ParseError, Url};
1820
use webrtc::{
1921
api::media_engine::{MIME_TYPE_H264, MIME_TYPE_OPUS, MIME_TYPE_VP8},
2022
rtp_transceiver::{
21-
rtp_codec::RTCRtpCodecCapability, rtp_sender::RTCRtpSender, RTCRtpTransceiver,
23+
rtp_codec::RTCRtpCodecCapability, rtp_sender::RTCRtpSender, PayloadType, RTCRtpTransceiver,
2224
},
2325
track::track_local::{track_local_static_rtp::TrackLocalStaticRTP, TrackLocalWriter},
2426
};
@@ -228,20 +230,29 @@ async fn run_whip_sender_task(
228230
return;
229231
}
230232
};
231-
232-
let (video_track, video_codec) =
233+
let (video_track, video_codec, video_payload_type) =
233234
setup_track(video_transceiver.clone(), "video".to_string()).await;
234-
let (audio_track, audio_codec) =
235+
let (audio_track, audio_codec, audio_payload_type) =
235236
setup_track(audio_transceiver.clone(), "audio".to_string()).await;
236237

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+
};
245256

246257
if let Some(keyframe_sender) = encoder.keyframe_request_sender() {
247258
if let Some(video_transceiver) = video_transceiver {
@@ -328,7 +339,9 @@ async fn run_whip_sender_task(
328339
fn create_encoder_and_packet_stream(
329340
whip_ctx: WhipCtx,
330341
video_codec: Option<RTCRtpCodecCapability>,
342+
video_payload_type: Option<PayloadType>,
331343
audio_codec: Option<RTCRtpCodecCapability>,
344+
audio_payload_type: Option<PayloadType>,
332345
) -> Result<(Encoder, PacketStream), WhipError> {
333346
let video_encoder_options = if let Some(video_config) = whip_ctx.options.video {
334347
let resolution = video_config.resolution;
@@ -373,7 +386,16 @@ fn create_encoder_and_packet_stream(
373386
return Err(WhipError::CannotInitEncoder);
374387
};
375388

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);
377399
let packet_stream = PacketStream::new(packets_receiver, payloader, 1400);
378400

379401
Ok((encoder, packet_stream))
@@ -385,26 +407,32 @@ async fn setup_track(
385407
) -> (
386408
Option<Arc<TrackLocalStaticRTP>>,
387409
Option<RTCRtpCodecCapability>,
410+
Option<PayloadType>,
388411
) {
389412
if let Some(transceiver) = transceiver {
390413
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+
)
400430
}
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)
406434
} else {
407-
(None, None)
435+
(None, None, None)
408436
}
409437
}
410438

0 commit comments

Comments
 (0)