X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp6enc%2Fdsp.rs;h=90c76b99c7244cecd8a1a6c56425d4e07ada7d55;hb=e6aaad5c5273cd814b5748b7faf3751835a37217;hp=b83cd11e09d5c96f4fb357efdbff07a52627d798;hpb=19cfcd2f207b472c03de4c14db85d0cac1d93fa9;p=nihav.git diff --git a/nihav-duck/src/codecs/vp6enc/dsp.rs b/nihav-duck/src/codecs/vp6enc/dsp.rs index b83cd11..90c76b9 100644 --- a/nihav-duck/src/codecs/vp6enc/dsp.rs +++ b/nihav-duck/src/codecs/vp6enc/dsp.rs @@ -69,6 +69,21 @@ pub fn vp_fdct(blk: &mut [i16; 64]) { } } +pub trait MVSearchModeCreate { + fn create_search(&self) -> Box; +} + +impl MVSearchModeCreate for MVSearchMode { + fn create_search(&self) -> Box { + 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; @@ -190,10 +205,10 @@ macro_rules! pattern_search { 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) } } } @@ -311,7 +326,7 @@ impl MVEstimator { 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 } @@ -326,7 +341,7 @@ pub fn calc_mb_dist(mb1: &ResidueMB, mb2: &ResidueMB) -> u32 { 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