From bc8950303cd20c28a2ecf0320e528eeb910f4208 Mon Sep 17 00:00:00 2001 From: Daniel Vilar Date: Thu, 26 Apr 2018 13:53:50 +0200 Subject: [PATCH] Added field pts to buffer --- gst-plugin-ndi/src/ndisrc.rs | 37 +++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/gst-plugin-ndi/src/ndisrc.rs b/gst-plugin-ndi/src/ndisrc.rs index 487c5e77..c712c63f 100644 --- a/gst-plugin-ndi/src/ndisrc.rs +++ b/gst-plugin-ndi/src/ndisrc.rs @@ -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, recv: Option, + start_pts: Option, } 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 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 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 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 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 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 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(); }