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
use libc::{c_void, c_int, c_uint, uint8_t, uint32_t, size_t};

#[derive(Debug)]
#[repr(C)]
pub struct AVFifoBuffer {
	pub buffer: *mut uint8_t,

	pub rptr: *mut uint8_t,
	pub wptr: *mut uint8_t,
	pub end:  *mut uint8_t,

	pub rndx: uint32_t,
	pub wndx: uint32_t,
}

#[inline(always)]
pub unsafe fn av_fifo_peek2(f: *const AVFifoBuffer, offs: c_int) -> *mut uint8_t {
	let ptr = (*f).rptr.offset(offs as isize);

	if ptr > (*f).end {
		(*f).buffer.offset((ptr as usize - (*f).end as usize) as isize)
	}
	else if ptr < (*f).buffer {
		(*f).end.offset(-(((*f).buffer as usize - ptr as usize) as isize))
	}
	else {
		ptr
	}
}

extern {
	pub fn av_fifo_alloc(size: c_uint) -> *mut AVFifoBuffer;
	pub fn av_fifo_alloc_array(nmemb: size_t, size: size_t) -> *mut AVFifoBuffer;
	pub fn av_fifo_free(f: *mut AVFifoBuffer);
	pub fn av_fifo_freep(f: *mut *mut AVFifoBuffer);
	pub fn av_fifo_reset(f: *mut AVFifoBuffer);
	pub fn av_fifo_size(f: *const AVFifoBuffer) -> c_int;
	pub fn av_fifo_space(f: *const AVFifoBuffer) -> c_int;
	pub fn av_fifo_generic_peek(f: *mut AVFifoBuffer, dest: *mut c_void, buf_size: c_int, func: extern fn(*mut c_void, *mut c_void, c_int)) -> c_int;
	pub fn av_fifo_generic_read(f: *mut AVFifoBuffer, dest: *mut c_void, buf_size: c_int, func: extern fn(*mut c_void, *mut c_void, c_int)) -> c_int;
	pub fn av_fifo_generic_write(f: *mut AVFifoBuffer, src: *mut c_void, size: c_int, func: extern fn(*mut c_void, *mut c_void, c_int) -> c_int) -> c_int;
	pub fn av_fifo_realloc2(f: *mut AVFifoBuffer, size: c_uint) -> c_int;
	pub fn av_fifo_grow(f: *mut AVFifoBuffer, additional_space: c_int) -> c_int;
	pub fn av_fifo_drain(f: *mut AVFifoBuffer, size: c_int);
}