[go: up one dir, main page]

aom_sys/
lib.rs

1#![allow(dead_code)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(non_upper_case_globals)]
5
6pub mod aom {
7    include!(concat!(env!("OUT_DIR"), "/aom.rs"));
8}
9
10pub use aom::*;
11
12#[cfg(test)]
13mod tests {
14    use super::aom::*;
15    use std::ffi::CStr;
16    use std::mem;
17    #[test]
18    fn version() {
19        println!("{}", unsafe {
20            CStr::from_ptr(aom_codec_version_str()).to_string_lossy()
21        });
22        println!("{}", unsafe {
23            CStr::from_ptr(aom_codec_build_config()).to_string_lossy()
24        });
25    }
26    #[test]
27    fn encode() {
28        let w = 360;
29        let h = 360;
30        let align = 32;
31        let kf_interval = 10;
32        let mut raw = mem::MaybeUninit::uninit();
33        let mut ctx = mem::MaybeUninit::uninit();
34
35        let ret =
36            unsafe { aom_img_alloc(raw.as_mut_ptr(), aom_img_fmt::AOM_IMG_FMT_I420, w, h, align) };
37        if ret.is_null() {
38            panic!("Image allocation failed");
39        }
40        #[allow(clippy::forget_copy)]
41        mem::forget(ret); // raw and ret are the same (ret does not implement Drop trait)
42        let raw = unsafe { raw.assume_init() };
43        print!("{:#?}", raw);
44
45        let mut cfg = mem::MaybeUninit::uninit();
46        let mut ret =
47            unsafe { aom_codec_enc_config_default(aom_codec_av1_cx(), cfg.as_mut_ptr(), 0) };
48
49        if ret != aom_codec_err_t::AOM_CODEC_OK {
50            panic!("Default Configuration failed");
51        }
52
53        let mut cfg = unsafe { cfg.assume_init() };
54
55        cfg.g_w = w;
56        cfg.g_h = h;
57        cfg.g_timebase.num = 1;
58        cfg.g_timebase.den = 30;
59        cfg.rc_target_bitrate = 100 * 1014;
60
61        ret = unsafe {
62            aom_codec_enc_init_ver(
63                ctx.as_mut_ptr(),
64                aom_codec_av1_cx(),
65                &cfg,
66                0,
67                AOM_ENCODER_ABI_VERSION as i32,
68            )
69        };
70
71        if ret != aom_codec_err_t::AOM_CODEC_OK {
72            panic!("Codec Init failed");
73        }
74
75        let mut ctx = unsafe { ctx.assume_init() };
76
77        let mut out = 0;
78        for i in 0..100 {
79            let mut flags = 0;
80            if i % kf_interval == 0 {
81                flags |= AOM_EFLAG_FORCE_KF;
82            }
83            unsafe {
84                let ret = aom_codec_encode(&mut ctx, &raw, i, 1, flags as aom_enc_frame_flags_t);
85                if ret != aom_codec_err_t::AOM_CODEC_OK {
86                    panic!("Encode failed {:?}", ret);
87                }
88
89                let mut iter = mem::zeroed();
90                loop {
91                    let pkt = aom_codec_get_cx_data(&mut ctx, &mut iter);
92
93                    if pkt.is_null() {
94                        break;
95                    } else {
96                        println!("{:#?}", (*pkt).kind);
97                        out = 1;
98                    }
99                }
100            }
101        }
102
103        if out != 1 {
104            panic!("No packet produced");
105        }
106    }
107}