}
}
+pub trait MVSearchModeCreate {
+ fn create_search(&self) -> Box<dyn MVSearch + Send>;
+}
+
+impl MVSearchModeCreate for MVSearchMode {
+ fn create_search(&self) -> Box<dyn MVSearch + Send> {
+ match *self {
+ MVSearchMode::Full => Box::new(FullMVSearch::new()),
+ MVSearchMode::Diamond => Box::new(DiaSearch::new()),
+ MVSearchMode::Hexagon => Box::new(HexSearch::new()),
+ _ => unreachable!(),
+ }
+ }
+}
+
const MAX_DIST: u32 = std::u32::MAX;
const DIST_THRESH: u32 = 256;
impl MVSearch for $struct_name {
fn search_mb(&mut self, mv_est: &mut MVEstimator, cur_blk: &[[u8; 64]; 6], mb_x: usize, mb_y: usize) -> (MV, u32) {
- search_template!(self, mv_est, cur_blk, mb_x, mb_y, sad_mb)
+ search_template!(self, mv_est, cur_blk, mb_x, mb_y, sad_mb, DIST_THRESH)
}
fn search_blk(&mut self, mv_est: &mut MVEstimator, cur_blk: &[u8; 64], xpos: usize, ypos: usize) -> (MV, u32) {
- search_template!(self, mv_est, cur_blk, xpos, ypos, sad_blk)
+ search_template!(self, mv_est, cur_blk, xpos, ypos, sad_blk, DIST_THRESH)
}
}
}
fn sad(src1: &[u8; 64], src2: &[u8; 64]) -> u32 {
let mut sum = 0;
for (&p1, &p2) in src1.iter().zip(src2.iter()) {
- sum += (i32::from(p1) - i32::from(p2)).abs() as u32;
+ sum += (i32::from(p1) - i32::from(p2)).unsigned_abs();
}
sum
}
let mut sum = 0;
for (blk1, blk2) in mb1.coeffs.iter().zip(mb2.coeffs.iter()) {
for (&c1, &c2) in blk1.iter().zip(blk2.iter()) {
- sum += (i32::from(c1) - i32::from(c2)).abs() as u32;
+ sum += (i32::from(c1) - i32::from(c2)).unsigned_abs();
}
}
sum