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
use libc::{c_int, uint32_t, int64_t, c_double};

#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[repr(C)]
pub struct AVRational {
	pub num: c_int,
	pub den: c_int,
}

#[inline(always)]
pub unsafe fn av_make_q(num: c_int, den: c_int) -> AVRational {
	AVRational { num: num, den: den }
}

#[inline(always)]
pub unsafe fn av_cmp_q(a: AVRational, b: AVRational) -> c_int {
	let tmp: int64_t = a.num as int64_t * b.den as int64_t - b.num as int64_t * a.den as int64_t;

	if tmp != 0 {
		(((tmp ^ a.den as int64_t ^ b.den as int64_t) >> 63) | 1) as c_int
	}
	else if b.den != 0 && a.den != 0 {
		0
	}
	else if a.num != 0 && b.num != 0 {
		((a.num as int64_t >> 31) - (b.num as int64_t >> 31)) as c_int
	}
	else {
		c_int::min_value()
	}
}

#[inline(always)]
pub unsafe fn av_q2d(a: AVRational) -> c_double {
	a.num as c_double / a.den as c_double
}

#[inline(always)]
pub unsafe fn av_inv_q(q: AVRational) -> AVRational {
	AVRational { num: q.den, den: q.num }
}

extern {
	pub fn av_reduce(dst_num: *mut c_int, dst_den: *mut c_int, num: int64_t, den: int64_t, max: int64_t) -> c_int;
	pub fn av_mul_q(b: AVRational, c: AVRational) -> AVRational;
	pub fn av_div_q(b: AVRational, c: AVRational) -> AVRational;
	pub fn av_add_q(b: AVRational, c: AVRational) -> AVRational;
	pub fn av_sub_q(b: AVRational, c: AVRational) -> AVRational;
	pub fn av_d2q(d: c_double, max: c_int) -> AVRational;
	pub fn av_nearer_q(q: AVRational, q1: AVRational, q2: AVRational) -> c_int;
	pub fn av_find_nearest_q_idx(q: AVRational, q_list: *const AVRational) -> c_int;
	pub fn av_q2intfloat(q: AVRational) -> uint32_t;
}