threadshare/jitterbuffer: Port jitterbuffer to new API and completely refactor

This commit is contained in:
Sebastian Dröge 2020-03-14 12:34:45 +02:00
parent 95b2641056
commit 776708bee6
3 changed files with 886 additions and 707 deletions

File diff suppressed because it is too large Load diff

View file

@ -18,6 +18,8 @@
use glib_sys as glib_ffi; use glib_sys as glib_ffi;
use gstreamer_sys as gst_ffi; use gstreamer_sys as gst_ffi;
use std::u32;
#[allow(clippy::module_inception)] #[allow(clippy::module_inception)]
pub mod jitterbuffer; pub mod jitterbuffer;
@ -178,7 +180,7 @@ impl RTPJitterBufferItem {
buffer: gst::Buffer, buffer: gst::Buffer,
dts: gst::ClockTime, dts: gst::ClockTime,
pts: gst::ClockTime, pts: gst::ClockTime,
seqnum: u32, seqnum: Option<u16>,
rtptime: u32, rtptime: u32,
) -> RTPJitterBufferItem { ) -> RTPJitterBufferItem {
unsafe { unsafe {
@ -189,7 +191,7 @@ impl RTPJitterBufferItem {
r#type: 0, r#type: 0,
dts: dts.to_glib(), dts: dts.to_glib(),
pts: pts.to_glib(), pts: pts.to_glib(),
seqnum, seqnum: seqnum.map(|s| s as u32).unwrap_or(u32::MAX),
count: 1, count: 1,
rtptime, rtptime,
}))) })))
@ -222,9 +224,13 @@ impl RTPJitterBufferItem {
} }
} }
pub fn get_seqnum(&self) -> u32 { pub fn get_seqnum(&self) -> Option<u16> {
let item = self.0.as_ref().expect("Invalid wrapper"); let item = self.0.as_ref().expect("Invalid wrapper");
item.seqnum if item.seqnum == u32::MAX {
None
} else {
Some(item.seqnum as u16)
}
} }
#[allow(dead_code)] #[allow(dead_code)]
@ -370,7 +376,7 @@ impl RTPJitterBuffer {
} }
} }
pub fn find_earliest(&self) -> (gst::ClockTime, u32) { pub fn find_earliest(&self) -> (gst::ClockTime, Option<u16>) {
unsafe { unsafe {
let mut pts = mem::MaybeUninit::uninit(); let mut pts = mem::MaybeUninit::uninit();
let mut seqnum = mem::MaybeUninit::uninit(); let mut seqnum = mem::MaybeUninit::uninit();
@ -383,6 +389,12 @@ impl RTPJitterBuffer {
let pts = pts.assume_init(); let pts = pts.assume_init();
let seqnum = seqnum.assume_init(); let seqnum = seqnum.assume_init();
let seqnum = if seqnum == u32::MAX {
None
} else {
Some(seqnum as u16)
};
if pts == gst_ffi::GST_CLOCK_TIME_NONE { if pts == gst_ffi::GST_CLOCK_TIME_NONE {
(gst::CLOCK_TIME_NONE, seqnum) (gst::CLOCK_TIME_NONE, seqnum)
} else { } else {
@ -391,25 +403,35 @@ impl RTPJitterBuffer {
} }
} }
pub fn pop(&self) -> (RTPJitterBufferItem, i32) { pub fn pop(&self) -> (Option<RTPJitterBufferItem>, i32) {
unsafe { unsafe {
let mut percent = mem::MaybeUninit::uninit(); let mut percent = mem::MaybeUninit::uninit();
let item = ffi::rtp_jitter_buffer_pop(self.to_glib_none().0, percent.as_mut_ptr()); let item = ffi::rtp_jitter_buffer_pop(self.to_glib_none().0, percent.as_mut_ptr());
( (
RTPJitterBufferItem(Some(Box::from_raw(item))), if item.is_null() {
None
} else {
Some(RTPJitterBufferItem(Some(Box::from_raw(item))))
},
percent.assume_init(), percent.assume_init(),
) )
} }
} }
pub fn peek(&self) -> (gst::ClockTime, u32) { pub fn peek(&self) -> (gst::ClockTime, Option<u16>) {
unsafe { unsafe {
let item = ffi::rtp_jitter_buffer_peek(self.to_glib_none().0); let item = ffi::rtp_jitter_buffer_peek(self.to_glib_none().0);
if item.is_null() { if item.is_null() {
(gst::CLOCK_TIME_NONE, std::u32::MAX) (gst::CLOCK_TIME_NONE, None)
} else { } else {
((*item).pts.into(), (*item).seqnum) let seqnum = (*item).seqnum;
let seqnum = if seqnum == u32::MAX {
None
} else {
Some(seqnum as u16)
};
((*item).pts.into(), seqnum)
} }
} }
} }

View file

@ -36,7 +36,7 @@ mod udpsrc;
mod appsrc; mod appsrc;
pub mod dataqueue; pub mod dataqueue;
//mod jitterbuffer; mod jitterbuffer;
//mod proxy; //mod proxy;
mod queue; mod queue;
@ -55,7 +55,7 @@ fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
queue::register(plugin)?; queue::register(plugin)?;
//proxy::register(plugin)?; //proxy::register(plugin)?;
appsrc::register(plugin)?; appsrc::register(plugin)?;
//jitterbuffer::jitterbuffer::register(plugin)?; jitterbuffer::jitterbuffer::register(plugin)?;
Ok(()) Ok(())
} }