Added field pts to buffer

This commit is contained in:
Daniel Vilar 2018-04-26 13:53:50 +02:00
parent 53c692fac5
commit bc8950303c

View file

@ -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();
}