diff --git a/src/deblock.rs b/src/deblock.rs index 501251982f301379adc6ad4a2b87adb1e4e851c9..e1c2b781e9468ff0441ef053ee95779c9de65271 100644 --- a/src/deblock.rs +++ b/src/deblock.rs @@ -12,6 +12,7 @@ use std::cmp; use context::*; use plane::*; +use quantize::*; use partition::*; use partition::PredictionMode::*; use util::clamp; @@ -485,3 +486,37 @@ pub fn deblock_filter_frame(fi: &FrameInvariants, fs: &mut FrameState, deblock_plane(fi, &fs.deblock, &mut fs.rec.planes[p], p, bc, bit_depth); } } + +pub fn deblock_filter_optimize(fi: &FrameInvariants, fs: &mut FrameState, + _bc: &mut BlockContext, bit_depth: usize) { + let q = ac_q(fi.base_q_idx, bit_depth) as i32; + let level = clamp (match bit_depth { + 8 => { + if fi.frame_type == FrameType::KEY { + q * 17563 - 421574 + (1<<18>>1) >> 18 + } else { + q * 6017 + 650707 + (1<<18>>1) >> 18 + } + } + 10 => { + if fi.frame_type == FrameType::KEY { + (q * 20723 + 4060632 + (1<<20>>1) >> 20) - 4 + } else { + q * 20723 + 4060632 + (1<<20>>1) >> 20 + } + } + 12 => { + if fi.frame_type == FrameType::KEY { + (q * 20723 + 16242526 + (1<<22>>1) >> 22) - 4 + } else { + q * 20723 + 16242526 + (1<<22>>1) >> 22 + } + } + _ => {assert!(false); 0} + }, 0, MAX_LOOP_FILTER as i32) as u8; + + fs.deblock.levels[0] = level; + fs.deblock.levels[1] = level; + fs.deblock.levels[2] = level; + fs.deblock.levels[3] = level; +} diff --git a/src/encoder.rs b/src/encoder.rs index 584fea628a6837237c05d052bf042a02096a8034..68986ce7198206c81544e6707d6f013f041ce7a4 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -1925,6 +1925,7 @@ fn encode_tile(sequence: &mut Sequence, fi: &FrameInvariants, fs: &mut FrameStat } } /* TODO: Don't apply if lossless */ + deblock_filter_optimize(fi, fs, &mut cw.bc, bit_depth); if fs.deblock.levels[0] != 0 || fs.deblock.levels[1] != 0 { deblock_filter_frame(fi, fs, &mut cw.bc, bit_depth); }