1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use ffi::*;
use std::ptr;
use std::mem;
pub struct BufferPool{
pool: *mut GstBufferPool
}
unsafe impl Sync for BufferPool {}
unsafe impl Send for BufferPool {}
impl BufferPool{
pub fn new() -> Option<BufferPool>{
unsafe{
let pool = gst_buffer_pool_new();
if pool!=ptr::null_mut(){
Some(BufferPool{pool: pool})
}else{
None
}
}
}
pub fn set_params(&self, caps: &::Caps, size: u32, min_buffers: u32, max_buffers: u32){
unsafe{
let config = gst_buffer_pool_get_config(self.pool);
/*let mut current_caps = gst_caps_new_empty();
let mut curret_size = 0;
let mut current_min_buffers = 0;
let mut current_max_buffers = 0;
gst_buffer_pool_config_get_params(config, &mut current_caps, &mut curret_size, &mut current_min_buffers, &mut current_max_buffers);
gst_mini_object_unref(current_caps as *mut GstMiniObject);*/
gst_buffer_pool_config_set_params(config, mem::transmute(caps.gst_caps()), size, min_buffers, max_buffers);
/*let mut params = GstAllocationParams {
flags: GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS,
align: 0,
prefix: 0,
padding: 0,
_gst_reserved: [ptr::null_mut(); 4u]
};
gst_allocation_params_init(&mut params);
params.flags = GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS;
gst_buffer_pool_config_set_allocator(config,ptr::null_mut(),¶ms);*/
gst_buffer_pool_set_config(self.pool, config);
}
}
pub fn acquire_buffer(&self) -> Option<::Buffer>{
/*let mut params = GstBufferPoolAcquireParams{
format: GST_FORMAT_DEFAULT,
start: 0,
stop: 0,
flags: GST_BUFFER_POOL_ACQUIRE_FLAG_NONE,
_gst_reserved: [ptr::null_mut();4u]
};*/
let mut buffer: *mut GstBuffer = ptr::null_mut();
unsafe{
let ret = gst_buffer_pool_acquire_buffer(self.pool, &mut buffer, ptr::null_mut());
if buffer!=ptr::null_mut() && ret==GST_FLOW_OK{
::Buffer::new(buffer,true)
}else{
None
}
}
}
pub fn active(&self) -> bool{
unsafe{
gst_buffer_pool_is_active(self.pool) != 0
}
}
pub fn set_active(&self, active: bool) -> Result<(),()>{
unsafe{
if gst_buffer_pool_set_active(self.pool, if active{1} else {0}) != 0{
Ok(())
}else{
Err(())
}
}
}
}