@@ -21,6 +21,7 @@ use num_derive::*;
21
21
use num_traits:: cast:: FromPrimitive ;
22
22
23
23
use crate :: prelude as rav1e;
24
+ use crate :: api:: config:: InvalidConfig ;
24
25
25
26
type PixelRange = rav1e:: PixelRange ;
26
27
type ChromaSamplePosition = rav1e:: ChromaSamplePosition ;
@@ -114,6 +115,31 @@ impl From<Option<rav1e::EncoderStatus>> for EncoderStatus {
114
115
/// Use rav1e_config_unref() to free its memory.
115
116
pub struct Config {
116
117
cfg : rav1e:: Config ,
118
+ last_err : Option < InvalidConfig > ,
119
+ }
120
+
121
+ impl Config {
122
+ fn rav1e_config_validate ( & mut self ) -> bool {
123
+ if let Err ( err) = self . cfg . validate ( ) {
124
+ self . last_err = Some ( err) ;
125
+ return false ;
126
+ }
127
+ true
128
+ }
129
+ /// Returns the last error as a string
130
+ pub unsafe fn rav1e_last_config_error_str ( & self ) -> * mut c_char {
131
+ let last_error = format ! ( "{:?}" , self . last_err) ;
132
+ let cbuf = CString :: new ( last_error) . unwrap ( ) ;
133
+ let len = cbuf. as_bytes_with_nul ( ) . len ( ) ;
134
+ let ret = libc:: malloc ( len) ;
135
+
136
+ if !ret. is_null ( ) {
137
+ let cptr = cbuf. as_ptr ( ) as * const libc:: c_void ;
138
+ libc:: memcpy ( ret, cptr, len) ;
139
+ }
140
+
141
+ ret as * mut c_char
142
+ }
117
143
}
118
144
119
145
enum EncContext {
@@ -257,7 +283,7 @@ pub unsafe extern fn rav1e_data_unref(data: *mut Data) {
257
283
pub unsafe extern fn rav1e_config_default ( ) -> * mut Config {
258
284
let cfg = rav1e:: Config { enc : rav1e:: EncoderConfig :: default ( ) , threads : 0 } ;
259
285
260
- let c = Box :: new ( Config { cfg } ) ;
286
+ let c = Box :: new ( Config { cfg : cfg , last_err : None } ) ;
261
287
262
288
Box :: into_raw ( c)
263
289
}
0 commit comments