static __inline void vp8_filter(signed char mask, uc hev, uc *op1, uc *op0, uc *oq0, uc *oq1) { signed char ps0, qs0; signed char ps1, qs1; signed char vp8_filter, Filter1, Filter2; signed char u; ps1 = (signed char) * op1 ^ 0x80; ps0 = (signed char) * op0 ^ 0x80; qs0 = (signed char) * oq0 ^ 0x80; qs1 = (signed char) * oq1 ^ 0x80; /* add outer taps if we have high edge variance */ vp8_filter = vp8_signed_char_clamp(ps1 - qs1); vp8_filter &= hev; /* inner taps */ vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * (qs0 - ps0)); vp8_filter &= mask; /* save bottom 3 bits so that we round one side +4 and the other +3 * if it equals 4 we'll set to adjust by -1 to account for the fact * we'd round 3 the other way */ Filter1 = vp8_signed_char_clamp(vp8_filter + 4); Filter2 = vp8_signed_char_clamp(vp8_filter + 3); Filter1 >>= 3; Filter2 >>= 3; u = vp8_signed_char_clamp(qs0 - Filter1); *oq0 = u ^ 0x80; u = vp8_signed_char_clamp(ps0 + Filter2); *op0 = u ^ 0x80; vp8_filter = Filter1; /* outer tap adjustments */ vp8_filter += 1; vp8_filter >>= 1; vp8_filter &= ~hev; u = vp8_signed_char_clamp(qs1 - vp8_filter); *oq1 = u ^ 0x80; u = vp8_signed_char_clamp(ps1 + vp8_filter); *op1 = u ^ 0x80; }
static void vp8_filter(signed char mask, uc hev, uc *op1, uc *op0, uc *oq0, uc *oq1) { signed char ps0, qs0; signed char ps1, qs1; signed char filter_value, Filter1, Filter2; signed char u; ps1 = (signed char) * op1 ^ 0x80; ps0 = (signed char) * op0 ^ 0x80; qs0 = (signed char) * oq0 ^ 0x80; qs1 = (signed char) * oq1 ^ 0x80; filter_value = vp8_signed_char_clamp(ps1 - qs1); filter_value &= hev; filter_value = vp8_signed_char_clamp(filter_value + 3 * (qs0 - ps0)); filter_value &= mask; Filter1 = vp8_signed_char_clamp(filter_value + 4); Filter2 = vp8_signed_char_clamp(filter_value + 3); Filter1 >>= 3; Filter2 >>= 3; u = vp8_signed_char_clamp(qs0 - Filter1); *oq0 = u ^ 0x80; u = vp8_signed_char_clamp(ps0 + Filter2); *op0 = u ^ 0x80; filter_value = Filter1; filter_value += 1; filter_value >>= 1; filter_value &= ~hev; u = vp8_signed_char_clamp(qs1 - filter_value); *oq1 = u ^ 0x80; u = vp8_signed_char_clamp(ps1 + filter_value); *op1 = u ^ 0x80; }
static __inline void vp8_simple_filter(signed char mask, uc *op1, uc *op0, uc *oq0, uc *oq1) { signed char vp8_filter, Filter1, Filter2; signed char p1 = (signed char) * op1 ^ 0x80; signed char p0 = (signed char) * op0 ^ 0x80; signed char q0 = (signed char) * oq0 ^ 0x80; signed char q1 = (signed char) * oq1 ^ 0x80; signed char u; vp8_filter = vp8_signed_char_clamp(p1 - q1); vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * (q0 - p0)); vp8_filter &= mask; /* save bottom 3 bits so that we round one side +4 and the other +3 */ Filter1 = vp8_signed_char_clamp(vp8_filter + 4); Filter1 >>= 3; u = vp8_signed_char_clamp(q0 - Filter1); *oq0 = u ^ 0x80; Filter2 = vp8_signed_char_clamp(vp8_filter + 3); Filter2 >>= 3; u = vp8_signed_char_clamp(p0 + Filter2); *op0 = u ^ 0x80; }
static void vp8_simple_filter(signed char mask, uc *op1, uc *op0, uc *oq0, uc *oq1) { signed char filter_value, Filter1, Filter2; signed char p1 = (signed char) * op1 ^ 0x80; signed char p0 = (signed char) * op0 ^ 0x80; signed char q0 = (signed char) * oq0 ^ 0x80; signed char q1 = (signed char) * oq1 ^ 0x80; signed char u; filter_value = vp8_signed_char_clamp(p1 - q1); filter_value = vp8_signed_char_clamp(filter_value + 3 * (q0 - p0)); filter_value &= mask; Filter1 = vp8_signed_char_clamp(filter_value + 4); Filter1 >>= 3; u = vp8_signed_char_clamp(q0 - Filter1); *oq0 = u ^ 0x80; Filter2 = vp8_signed_char_clamp(filter_value + 3); Filter2 >>= 3; u = vp8_signed_char_clamp(p0 + Filter2); *op0 = u ^ 0x80; }
static __inline void vp8_mbfilter(signed char mask, uc hev, uc *op2, uc *op1, uc *op0, uc *oq0, uc *oq1, uc *oq2) { signed char s, u; signed char vp8_filter, Filter1, Filter2; signed char ps2 = (signed char) * op2 ^ 0x80; signed char ps1 = (signed char) * op1 ^ 0x80; signed char ps0 = (signed char) * op0 ^ 0x80; signed char qs0 = (signed char) * oq0 ^ 0x80; signed char qs1 = (signed char) * oq1 ^ 0x80; signed char qs2 = (signed char) * oq2 ^ 0x80; /* add outer taps if we have high edge variance */ vp8_filter = vp8_signed_char_clamp(ps1 - qs1); vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * (qs0 - ps0)); vp8_filter &= mask; Filter2 = vp8_filter; Filter2 &= hev; /* save bottom 3 bits so that we round one side +4 and the other +3 */ Filter1 = vp8_signed_char_clamp(Filter2 + 4); Filter2 = vp8_signed_char_clamp(Filter2 + 3); Filter1 >>= 3; Filter2 >>= 3; qs0 = vp8_signed_char_clamp(qs0 - Filter1); ps0 = vp8_signed_char_clamp(ps0 + Filter2); /* only apply wider filter if not high edge variance */ vp8_filter &= ~hev; Filter2 = vp8_filter; /* roughly 3/7th difference across boundary */ u = vp8_signed_char_clamp((63 + Filter2 * 27) >> 7); s = vp8_signed_char_clamp(qs0 - u); *oq0 = s ^ 0x80; s = vp8_signed_char_clamp(ps0 + u); *op0 = s ^ 0x80; /* roughly 2/7th difference across boundary */ u = vp8_signed_char_clamp((63 + Filter2 * 18) >> 7); s = vp8_signed_char_clamp(qs1 - u); *oq1 = s ^ 0x80; s = vp8_signed_char_clamp(ps1 + u); *op1 = s ^ 0x80; /* roughly 1/7th difference across boundary */ u = vp8_signed_char_clamp((63 + Filter2 * 9) >> 7); s = vp8_signed_char_clamp(qs2 - u); *oq2 = s ^ 0x80; s = vp8_signed_char_clamp(ps2 + u); *op2 = s ^ 0x80; }
static void vp8_mbfilter(signed char mask, uc hev, uc *op2, uc *op1, uc *op0, uc *oq0, uc *oq1, uc *oq2) { signed char s, u; signed char filter_value, Filter1, Filter2; signed char ps2 = (signed char) * op2 ^ 0x80; signed char ps1 = (signed char) * op1 ^ 0x80; signed char ps0 = (signed char) * op0 ^ 0x80; signed char qs0 = (signed char) * oq0 ^ 0x80; signed char qs1 = (signed char) * oq1 ^ 0x80; signed char qs2 = (signed char) * oq2 ^ 0x80; filter_value = vp8_signed_char_clamp(ps1 - qs1); filter_value = vp8_signed_char_clamp(filter_value + 3 * (qs0 - ps0)); filter_value &= mask; Filter2 = filter_value; Filter2 &= hev; Filter1 = vp8_signed_char_clamp(Filter2 + 4); Filter2 = vp8_signed_char_clamp(Filter2 + 3); Filter1 >>= 3; Filter2 >>= 3; qs0 = vp8_signed_char_clamp(qs0 - Filter1); ps0 = vp8_signed_char_clamp(ps0 + Filter2); filter_value &= ~hev; Filter2 = filter_value; u = vp8_signed_char_clamp((63 + Filter2 * 27) >> 7); s = vp8_signed_char_clamp(qs0 - u); *oq0 = s ^ 0x80; s = vp8_signed_char_clamp(ps0 + u); *op0 = s ^ 0x80; u = vp8_signed_char_clamp((63 + Filter2 * 18) >> 7); s = vp8_signed_char_clamp(qs1 - u); *oq1 = s ^ 0x80; s = vp8_signed_char_clamp(ps1 + u); *op1 = s ^ 0x80; u = vp8_signed_char_clamp((63 + Filter2 * 9) >> 7); s = vp8_signed_char_clamp(qs2 - u); *oq2 = s ^ 0x80; s = vp8_signed_char_clamp(ps2 + u); *op2 = s ^ 0x80; }