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
use crate::libc::c_double;

pub type CVOptionFlags = u64;

#[repr(C)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct CVSMPTETime {
    pub subframes: i16,
    pub subframeDivisor: i16,
    pub counter: u32,
    pub type_: u32,
    pub flags: u32,
    pub hours: i16,
    pub minutes: i16,
    pub seconds: i16,
    pub frames: i16,
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CVSMPTETimeType {
    kCVSMPTETimeType24       = 0,
    kCVSMPTETimeType25       = 1,
    kCVSMPTETimeType30Drop   = 2,
    kCVSMPTETimeType30       = 3,
    kCVSMPTETimeType2997     = 4,
    kCVSMPTETimeType2997Drop = 5,
    kCVSMPTETimeType60       = 6,
    kCVSMPTETimeType5994     = 7,
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CVSMPTETimeFlags {
    kCVSMPTETimeValid   = (1 << 0),
    kCVSMPTETimeRunning = (1 << 1),
}

#[repr(i32)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CVTimeFlags {
    kCVTimeIsIndefinite = (1 << 0),
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct CVTime {
    pub timeValue: i64,
    pub timeScale: i32,
    pub flags: i32,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct CVTimeStamp {
    pub version: u32,
    pub videoTimeScale: i32,
    pub videoTime: i64,
    pub hostTime: u64,
    pub rateScalar: c_double,
    pub videoRefreshPeriod: i64,
    pub smpteTime: CVSMPTETime,
    pub flags: u64,
    pub reserved: u64,
}

#[repr(u64)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CVTimeStampFlags {
    kCVTimeStampVideoTimeValid     = (1 << 0),
    kCVTimeStampHostTimeValid      = (1 << 1),
    kCVTimeStampSMPTETimeValid     = (1 << 2),
    kCVTimeStampVideoRefreshPeriodValid = (1 << 3),
    kCVTimeStampRateScalarValid    = (1 << 4),
    kCVTimeStampTopField           = (1 << 16),
    kCVTimeStampBottomField        = (1 << 17),
    kCVTimeStampVideoHostTimeValid = (1 << 0) | (1 << 1), /* kCVTimeStampVideoTimeValid |
                                                           * kCVTimeStampHostTimeValid */
    kCVTimeStampIsInterlaced       = (1 << 16) | (1 << 17), /* kCVTimeStampTopField |
                                                             * kCVTimeStampBottomField */
}

extern "C" {
    pub static kCVZeroTime: CVTime;
    pub static kCVIndefiniteTime: CVTime;
}