From d6d306f9166945c44004aca10fda954a23115083 Mon Sep 17 00:00:00 2001 From: Luis de Bethencourt Date: Sun, 15 May 2016 14:44:32 +0100 Subject: [PATCH] RsFileSink writes buffers to a file --- src/rsfilesink.rs | 29 +++++++++++++++++++++++++---- src/rssink.c | 7 +++++-- src/rssink.rs | 13 +++++-------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/rsfilesink.rs b/src/rsfilesink.rs index 314ca44e..730dddc6 100644 --- a/src/rsfilesink.rs +++ b/src/rsfilesink.rs @@ -76,7 +76,16 @@ impl Sink for FileSink { match self.location { None => return false, Some(ref location) => { - return true; + match File::create(location.as_path()) { + Ok(file) => { + self.file = Some(file); + return true; + }, + Err(err) => { + println_err!("Could not open file for writing '{}': {}", location.to_str().unwrap_or("Non-UTF8 path"), err.to_string()); + return false; + } + } }, } } @@ -88,8 +97,20 @@ impl Sink for FileSink { true } - fn render(&mut self) -> Result { - println!("Got a buffer!"); - Err(GstFlowReturn::Ok) + fn render(&mut self, data: &mut [u8]) -> GstFlowReturn { + match self.file { + None => return GstFlowReturn::Error, + Some(ref mut f) => { + match f.write_all(data) { + Ok(_) => { + return GstFlowReturn::Ok + }, + Err(err) => { + println_err!("Failed to write: {}", err); + return GstFlowReturn::Error + }, + } + }, + } } } diff --git a/src/rssink.c b/src/rssink.c index 9348d4c2..9bef3803 100644 --- a/src/rssink.c +++ b/src/rssink.c @@ -16,7 +16,7 @@ static GHashTable *sinks; /* Declarations for Rust code */ extern gboolean sinks_register (void *plugin); -extern GstFlowReturn sink_render (void * filesink); +extern GstFlowReturn sink_render (void * filesink, void * data, size_t data_len); extern gboolean sink_set_uri (void * filesink, const char *uri); extern char * sink_get_uri (void * filesink); extern gboolean sink_start (void * filesink); @@ -132,9 +132,12 @@ static GstFlowReturn gst_rs_sink_render (GstBaseSink * basesink, GstBuffer * buffer) { GstRsSink *sink = GST_RS_SINK (basesink); + GstMapInfo map; GstFlowReturn ret; - ret = sink_render (sink->instance); + gst_buffer_map (buffer, &map, GST_MAP_READ); + ret = sink_render (sink->instance, map.data, map.size); + gst_buffer_unmap (buffer, &map); return ret; } diff --git a/src/rssink.rs b/src/rssink.rs index d3d0a4b5..13f2fbdc 100644 --- a/src/rssink.rs +++ b/src/rssink.rs @@ -1,5 +1,6 @@ use libc::{c_char}; use std::ffi::{CStr, CString}; +use std::slice; use std::ptr; use utils::*; @@ -9,7 +10,7 @@ pub trait Sink { fn get_uri(&self) -> Option; fn start(&mut self) -> bool; fn stop(&mut self) -> bool; - fn render(&mut self) -> Result; + fn render(&mut self, data: &mut [u8]) -> GstFlowReturn; } #[no_mangle] @@ -37,15 +38,11 @@ pub extern "C" fn sink_get_uri(ptr: *mut Box) -> *mut c_char { } #[no_mangle] -pub extern "C" fn sink_render(ptr: *mut Box) -> GstFlowReturn { +pub extern "C" fn sink_render(ptr: *mut Box, data_ptr: *mut u8, data_len: usize) -> GstFlowReturn { let source: &mut Box = unsafe { &mut *ptr }; - match source.render() { - Ok(data) => { - GstFlowReturn::Ok - }, - Err(ret) => ret, - } + let mut data = unsafe { slice::from_raw_parts_mut(data_ptr, data_len) }; + source.render(data) } #[no_mangle]