-5 * el!($s, $o + 2 * $step)
+ el!($s, $o + 3 * $step) + 32) >> 6) as i16)
);
+ (33; $s: ident, $o: expr, $stride: expr) => (
+ clip8((( el!($s, $o)
+ + el!($s, $o + 1)
+ + el!($s, $o + $stride)
+ + el!($s, $o + 1 + $stride) + 2) >> 2) as i16)
+ );
}
macro_rules! mc_func {
$ofilt(dst, didx, dstride, &buf, 2*bstride, $size);
}
);
+ (mc33; $name: ident, $size: expr) => (
+ fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
+ for _ in 0..$size {
+ for x in 0..$size { dst[didx + x] = filter!(33; src, sidx + x, sstride); }
+ sidx += sstride;
+ didx += dstride;
+ }
+ }
+ );
}
mc_func!(copy; copy_16, 16);
mc_func!(copy; copy_8, 8);
mc_func!(cm03; luma_mc_31_8, 8, luma_mc_01_8);
mc_func!(cm03; luma_mc_32_16, 16, luma_mc_02_16);
mc_func!(cm03; luma_mc_32_8, 8, luma_mc_02_8);
-mc_func!(cm03; luma_mc_33_16, 16, luma_mc_03_16);
-mc_func!(cm03; luma_mc_33_8, 8, luma_mc_03_8);
+mc_func!(mc33; luma_mc_33_16, 16);
+mc_func!(mc33; luma_mc_33_8, 8);
const RV40_CHROMA_BIAS: [[u16; 4]; 4] = [
[ 0, 4, 8, 4 ],
pix[off - step] = clip8(p0 + diff);
pix[off ] = clip8(q0 - diff);
- if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) {
+ if filter_p1 && ((p1 - p2).wrapping_abs() <= beta) {
let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1;
pix[off - 2*step] = clip8(p1 - clip_symm(p1_diff, lim_p1));
}
- if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) {
+ if filter_q1 && ((q1 - q2).wrapping_abs() <= beta) {
let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1;
pix[off + step] = clip8(q1 - clip_symm(q1_diff, lim_q1));
}
ch[3 - 1] = clip8(p0 + diff);
ch[3 ] = clip8(q0 - diff);
- if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) {
+ if filter_p1 && ((p1 - p2).wrapping_abs() <= beta) {
let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1;
ch[3 - 2] = clip8(p1 - clip_symm(p1_diff, lim_p1));
}
- if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) {
+ if filter_q1 && ((q1 - q2).wrapping_abs() <= beta) {
let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1;
ch[3 + 1] = clip8(q1 - clip_symm(q1_diff, lim_q1));
}
} else if val > c + lims {
c + lims
} else {
- c
+ val
}
} else {
val
let q3 = el!(pix, off + 3*step);
let np0 = sfilter(p2, p1, p0, q0, q1, RV40_DITHER_L[dmode + i], fmode != 0, lims);
- let nq0 = sfilter( p1, p0, q0, q1, q0, RV40_DITHER_R[dmode + i], fmode != 0, lims);
+ let nq0 = sfilter( p1, p0, q0, q1, q2, RV40_DITHER_R[dmode + i], fmode != 0, lims);
let np1 = sfilter(p3, p2, p1, np0, q0, RV40_DITHER_L[dmode + i], fmode != 0, lims);
let nq1 = sfilter( p0, nq0, q1, q2, q3, RV40_DITHER_R[dmode + i], fmode != 0, lims);
pix[off + step] = nq1 as u8;
if !chroma {
- let np2 = sfilter(np0, np1, p2, p3, np1, 64, false, 0);
- let nq2 = sfilter(nq0, nq1, q2, q3, q2, 64, false, 0);
+ let np2 = sfilter(np0, np1, p2, p3, p2, 64, false, 0);
+ let nq2 = sfilter(nq0, nq1, q2, q3, q2, 64, false, 0);
pix[off - 3*step] = np2 as u8;
pix[off + 2*step] = nq2 as u8;
}
const RV40_EDGE2: [isize; 4] = [ 0, 3, 3, 3 ];
impl RV34DSP for RV40DSP {
- fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize) {
+ fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, mb_h: usize, row: usize) {
// todo proper B-frame filtering?
let mut offs: [usize; 3] = [0; 3];
let mut stride: [usize; 3] = [0; 3];