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); 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}