webrtc_sys/
packet_trailer.rs1use crate::impl_thread_safety;
16
17pub type OnVideoPublishTiming = Box<dyn Fn(ffi::VideoPublishTimingEvent) + Send + Sync + 'static>;
19pub type OnVideoSubscribeTiming =
21 Box<dyn Fn(ffi::VideoSubscribeTimingEvent) + Send + Sync + 'static>;
22
23#[cxx::bridge(namespace = "livekit_ffi")]
24pub mod ffi {
25 #[repr(i32)]
26 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
27 pub enum VideoPublishTimingStage {
28 EncoderUpload,
29 EncoderOutput,
30 WebrtcPacketize,
31 }
32
33 #[repr(i32)]
34 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
35 pub enum VideoSubscribeTimingStage {
36 WebrtcReceive,
37 DecoderUpload,
38 DecoderOutput,
39 }
40
41 #[derive(Debug, Clone, Copy)]
42 pub struct VideoPublishTimingEvent {
43 pub stage: VideoPublishTimingStage,
44 pub timestamp_us: u64,
45 pub capture_timestamp_us: u64,
46 pub frame_id: u32,
47 }
48
49 #[derive(Debug, Clone, Copy)]
50 pub struct VideoSubscribeTimingEvent {
51 pub stage: VideoSubscribeTimingStage,
52 pub timestamp_us: u64,
53 pub capture_timestamp_us: u64,
54 pub frame_id: u32,
55 }
56
57 unsafe extern "C++" {
58 include!("livekit/packet_trailer.h");
59 include!("livekit/rtp_sender.h");
60 include!("livekit/rtp_receiver.h");
61 include!("livekit/peer_connection_factory.h");
62
63 type RtpSender = crate::rtp_sender::ffi::RtpSender;
64 type RtpReceiver = crate::rtp_receiver::ffi::RtpReceiver;
65 type PeerConnectionFactory = crate::peer_connection_factory::ffi::PeerConnectionFactory;
66
67 pub type PacketTrailerHandler;
69
70 fn set_enabled(self: &PacketTrailerHandler, enabled: bool);
72
73 fn enabled(self: &PacketTrailerHandler) -> bool;
75
76 fn lookup_timestamp(self: &PacketTrailerHandler, rtp_timestamp: u32) -> u64;
80
81 fn last_lookup_frame_id(self: &PacketTrailerHandler) -> u32;
84
85 fn store_frame_metadata(
87 self: &PacketTrailerHandler,
88 capture_timestamp_us: i64,
89 user_timestamp: u64,
90 frame_id: u32,
91 );
92
93 fn set_publish_timing_observer(
95 self: &PacketTrailerHandler,
96 observer: Box<VideoPublishTimingObserverWrapper>,
97 );
98
99 fn clear_publish_timing_observer(self: &PacketTrailerHandler);
101
102 fn set_subscribe_timing_observer(
104 self: &PacketTrailerHandler,
105 observer: Box<VideoSubscribeTimingObserverWrapper>,
106 );
107
108 fn clear_subscribe_timing_observer(self: &PacketTrailerHandler);
110
111 fn emit_subscribe_timing(
113 self: &PacketTrailerHandler,
114 stage: VideoSubscribeTimingStage,
115 user_timestamp: u64,
116 frame_id: u32,
117 );
118
119 fn new_packet_trailer_sender(
121 peer_factory: SharedPtr<PeerConnectionFactory>,
122 sender: SharedPtr<RtpSender>,
123 ) -> SharedPtr<PacketTrailerHandler>;
124
125 fn new_packet_trailer_receiver(
127 peer_factory: SharedPtr<PeerConnectionFactory>,
128 receiver: SharedPtr<RtpReceiver>,
129 ) -> SharedPtr<PacketTrailerHandler>;
130 }
131
132 extern "Rust" {
133 type VideoPublishTimingObserverWrapper;
134 type VideoSubscribeTimingObserverWrapper;
135
136 fn on_publish_timing(
137 self: &VideoPublishTimingObserverWrapper,
138 event: VideoPublishTimingEvent,
139 );
140
141 fn on_subscribe_timing(
142 self: &VideoSubscribeTimingObserverWrapper,
143 event: VideoSubscribeTimingEvent,
144 );
145 }
146}
147
148impl_thread_safety!(ffi::PacketTrailerHandler, Send + Sync);
149
150pub struct VideoPublishTimingObserverWrapper {
151 observer: OnVideoPublishTiming,
152}
153
154impl VideoPublishTimingObserverWrapper {
155 pub fn new(observer: OnVideoPublishTiming) -> Self {
156 Self { observer }
157 }
158
159 fn on_publish_timing(&self, event: ffi::VideoPublishTimingEvent) {
160 (self.observer)(event);
161 }
162}
163
164pub struct VideoSubscribeTimingObserverWrapper {
165 observer: OnVideoSubscribeTiming,
166}
167
168impl VideoSubscribeTimingObserverWrapper {
169 pub fn new(observer: OnVideoSubscribeTiming) -> Self {
170 Self { observer }
171 }
172
173 fn on_subscribe_timing(&self, event: ffi::VideoSubscribeTimingEvent) {
174 (self.observer)(event);
175 }
176}