| 174 | } |
| 175 | |
| 176 | fn test_av1( |
| 177 | c: &mut Capturer, |
| 178 | width: usize, |
| 179 | height: usize, |
| 180 | quality: Q, |
| 181 | yuv_count: usize, |
| 182 | i444: bool, |
| 183 | ) { |
| 184 | let config = EncoderCfg::AOM(AomEncoderConfig { |
| 185 | width: width as _, |
| 186 | height: height as _, |
| 187 | quality, |
| 188 | keyframe_interval: None, |
| 189 | }); |
| 190 | let mut encoder = AomEncoder::new(config, i444).unwrap(); |
| 191 | let start = Instant::now(); |
| 192 | let mut size = 0; |
| 193 | let mut av1s: Vec<Vec<u8>> = vec![]; |
| 194 | let mut yuv = Vec::new(); |
| 195 | let mut mid_data = Vec::new(); |
| 196 | let mut counter = 0; |
| 197 | let mut time_sum = Duration::ZERO; |
| 198 | loop { |
| 199 | match c.frame(std::time::Duration::from_millis(30)) { |
| 200 | Ok(frame) => { |
| 201 | let tmp_timer = Instant::now(); |
| 202 | let frame = frame.to(encoder.yuvfmt(), &mut yuv, &mut mid_data).unwrap(); |
| 203 | let yuv = frame.yuv().unwrap(); |
| 204 | for ref frame in encoder |
| 205 | .encode(start.elapsed().as_millis() as _, &yuv, STRIDE_ALIGN) |
| 206 | .unwrap() |
| 207 | { |
| 208 | size += frame.data.len(); |
| 209 | av1s.push(frame.data.to_vec()); |
| 210 | counter += 1; |
| 211 | print!("\rAV1 {}/{}", counter, yuv_count); |
| 212 | std::io::stdout().flush().ok(); |
| 213 | } |
| 214 | time_sum += tmp_timer.elapsed(); |
| 215 | } |
| 216 | Err(e) => { |
| 217 | log::error!("{e:?}"); |
| 218 | } |
| 219 | } |
| 220 | if counter >= yuv_count { |
| 221 | println!(); |
| 222 | break; |
| 223 | } |
| 224 | } |
| 225 | assert_eq!(av1s.len(), yuv_count); |
| 226 | println!( |
| 227 | "AV1 encode: {:?}, {} byte", |
| 228 | time_sum / yuv_count as _, |
| 229 | size / yuv_count |
| 230 | ); |
| 231 | let mut decoder = AomDecoder::new().unwrap(); |
| 232 | let start = Instant::now(); |
| 233 | for av1 in av1s { |