use crate::av::as_ptr::AsMutVoidPtr; use crate::av::dictionary::Dictionary; use ffmpeg_sys_next::{av_opt_find, av_opt_get_int, av_opt_set_dict, av_opt_set_int}; use std::ffi::CString; use std::ptr::null; pub trait Options: AsMutVoidPtr { fn set_options(&mut self, mut options: Dictionary) { options.disown(); unsafe { av_opt_set_dict(self.as_mut_void_ptr(), &mut options.as_mut_ptr()); } } fn set_flag(&self, option: &str, flag: &str) -> bool { let option_c = CString::new(option).unwrap(); let flag_c = CString::new(flag).unwrap(); unsafe { let option = av_opt_find(self.as_mut_void_ptr(), option_c.as_ptr(), null(), 0, 0); let flag = av_opt_find(self.as_mut_void_ptr(), flag_c.as_ptr(), null(), 0, 0); if flag.is_null() || option.is_null() { return false; } let mut val: i64 = 0; av_opt_get_int(self.as_mut_void_ptr(), option_c.as_ptr(), 0, &mut val); av_opt_set_int( self.as_mut_void_ptr(), option_c.as_ptr(), val | (*flag).default_val.i64, 0, ); } true } }