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
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
use libc::{c_void, c_char, c_uchar, c_int, c_uint, c_ulong, uint8_t, int64_t, uint64_t, size_t, SEEK_CUR};
use super::super::avutil::{AVClass, AVBPrint, AVDictionary};

pub const AVIO_SEEKABLE_NORMAL: c_int = 0x0001;

pub const AVSEEK_SIZE:  c_int = 0x10000;
pub const AVSEEK_FORCE: c_int = 0x20000;

pub const AVIO_FLAG_READ:       c_int = 1;
pub const AVIO_FLAG_WRITE:      c_int = 2;
pub const AVIO_FLAG_READ_WRITE: c_int = AVIO_FLAG_READ | AVIO_FLAG_WRITE;
pub const AVIO_FLAG_NONBLOCK:   c_int = 8;
pub const AVIO_FLAG_DIRECT:     c_int = 0x8000;

#[repr(C)]
pub struct AVIOInterruptCB {
	pub callback: extern fn(*mut c_void) -> c_int,
	pub opaque: *mut c_void,
}

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[repr(C)]
pub enum AVIODirEntryType {
	AVIO_ENTRY_UNKNOWN,
	AVIO_ENTRY_BLOCK_DEVICE,
	AVIO_ENTRY_CHARACTER_DEVICE,
	AVIO_ENTRY_DIRECTORY,
	AVIO_ENTRY_NAMED_PIPE,
	AVIO_ENTRY_SYMBOLIC_LINK,
	AVIO_ENTRY_SOCKET,
	AVIO_ENTRY_FILE,
	AVIO_ENTRY_SERVER,
	AVIO_ENTRY_SHARE,
	AVIO_ENTRY_WORKGROUP,
}

#[repr(C)]
pub struct AVIODirEntry {
	name: *mut c_char,
	kind: c_int,
	utf8: c_int,

	size: int64_t,
	modification_timestamp: int64_t,

	access_timestamp: int64_t,

	status_change_timestamp: int64_t,

	user_id: int64_t,
	group_id: int64_t,
	filemode: int64_t,
}

#[repr(C)]
pub struct AVIODirContext {
	url_context: *mut c_void,
}

#[repr(C)]
pub struct AVIOContext {
	pub av_class: *mut AVClass,
	pub buffer: *mut c_uchar,
	pub buffer_size: c_int,
	pub buf_ptr: *mut c_uchar,
	pub buf_end: *mut c_uchar,
	pub opaque: *mut c_void,
	pub read_packet: extern fn(*mut c_void, *mut uint8_t, c_int) -> c_int,
	pub write_packet: extern fn(*mut c_void, *mut uint8_t, c_int) -> c_int,
	pub seek: extern fn(*mut c_void, int64_t, c_int) -> int64_t,
	pub pos: int64_t,
	pub must_flush: c_int,
	pub eof_reached: c_int,
	pub write_flag: c_int,
	pub max_packet_size: c_int,
	pub checksum: c_ulong,
	pub checksum_ptr: *mut c_uchar,
	pub update_checksum: extern fn(c_ulong, *const uint8_t, c_uint) -> c_uint,
	pub error: c_int,
	pub read_pause: extern fn(*mut c_void, c_int) -> c_int,
	pub read_seek: extern fn(*mut c_void, c_int, int64_t, c_int) -> int64_t,
	pub seekable: c_int,
	pub maxsize: int64_t,
	pub direct: c_int,
	pub bytes_read: int64_t,
	pub seek_count: c_int,
	pub writeout_count: c_int,
	pub orig_buffer_size: c_int,
	pub short_seek_threshold: c_int,
}

#[inline(always)]
pub unsafe fn avio_tell(s: *mut AVIOContext) -> int64_t {
	avio_seek(s, 0, SEEK_CUR)
}

