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 last_lookup_user_data(self: &PacketTrailerHandler) -> Vec<u8>;
88
89 fn store_frame_metadata(
91 self: &PacketTrailerHandler,
92 capture_timestamp_us: i64,
93 user_timestamp: u64,
94 frame_id: u32,
95 user_data: &[u8],
96 );
97
98 fn set_publish_timing_observer(
100 self: &PacketTrailerHandler,
101 observer: Box<VideoPublishTimingObserverWrapper>,
102 );
103
104 fn clear_publish_timing_observer(self: &PacketTrailerHandler);
106
107 fn set_subscribe_timing_observer(
109 self: &PacketTrailerHandler,
110 observer: Box<VideoSubscribeTimingObserverWrapper>,
111 );
112
113 fn clear_subscribe_timing_observer(self: &PacketTrailerHandler);
115
116 fn emit_subscribe_timing(
118 self: &PacketTrailerHandler,
119 stage: VideoSubscribeTimingStage,
120 user_timestamp: u64,
121 frame_id: u32,
122 );
123
124 fn new_packet_trailer_sender(
126 peer_factory: SharedPtr<PeerConnectionFactory>,
127 sender: SharedPtr<RtpSender>,
128 ) -> SharedPtr<PacketTrailerHandler>;
129
130 fn new_packet_trailer_receiver(
132 peer_factory: SharedPtr<PeerConnectionFactory>,
133 receiver: SharedPtr<RtpReceiver>,
134 ) -> SharedPtr<PacketTrailerHandler>;
135 }
136
137 extern "Rust" {
138 type VideoPublishTimingObserverWrapper;
139 type VideoSubscribeTimingObserverWrapper;
140
141 fn on_publish_timing(
142 self: &VideoPublishTimingObserverWrapper,
143 event: VideoPublishTimingEvent,
144 );
145
146 fn on_subscribe_timing(
147 self: &VideoSubscribeTimingObserverWrapper,
148 event: VideoSubscribeTimingEvent,
149 );
150 }
151}
152
153impl_thread_safety!(ffi::PacketTrailerHandler, Send + Sync);
154
155pub struct VideoPublishTimingObserverWrapper {
156 observer: OnVideoPublishTiming,
157}
158
159impl VideoPublishTimingObserverWrapper {
160 pub fn new(observer: OnVideoPublishTiming) -> Self {
161 Self { observer }
162 }
163
164 fn on_publish_timing(&self, event: ffi::VideoPublishTimingEvent) {
165 (self.observer)(event);
166 }
167}
168
169pub struct VideoSubscribeTimingObserverWrapper {
170 observer: OnVideoSubscribeTiming,
171}
172
173impl VideoSubscribeTimingObserverWrapper {
174 pub fn new(observer: OnVideoSubscribeTiming) -> Self {
175 Self { observer }
176 }
177
178 fn on_subscribe_timing(&self, event: ffi::VideoSubscribeTimingEvent) {
179 (self.observer)(event);
180 }
181}