ffav_sys/avutil/
rational.rs1use crate::AVRational;
2use libc::{c_double, c_int};
3
4impl Default for AVRational {
5 fn default() -> Self {
6 AVRational { den: 0, num: 0 }
7 }
8}
9
10impl AVRational {
11 #[inline]
12 pub fn new(num: i32, den: i32) -> Self {
13 AVRational { num, den }
14 }
15
16 #[inline]
17 pub fn with_normalize(value: i32) -> Self {
18 AVRational { num: 1, den: value }
19 }
20}
21
22#[inline(always)]
24pub unsafe fn av_make_q(num: c_int, den: c_int) -> AVRational {
25 AVRational { num, den }
26}
27
28#[inline(always)]
30pub unsafe fn av_cmp_q(a: AVRational, b: AVRational) -> c_int {
31 let tmp = i64::from(a.num) * i64::from(b.den) - i64::from(b.num) * i64::from(a.den);
32
33 if tmp != 0 {
34 (((tmp ^ i64::from(a.den) ^ i64::from(b.den)) >> 63) | 1) as c_int
35 } else if b.den != 0 && a.den != 0 {
36 0
37 } else if a.num != 0 && b.num != 0 {
38 ((i64::from(a.num) >> 31) - (i64::from(b.num) >> 31)) as c_int
39 } else {
40 c_int::min_value()
41 }
42}
43
44#[inline(always)]
46pub unsafe fn av_q2d(a: AVRational) -> c_double {
47 f64::from(a.num) / f64::from(a.den)
48}
49
50#[inline(always)]
52pub unsafe fn av_inv_q(q: AVRational) -> AVRational {
53 AVRational {
54 num: q.den,
55 den: q.num,
56 }
57}