diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2022-03-02 18:31:00 +0100 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2022-03-02 18:31:00 +0100 |
commit | c5d5793c1fd18882a32acabb8141a221b0a97b61 (patch) | |
tree | 7172354296c43bb0fa723ab1859c07310a605ca3 /nihav-duck/src/codecs/vp6enc | |
parent | b922b48d3b003b2f4b84755541fd9dc4be8f22f6 (diff) | |
download | nihav-c5d5793c1fd18882a32acabb8141a221b0a97b61.tar.gz |
VP7 encoder
Diffstat (limited to 'nihav-duck/src/codecs/vp6enc')
-rw-r--r-- | nihav-duck/src/codecs/vp6enc/dsp.rs | 19 | ||||
-rw-r--r-- | nihav-duck/src/codecs/vp6enc/mb.rs | 13 |
2 files changed, 20 insertions, 12 deletions
diff --git a/nihav-duck/src/codecs/vp6enc/dsp.rs b/nihav-duck/src/codecs/vp6enc/dsp.rs index b83cd11..2651458 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<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; @@ -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) } } } diff --git a/nihav-duck/src/codecs/vp6enc/mb.rs b/nihav-duck/src/codecs/vp6enc/mb.rs index de480ca..c7e5003 100644 --- a/nihav-duck/src/codecs/vp6enc/mb.rs +++ b/nihav-duck/src/codecs/vp6enc/mb.rs @@ -355,11 +355,8 @@ impl FrameEncoder { let mut mv_est = MVEstimator::new(ref_frame, mc_buf, loop_thr, self.me_range); - let mut mv_search: Box<dyn MVSearch> = match self.me_mode { - MVSearchMode::Full => Box::new(FullMVSearch::new()), - MVSearchMode::Diamond => Box::new(DiaSearch::new()), - MVSearchMode::Hexagon => Box::new(HexSearch::new()), - }; + let mut mv_search = self.me_mode.create_search(); + let mut mb_pos = 0; for (mb_y, row) in inter_mbs.chunks_mut(self.mb_w).enumerate() { for (mb_x, mb) in row.iter_mut().enumerate() { @@ -406,11 +403,7 @@ impl FrameEncoder { let mut mv_est = MVEstimator::new(ref_frame, mc_buf, loop_thr, self.me_range); - let mut mv_search: Box<dyn MVSearch> = match self.me_mode { - MVSearchMode::Full => Box::new(FullMVSearch::new()), - MVSearchMode::Diamond => Box::new(DiaSearch::new()), - MVSearchMode::Hexagon => Box::new(HexSearch::new()), - }; + let mut mv_search = self.me_mode.create_search(); for i in 0..4 { let xpos = mb_x * 16 + (i & 1) * 8; |