1use std::any::Any;
16
17use crate::impl_thread_safety;
18
19#[cxx::bridge(namespace = "livekit_ffi")]
20pub mod ffi {
21 extern "C++" {
22 include!("livekit/webrtc.h");
23 include!("livekit/rtp_parameters.h");
24 include!("livekit/media_stream.h");
25
26 type MediaType = crate::webrtc::ffi::MediaType;
27 type VideoEncoderBackend = crate::webrtc::ffi::VideoEncoderBackend;
28 type RtpEncodingParameters = crate::rtp_parameters::ffi::RtpEncodingParameters;
29 type RtpParameters = crate::rtp_parameters::ffi::RtpParameters;
30 type MediaStreamTrack = crate::media_stream::ffi::MediaStreamTrack;
31 }
32
33 unsafe extern "C++" {
34 include!("livekit/rtp_sender.h");
35
36 type RtpSender;
37
38 fn set_track(self: &RtpSender, track: SharedPtr<MediaStreamTrack>) -> bool;
39 fn track(self: &RtpSender) -> SharedPtr<MediaStreamTrack>;
40 fn get_stats(
41 self: &RtpSender,
42 ctx: Box<SenderContext>,
43 on_stats: fn(ctx: Box<SenderContext>, json: String),
44 );
45 fn ssrc(self: &RtpSender) -> u32;
46 fn media_type(self: &RtpSender) -> MediaType;
47 fn id(self: &RtpSender) -> String;
48 fn stream_ids(self: &RtpSender) -> Vec<String>;
49 fn set_streams(self: &RtpSender, stream_ids: &Vec<String>);
50 fn init_send_encodings(self: &RtpSender) -> Vec<RtpEncodingParameters>;
51 fn get_parameters(self: &RtpSender) -> RtpParameters;
52 fn set_parameters(self: &RtpSender, parameters: RtpParameters) -> Result<()>;
53 fn set_video_encoder_backend(self: &RtpSender, backend: VideoEncoderBackend);
54
55 fn _shared_rtp_sender() -> SharedPtr<RtpSender>;
56 }
57
58 extern "Rust" {
59 type SenderContext;
60 }
61}
62
63#[repr(transparent)]
64pub struct SenderContext(pub Box<dyn Any + Send>);
65
66impl_thread_safety!(ffi::RtpSender, Send + Sync);