use cxx::SharedPtr;
use webrtc_sys::packet_trailer::ffi as sys_pt;
use crate::{
peer_connection_factory::PeerConnectionFactory, rtp_receiver::RtpReceiver,
rtp_sender::RtpSender,
};
#[derive(Clone)]
pub struct PacketTrailerHandler {
sys_handle: SharedPtr<sys_pt::PacketTrailerHandler>,
}
impl PacketTrailerHandler {
pub fn set_enabled(&self, enabled: bool) {
self.sys_handle.set_enabled(enabled);
}
pub fn enabled(&self) -> bool {
self.sys_handle.enabled()
}
pub fn lookup_frame_metadata(&self, rtp_timestamp: u32) -> Option<(u64, u32)> {
let ts = self.sys_handle.lookup_timestamp(rtp_timestamp);
if ts != u64::MAX {
let frame_id = self.sys_handle.last_lookup_frame_id();
Some((ts, frame_id))
} else {
None
}
}
pub fn store_frame_metadata(
&self,
capture_timestamp_us: i64,
user_timestamp: u64,
frame_id: u32,
) {
self.sys_handle.store_frame_metadata(capture_timestamp_us, user_timestamp, frame_id);
}
pub(crate) fn sys_handle(&self) -> SharedPtr<sys_pt::PacketTrailerHandler> {
self.sys_handle.clone()
}
}
pub fn create_sender_handler(
peer_factory: &PeerConnectionFactory,
sender: &RtpSender,
) -> PacketTrailerHandler {
PacketTrailerHandler {
sys_handle: sys_pt::new_packet_trailer_sender(
peer_factory.handle.sys_handle.clone(),
sender.handle.sys_handle.clone(),
),
}
}
pub fn create_receiver_handler(
peer_factory: &PeerConnectionFactory,
receiver: &RtpReceiver,
) -> PacketTrailerHandler {
PacketTrailerHandler {
sys_handle: sys_pt::new_packet_trailer_receiver(
peer_factory.handle.sys_handle.clone(),
receiver.handle.sys_handle.clone(),
),
}
}