]> git.nihav.org Git - nihav.git/commitdiff
vp3: move loop filter to common
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 5 Jun 2019 17:11:27 +0000 (19:11 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 5 Jun 2019 17:11:27 +0000 (19:11 +0200)
nihav-duck/src/codecs/vp3.rs
nihav-duck/src/codecs/vpcommon.rs

index 796fbf6f75b1e8973c077b7b4f9e941c0ddc1aa2..2e6137f6ba0ee25bbf2c6dd8b5d8c216e8be3959 100644 (file)
@@ -506,39 +506,14 @@ fn vp3_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw:
     }
 }
 
-fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, loop_str: i16) {
-    for _ in 0..8 {
-        let a = data[off - step * 2] as i16;
-        let b = data[off - step] as i16;
-        let c = data[off] as i16;
-        let d = data[off + step] as i16;
-        let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3;
-        if diff.abs() >= 2 * loop_str {
-            diff = 0;
-        } else if diff.abs() >= loop_str {
-            if diff < 0 {
-                diff = -diff - 2 * loop_str;
-            } else {
-                diff = -diff + 2 * loop_str;
-            }
-        }
-        if diff != 0 {
-            data[off - step] = (b + diff).max(0).min(255) as u8;
-            data[off]        = (c - diff).max(0).min(255) as u8;
-        }
-
-        off += stride;
-    }
-}
-
 fn vp31_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
     let off = frm.offset[plane] + x + y * frm.stride[plane];
-    vp31_loop_filter(frm.data, off, 1, frm.stride[plane], loop_str);
+    vp31_loop_filter(frm.data, off, 1, frm.stride[plane], 8, loop_str);
 }
 
 fn vp31_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
     let off = frm.offset[plane] + x + y * frm.stride[plane];
-    vp31_loop_filter(frm.data, off, frm.stride[plane], 1, loop_str);
+    vp31_loop_filter(frm.data, off, frm.stride[plane], 1, 8, loop_str);
 }
 
 pub const VP3_INTERP_FUNCS: &[blockdsp::BlkInterpFunc] = &[ vp3_interp00, vp3_interp01, vp3_interp10, vp3_interp11 ];
index cac264b8c51301060a45e860085799f26a19ceed..8ea6a47afe67b2130a529541f4224be9bc45a8a7 100644 (file)
@@ -186,3 +186,30 @@ pub fn vp_add_block_dc(coeffs: &mut [i16; 64], bx: usize, by: usize, plane: usiz
         off += frm.stride[plane];
     }
 }
+
+pub fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize,
+                        len: usize, loop_str: i16) {
+    for _ in 0..len {
+        let a = data[off - step * 2] as i16;
+        let b = data[off - step] as i16;
+        let c = data[off] as i16;
+        let d = data[off + step] as i16;
+        let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3;
+        if diff.abs() >= 2 * loop_str {
+            diff = 0;
+        } else if diff.abs() >= loop_str {
+            if diff < 0 {
+                diff = -diff - 2 * loop_str;
+            } else {
+                diff = -diff + 2 * loop_str;
+            }
+        }
+        if diff != 0 {
+            data[off - step] = (b + diff).max(0).min(255) as u8;
+            data[off]        = (c - diff).max(0).min(255) as u8;
+        }
+
+        off += stride;
+    }
+}
+