mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-09-26 14:00:12 +00:00
threadshare/jitterbuffer: Port jitterbuffer to new API and completely refactor
This commit is contained in:
parent
95b2641056
commit
776708bee6
3 changed files with 886 additions and 707 deletions
File diff suppressed because it is too large
Load diff
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue