mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-06-02 21:39:23 +00:00
RsFileSink writes buffers to a file
This commit is contained in:
parent
87bd914cad
commit
d6d306f916
|
@ -76,8 +76,17 @@ impl Sink for FileSink {
|
||||||
match self.location {
|
match self.location {
|
||||||
None => return false,
|
None => return false,
|
||||||
Some(ref location) => {
|
Some(ref location) => {
|
||||||
|
match File::create(location.as_path()) {
|
||||||
|
Ok(file) => {
|
||||||
|
self.file = Some(file);
|
||||||
return true;
|
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
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(&mut self) -> Result<usize, GstFlowReturn> {
|
fn render(&mut self, data: &mut [u8]) -> GstFlowReturn {
|
||||||
println!("Got a buffer!");
|
match self.file {
|
||||||
Err(GstFlowReturn::Ok)
|
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
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ static GHashTable *sinks;
|
||||||
|
|
||||||
/* Declarations for Rust code */
|
/* Declarations for Rust code */
|
||||||
extern gboolean sinks_register (void *plugin);
|
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 gboolean sink_set_uri (void * filesink, const char *uri);
|
||||||
extern char * sink_get_uri (void * filesink);
|
extern char * sink_get_uri (void * filesink);
|
||||||
extern gboolean sink_start (void * filesink);
|
extern gboolean sink_start (void * filesink);
|
||||||
|
@ -132,9 +132,12 @@ static GstFlowReturn
|
||||||
gst_rs_sink_render (GstBaseSink * basesink, GstBuffer * buffer)
|
gst_rs_sink_render (GstBaseSink * basesink, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstRsSink *sink = GST_RS_SINK (basesink);
|
GstRsSink *sink = GST_RS_SINK (basesink);
|
||||||
|
GstMapInfo map;
|
||||||
GstFlowReturn ret;
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use libc::{c_char};
|
use libc::{c_char};
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
|
use std::slice;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
use utils::*;
|
use utils::*;
|
||||||
|
@ -9,7 +10,7 @@ pub trait Sink {
|
||||||
fn get_uri(&self) -> Option<String>;
|
fn get_uri(&self) -> Option<String>;
|
||||||
fn start(&mut self) -> bool;
|
fn start(&mut self) -> bool;
|
||||||
fn stop(&mut self) -> bool;
|
fn stop(&mut self) -> bool;
|
||||||
fn render(&mut self) -> Result<usize, GstFlowReturn>;
|
fn render(&mut self, data: &mut [u8]) -> GstFlowReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -37,15 +38,11 @@ pub extern "C" fn sink_get_uri(ptr: *mut Box<Sink>) -> *mut c_char {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn sink_render(ptr: *mut Box<Sink>) -> GstFlowReturn {
|
pub extern "C" fn sink_render(ptr: *mut Box<Sink>, data_ptr: *mut u8, data_len: usize) -> GstFlowReturn {
|
||||||
let source: &mut Box<Sink> = unsafe { &mut *ptr };
|
let source: &mut Box<Sink> = unsafe { &mut *ptr };
|
||||||
|
|
||||||
match source.render() {
|
let mut data = unsafe { slice::from_raw_parts_mut(data_ptr, data_len) };
|
||||||
Ok(data) => {
|
source.render(data)
|
||||||
GstFlowReturn::Ok
|
|
||||||
},
|
|
||||||
Err(ret) => ret,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
Loading…
Reference in a new issue