aboutsummaryrefslogtreecommitdiffstats
path: root/nihav-duck/src/codecs/vp6enc
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2022-03-02 18:31:00 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2022-03-02 18:31:00 +0100
commitc5d5793c1fd18882a32acabb8141a221b0a97b61 (patch)
tree7172354296c43bb0fa723ab1859c07310a605ca3 /nihav-duck/src/codecs/vp6enc
parentb922b48d3b003b2f4b84755541fd9dc4be8f22f6 (diff)
downloadnihav-c5d5793c1fd18882a32acabb8141a221b0a97b61.tar.gz
VP7 encoder
Diffstat (limited to 'nihav-duck/src/codecs/vp6enc')
-rw-r--r--nihav-duck/src/codecs/vp6enc/dsp.rs19
-rw-r--r--nihav-duck/src/codecs/vp6enc/mb.rs13
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;