ffav_sys/avutil/
rational.rs

1use 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/// # Safety
23#[inline(always)]
24pub unsafe fn av_make_q(num: c_int, den: c_int) -> AVRational {
25    AVRational { num, den }
26}
27
28/// # Safety
29#[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/// # Safety
45#[inline(always)]
46pub unsafe fn av_q2d(a: AVRational) -> c_double {
47    f64::from(a.num) / f64::from(a.den)
48}
49
50/// # Safety
51#[inline(always)]
52pub unsafe fn av_inv_q(q: AVRational) -> AVRational {
53    AVRational {
54        num: q.den,
55        den: q.num,
56    }
57}