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::ptr;
use std::{thread, time}; use std::{thread, time};
use std::time::{SystemTime, UNIX_EPOCH};
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use ndilib::*; use ndilib::*;
@ -50,6 +51,7 @@ static PROPERTIES: [Property; 1] = [
struct State { struct State {
info: Option<gst_video::VideoInfo>, info: Option<gst_video::VideoInfo>,
recv: Option<NdiInstance>, recv: Option<NdiInstance>,
start_pts: Option<u64>,
} }
impl Default for State { impl Default for State {
@ -57,6 +59,7 @@ impl Default for State {
State { State {
info: None, info: None,
recv: 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) if CStr::from_ptr((*p_sources.offset(i)).p_ndi_name)
.to_string_lossy() .to_string_lossy()
.into_owned() == settings.stream_name{ .into_owned() == settings.stream_name{
println!("coincide" );
source = i; source = i;
break; break;
} }
else{ }
println!("No coincide" );
}
}
if source == -1 { if source == -1 {
gst_element_error!(element, gst::CoreError::Negotiation, ["Stream name not found"]); gst_element_error!(element, gst::CoreError::Negotiation, ["Stream name not found"]);
return false; return false;
@ -339,6 +338,12 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
NDIlib_recv_send_metadata(pNDI_recv, &enable_hw_accel); NDIlib_recv_send_metadata(pNDI_recv, &enable_hw_accel);
state.recv = Some(NdiInstance{recv: pNDI_recv}); 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 //TODO Another way to save NDI_recv variable
// *state = State{ // *state = State{
// info: state.info.clone(), // info: state.info.clone(),
@ -393,6 +398,14 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
}; };
let pNDI_recv = recv.recv; 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{ unsafe{
// loop { // loop {
let video_frame: NDIlib_video_frame_v2_t = Default::default(); 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 //TODO Only create buffer when we got a video frame
let mut frame = false; let mut frame = false;
let mut pts: u64 = 0;
while !frame{ while !frame{
let frame_type = NDIlib_recv_capture_v2( let frame_type = NDIlib_recv_capture_v2(
pNDI_recv, pNDI_recv,
@ -414,13 +428,14 @@ impl BaseSrcImpl<BaseSrc> for NdiSrc {
NDIlib_frame_type_e::NDIlib_frame_type_video => { NDIlib_frame_type_e::NDIlib_frame_type_video => {
//println!("Tengo video {:?}", video_frame); //println!("Tengo video {:?}", video_frame);
//TODO Change gst_warning to gst_debug //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; frame = true;
pts = ((video_frame.timestamp as u64) * 100) - state.start_pts.unwrap();
} }
NDIlib_frame_type_e::NDIlib_frame_type_audio => { NDIlib_frame_type_e::NDIlib_frame_type_audio => {
//println!("Tengo audio {:?}", audio_frame); //println!("Tengo audio {:?}", audio_frame);
//TODO Change gst_warning to gst_debug //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 => { NDIlib_frame_type_e::NDIlib_frame_type_metadata => {
println!( 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); 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 //TODO Set pts, duration and other info about the buffer
// let pts: gst::ClockTime = (video_frame.timestamp as u64).into(); let pts: gst::ClockTime = (pts).into();
// let duration: gst::ClockTime = (334624).into(); //let duration: gst::ClockTime = (334624).into();
let buffer = buffer.get_mut().unwrap(); let buffer = buffer.get_mut().unwrap();
// buffer.set_pts(pts); buffer.set_pts(pts);
// buffer.set_duration(duration); //buffer.set_duration(duration);
buffer.copy_from_slice(0, &vec).unwrap(); buffer.copy_from_slice(0, &vec).unwrap();
} }