extern {
	pub fn avio_find_protocol_name(url: *const c_char) -> *const c_char;
	pub fn avio_check(url: *const c_char, flags: c_int) -> c_int;
	pub fn avio_open_dir(s: *mut *mut AVIODirContext, url: *const c_char, options: *mut *mut AVDictionary) -> c_int;
	pub fn avio_read_dir(s: *mut AVIODirContext, next: *mut *mut AVIODirEntry) -> c_int;
	pub fn avio_close_dir(s: *mut *mut AVIODirContext) -> c_int;
	pub fn avio_free_directory_entry(entry: *mut *mut AVIODirEntry);
	pub fn avio_alloc_context(buffer: *mut c_uchar, buffer_size: c_int, write_flag: c_int, opaque: *mut c_void, read_packet: extern fn(*mut c_void, *mut uint8_t, c_int) -> c_int, write_packet: extern fn(*mut c_void, *mut uint8_t, c_int) -> c_int, seek: extern fn(*mut c_void, int64_t, c_int) -> int64_t) -> *mut AVIOContext;

	pub fn avio_write(s: *mut AVIOContext, buf: *const c_uchar, size: c_int);
	pub fn avio_w8(s: *mut AVIOContext, b: c_int);
	pub fn avio_wl64(s: *mut AVIOContext, val: uint64_t);
	pub fn avio_wb64(s: *mut AVIOContext, val: uint64_t);
	pub fn avio_wl32(s: *mut AVIOContext, val: c_uint);
	pub fn avio_wb32(s: *mut AVIOContext, val: c_uint);
	pub fn avio_wl24(s: *mut AVIOContext, val: c_uint);
	pub fn avio_wb24(s: *mut AVIOContext, val: c_uint);
	pub fn avio_wl16(s: *mut AVIOContext, val: c_uint);
	pub fn avio_wb16(s: *mut AVIOContext, val: c_uint);

	pub fn avio_put_str(s: *mut AVIOContext, string: *const c_char) -> c_int;
	pub fn avio_put_str16le(s: *mut AVIOContext, string: *const c_char) -> c_int;
	pub fn avio_put_str16be(s: *mut AVIOContext, string: *const c_char) -> c_int;

	pub fn avio_seek(s: *mut AVIOContext, offset: int64_t, whence: c_int) -> int64_t;
	pub fn avio_skip(s: *mut AVIOContext, offset: int64_t) -> int64_t;
	pub fn avio_size(s: *mut AVIOContext) -> int64_t;
	pub fn avio_feof(s: *mut AVIOContext) -> c_int;

	pub fn avio_printf(s: *mut AVIOContext, fmt: *const c_char, ...) -> c_int;
	pub fn avio_flush(s: *mut AVIOContext);

	pub fn avio_read(s: *mut AVIOContext, buf: *mut c_uchar, size: c_int) -> c_int;
	pub fn avio_r8(s: *mut AVIOContext) -> c_int;
	pub fn avio_rl16(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rl24(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rl32(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rl64(s: *mut AVIOContext) -> uint64_t;
	pub fn avio_rb16(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rb24(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rb32(s: *mut AVIOContext) -> c_uint;
	pub fn avio_rb64(s: *mut AVIOContext) -> uint64_t;

	pub fn avio_get_str(pb: *mut AVIOContext, maxlen: c_int, buf: *mut c_char, buflen: c_int) -> c_int;
	pub fn avio_get_str16le(pb: *mut AVIOContext, maxlen: c_int, buf: *mut c_char, buflen: c_int) -> c_int;
	pub fn avio_get_str16be(pb: *mut AVIOContext, maxlen: c_int, buf: *mut c_char, buflen: c_int) -> c_int;

	pub fn avio_open(s: *mut *mut AVIOContext, url: *const c_char, flags: c_int) -> c_int;
	pub fn avio_open2(s: *mut *mut AVIOContext, url: *const c_char, flags: c_int, int_cb: *const AVIOInterruptCB, options: *mut *mut AVDictionary) -> c_int;

	pub fn avio_close(s: *mut AVIOContext) -> c_int;
	pub fn avio_closep(s: *mut *mut AVIOContext) -> c_int;

	pub fn avio_open_dyn_buf(s: *mut *mut AVIOContext) -> c_int;
	pub fn avio_close_dyn_buf(s: *mut AVIOContext, pbuffer: *mut *mut uint8_t) -> c_int;

	pub fn avio_enum_protocols(opaque: *mut *mut c_void, output: c_int) -> *const c_char;
	pub fn avio_pause(h: *mut AVIOContext, pause: c_int) -> c_int;
	pub fn avio_seek_time(h: *mut AVIOContext, stream_index: c_int, timestamp: int64_t, flags: c_int) -> int64_t;
	pub fn avio_read_to_bprint(h: *mut AVIOContext, pb: *mut AVBPrint, max_size: size_t) -> c_int;

	pub fn avio_accept(s: *mut AVIOContext, c: *mut *mut AVIOContext) -> c_int;
	pub fn avio_handshake(c: *mut AVIOContext) -> c_int;

	pub fn avpriv_io_move(url_src: *const c_char, url_dst: *const c_char) -> c_int;
	pub fn avpriv_io_delete(url: *const c_char) -> c_int;
}