mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-02-17 05:15:14 +00:00
Added field pts to buffer
This commit is contained in:
parent
53c692fac5
commit
bc8950303c
1 changed files with 26 additions and 11 deletions
|
@ -16,6 +16,7 @@ use std::{i32, u32};
|
|||
|
||||
use std::ptr;
|
||||
use std::{thread, time};
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
use std::ffi::{CStr, CString};
|
||||
|
||||
use ndilib::*;
|
||||
|
@ -50,6 +51,7 @@ static PROPERTIES: [Property; 1] = [
|
|||
struct State {
|
||||
info: Option<gst_video::VideoInfo>,
|
||||
recv: Option<NdiInstance>,
|
||||
start_pts: Option<u64>,
|
||||
}
|
||||
|
||||
impl Default for State {
|
||||
|
@ -57,6 +59,7 @@ impl Default for State {
|
|||
State {
|
||||
info: None,
|
||||
recv: None,
|
||||
start_pts: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -279,14 +282,10 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
if CStr::from_ptr((*p_sources.offset(i)).p_ndi_name)
|
||||
.to_string_lossy()
|
||||
.into_owned() == settings.stream_name{
|
||||
println!("coincide" );
|
||||
source = i;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
println!("No coincide" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if source == -1 {
|
||||
gst_element_error!(element, gst::CoreError::Negotiation, ["Stream name not found"]);
|
||||
return false;
|
||||
|
@ -339,6 +338,12 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
|
||||
NDIlib_recv_send_metadata(pNDI_recv, &enable_hw_accel);
|
||||
state.recv = Some(NdiInstance{recv: pNDI_recv});
|
||||
let start = SystemTime::now();
|
||||
let since_the_epoch = start.duration_since(UNIX_EPOCH)
|
||||
.expect("Time went backwards");
|
||||
println!("{:?}", since_the_epoch);
|
||||
state.start_pts = Some(since_the_epoch.as_secs() * 1000000000 +
|
||||
since_the_epoch.subsec_nanos() as u64);
|
||||
//TODO Another way to save NDI_recv variable
|
||||
// *state = State{
|
||||
// info: state.info.clone(),
|
||||
|
@ -393,6 +398,14 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
};
|
||||
let pNDI_recv = recv.recv;
|
||||
|
||||
// let start_pts = match state.start_pts {
|
||||
// None => {
|
||||
// gst_element_error!(element, gst::CoreError::Negotiation, ["Have no caps yet"]);
|
||||
// return Err(gst::FlowReturn::NotNegotiated);
|
||||
// }
|
||||
// Some(ref start_pts) => start_pts.clone(),
|
||||
// };
|
||||
|
||||
unsafe{
|
||||
// loop {
|
||||
let video_frame: NDIlib_video_frame_v2_t = Default::default();
|
||||
|
@ -401,6 +414,7 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
|
||||
//TODO Only create buffer when we got a video frame
|
||||
let mut frame = false;
|
||||
let mut pts: u64 = 0;
|
||||
while !frame{
|
||||
let frame_type = NDIlib_recv_capture_v2(
|
||||
pNDI_recv,
|
||||
|
@ -414,13 +428,14 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
NDIlib_frame_type_e::NDIlib_frame_type_video => {
|
||||
//println!("Tengo video {:?}", video_frame);
|
||||
//TODO Change gst_warning to gst_debug
|
||||
gst_warning!(self.cat, obj: element, "Received video frame: {:?}", video_frame);
|
||||
gst_debug!(self.cat, obj: element, "Received video frame: {:?}", video_frame);
|
||||
frame = true;
|
||||
pts = ((video_frame.timestamp as u64) * 100) - state.start_pts.unwrap();
|
||||
}
|
||||
NDIlib_frame_type_e::NDIlib_frame_type_audio => {
|
||||
//println!("Tengo audio {:?}", audio_frame);
|
||||
//TODO Change gst_warning to gst_debug
|
||||
gst_warning!(self.cat, obj: element, "Received audio frame: {:?}", video_frame);
|
||||
gst_debug!(self.cat, obj: element, "Received audio frame: {:?}", video_frame);
|
||||
}
|
||||
NDIlib_frame_type_e::NDIlib_frame_type_metadata => {
|
||||
println!(
|
||||
|
@ -456,11 +471,11 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
|
|||
{
|
||||
let vec = Vec::from_raw_parts(video_frame.p_data as *mut u8, buff_size, buff_size);
|
||||
//TODO Set pts, duration and other info about the buffer
|
||||
// let pts: gst::ClockTime = (video_frame.timestamp as u64).into();
|
||||
// let duration: gst::ClockTime = (334624).into();
|
||||
let pts: gst::ClockTime = (pts).into();
|
||||
//let duration: gst::ClockTime = (334624).into();
|
||||
let buffer = buffer.get_mut().unwrap();
|
||||
// buffer.set_pts(pts);
|
||||
// buffer.set_duration(duration);
|
||||
buffer.set_pts(pts);
|
||||
//buffer.set_duration(duration);
|
||||
buffer.copy_from_slice(0, &vec).unwrap();
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue