1da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian/* 2da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * Copyright (c) 2015 The WebM project authors. All Rights Reserved. 3da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * 4da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian */ 10da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 11da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include <stdlib.h> 12da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vp8_rtcd.h" 13da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp8/common/mips/msa/vp8_macros_msa.h" 14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp8/encoder/denoising.h" 15da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 16da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint32_t vp8_denoiser_filter_msa(uint8_t *mc_running_avg_y_ptr, 17da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int32_t mc_avg_y_stride, 18da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint8_t *running_avg_y_ptr, 197bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t avg_y_stride, uint8_t *sig_ptr, 207bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sig_stride, uint32_t motion_magnitude, 217bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t increase_denoising) { 227bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *running_avg_y_start = running_avg_y_ptr; 237bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *sig_start = sig_ptr; 247bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t cnt = 0; 257bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sum_diff = 0; 267bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t shift_inc1 = 3; 277bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t delta = 0; 287bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sum_diff_thresh; 297bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 src0, src1, src2, src3, src4, src5, src6, src7; 307bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 src8, src9, src10, src11, src12, src13, src14, src15; 317bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 mc_running_avg_y0, running_avg_y, sig0; 327bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 mc_running_avg_y1, running_avg_y1, sig1; 337bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 coeff0, coeff1; 347bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 diff0, diff1, abs_diff0, abs_diff1, abs_diff_neg0, abs_diff_neg1; 357bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 adjust0, adjust1, adjust2, adjust3; 367bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 shift_inc1_vec = { 0 }; 377bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 col_sum0 = { 0 }; 387bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 col_sum1 = { 0 }; 397bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 col_sum2 = { 0 }; 407bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 col_sum3 = { 0 }; 417bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 temp0_h, temp1_h, temp2_h, temp3_h, cmp, delta_vec; 427bc9febe8749e98a3812a0dc4380ceae75c29450Johann v4i32 temp0_w; 437bc9febe8749e98a3812a0dc4380ceae75c29450Johann v2i64 temp0_d, temp1_d; 447bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 zero = { 0 }; 457bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 one = __msa_ldi_h(1); 467bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 four = __msa_ldi_h(4); 477bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 val_127 = __msa_ldi_h(127); 487bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 adj_val = { 6, 4, 3, 0, -6, -4, -3, 0 }; 497bc9febe8749e98a3812a0dc4380ceae75c29450Johann 507bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) { 517bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_add_a_h(adj_val, one); 527bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (increase_denoising) { 537bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_add_a_h(adj_val, one); 547bc9febe8749e98a3812a0dc4380ceae75c29450Johann shift_inc1 = 4; 55da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 56da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 577bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = zero - adj_val; 587bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = (v8i16)__msa_ilvev_d((v2i64)temp0_h, (v2i64)adj_val); 597bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 60da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 617bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_insert_h(adj_val, 3, cnt); 627bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_insert_h(adj_val, 7, cnt); 637bc9febe8749e98a3812a0dc4380ceae75c29450Johann shift_inc1_vec = __msa_fill_h(shift_inc1); 64da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 657bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (cnt = 8; cnt--;) { 667bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 mask0 = { 0 }; 677bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 mask1 = { 0 }; 687bc9febe8749e98a3812a0dc4380ceae75c29450Johann 697bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y0 = LD_UB(mc_running_avg_y_ptr); 707bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig0 = LD_UB(sig_ptr); 717bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 727bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr += mc_avg_y_stride; 737bc9febe8749e98a3812a0dc4380ceae75c29450Johann 747bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y1 = LD_UB(mc_running_avg_y_ptr); 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig1 = LD_UB(sig_ptr); 767bc9febe8749e98a3812a0dc4380ceae75c29450Johann 777bc9febe8749e98a3812a0dc4380ceae75c29450Johann ILVRL_B2_UB(mc_running_avg_y0, sig0, coeff0, coeff1); 787bc9febe8749e98a3812a0dc4380ceae75c29450Johann HSUB_UB2_SH(coeff0, coeff1, diff0, diff1); 797bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = __msa_add_a_h(diff0, zero); 807bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff1 = __msa_add_a_h(diff1, zero); 817bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 15); 827bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 837bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 847bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 7); 857bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 867bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 877bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff0 < shift_inc1_vec; 887bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 897bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 907bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff1, 15); 917bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 927bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 937bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff1, 7); 947bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 957bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 967bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff1 < shift_inc1_vec; 977bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 987bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 997bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_clei_s_h(diff0, 0); 1007bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = temp0_h & four; 1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += temp0_h; 1027bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = __msa_clei_s_h(diff1, 0); 1037bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = temp1_h & four; 1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += temp1_h; 1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann VSHF_H2_SH(adj_val, adj_val, adj_val, adj_val, mask0, mask1, adjust0, 1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1); 1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = __msa_ceqi_h(adjust0, 0); 1087bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp3_h = __msa_ceqi_h(adjust1, 0); 1097bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)diff0, (v16u8)temp2_h); 1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = (v8i16)__msa_bmnz_v((v16u8)adjust1, (v16u8)diff1, (v16u8)temp3_h); 1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(col_sum0, adjust0, col_sum1, adjust1, col_sum0, col_sum1); 1127bc9febe8749e98a3812a0dc4380ceae75c29450Johann UNPCK_UB_SH(sig0, temp0_h, temp1_h); 1137bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(temp0_h, adjust0, temp1_h, adjust1, temp0_h, temp1_h); 1147bc9febe8749e98a3812a0dc4380ceae75c29450Johann MAXI_SH2_SH(temp0_h, temp1_h, 0); 1157bc9febe8749e98a3812a0dc4380ceae75c29450Johann SAT_UH2_SH(temp0_h, temp1_h, 7); 1167bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_pckev_b((v16i8)temp3_h, (v16i8)temp2_h); 1177bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)temp1_h, (v16i8)temp0_h); 1187bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = 1197bc9febe8749e98a3812a0dc4380ceae75c29450Johann __msa_bmnz_v(running_avg_y, mc_running_avg_y0, (v16u8)temp2_h); 1207bc9febe8749e98a3812a0dc4380ceae75c29450Johann ST_UB(running_avg_y, running_avg_y_ptr); 1217bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 1227bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1237bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 = zero; 1247bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 = zero; 1257bc9febe8749e98a3812a0dc4380ceae75c29450Johann ILVRL_B2_UB(mc_running_avg_y1, sig1, coeff0, coeff1); 1267bc9febe8749e98a3812a0dc4380ceae75c29450Johann HSUB_UB2_SH(coeff0, coeff1, diff0, diff1); 1277bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = __msa_add_a_h(diff0, zero); 1287bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff1 = __msa_add_a_h(diff1, zero); 1297bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 15); 1307bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 1327bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 7); 1337bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1347bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 1357bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff0 < shift_inc1_vec; 1367bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff1, 15); 1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff1, 7); 1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 1447bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff1 < shift_inc1_vec; 1457bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += cmp; 1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_clei_s_h(diff0, 0); 1487bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = temp0_h & four; 1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += temp0_h; 1507bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = __msa_clei_s_h(diff1, 0); 1517bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = temp1_h & four; 1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask1 += temp1_h; 1537bc9febe8749e98a3812a0dc4380ceae75c29450Johann VSHF_H2_SH(adj_val, adj_val, adj_val, adj_val, mask0, mask1, adjust0, 1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1); 1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = __msa_ceqi_h(adjust0, 0); 1567bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp3_h = __msa_ceqi_h(adjust1, 0); 1577bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)diff0, (v16u8)temp2_h); 1587bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = (v8i16)__msa_bmnz_v((v16u8)adjust1, (v16u8)diff1, (v16u8)temp3_h); 1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(col_sum0, adjust0, col_sum1, adjust1, col_sum0, col_sum1); 1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann UNPCK_UB_SH(sig1, temp0_h, temp1_h); 1617bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(temp0_h, adjust0, temp1_h, adjust1, temp0_h, temp1_h); 1627bc9febe8749e98a3812a0dc4380ceae75c29450Johann MAXI_SH2_SH(temp0_h, temp1_h, 0); 1637bc9febe8749e98a3812a0dc4380ceae75c29450Johann SAT_UH2_SH(temp0_h, temp1_h, 7); 1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_pckev_b((v16i8)temp3_h, (v16i8)temp2_h); 1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)temp1_h, (v16i8)temp0_h); 1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = 1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann __msa_bmnz_v(running_avg_y, mc_running_avg_y1, (v16u8)temp2_h); 1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann ST_UB(running_avg_y, running_avg_y_ptr); 1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 1707bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr += mc_avg_y_stride; 1717bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 1727bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum0 = __msa_min_s_h(col_sum0, val_127); 1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum1 = __msa_min_s_h(col_sum1, val_127); 1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = col_sum0 + col_sum1; 1777bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_w = __msa_hadd_s_w(temp0_h, temp0_h); 1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d = __msa_hadd_s_d(temp0_w, temp0_w); 1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_d = __msa_splati_d(temp0_d, 1); 1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d += temp1_d; 1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff = __msa_copy_s_w((v4i32)temp0_d, 0); 1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr -= sig_stride * 16; 1837bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr -= mc_avg_y_stride * 16; 1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr -= avg_y_stride * 16; 1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1867bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (increase_denoising) { 1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH; 1887bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (abs(sum_diff) > sum_diff_thresh) { 1917bc9febe8749e98a3812a0dc4380ceae75c29450Johann delta = ((abs(sum_diff) - sum_diff_thresh) >> 8) + 1; 1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann delta_vec = __msa_fill_h(delta); 1937bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (delta < 4) { 1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (cnt = 8; cnt--;) { 1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = LD_UB(running_avg_y_ptr); 196da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y0 = LD_UB(mc_running_avg_y_ptr); 197da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig0 = LD_UB(sig_ptr); 198da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig_ptr += sig_stride; 199da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y_ptr += mc_avg_y_stride; 2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 201da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y1 = LD_UB(mc_running_avg_y_ptr); 202da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig1 = LD_UB(sig_ptr); 2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y1 = LD_UB(running_avg_y_ptr); 204da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ILVRL_B2_UB(mc_running_avg_y0, sig0, coeff0, coeff1); 205da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian HSUB_UB2_SH(coeff0, coeff1, diff0, diff1); 206da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff0 = __msa_add_a_h(diff0, zero); 207da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff1 = __msa_add_a_h(diff1, zero); 2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = abs_diff0 < delta_vec; 2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = abs_diff1 < delta_vec; 2107bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = (v8i16)__msa_bmz_v((v16u8)abs_diff0, (v16u8)delta_vec, 2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff1 = (v8i16)__msa_bmz_v((v16u8)abs_diff1, (v16u8)delta_vec, 2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp1_h); 2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann SUB2(zero, abs_diff0, zero, abs_diff1, abs_diff_neg0, abs_diff_neg1); 2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff_neg0 = zero - abs_diff0; 2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff_neg1 = zero - abs_diff1; 217da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp0_h = __msa_clei_s_h(diff0, 0); 218da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp1_h = __msa_clei_s_h(diff1, 0); 2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)abs_diff0, (v16u8)abs_diff_neg0, 2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = (v8i16)__msa_bmnz_v((v16u8)abs_diff1, (v16u8)abs_diff_neg1, 2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp1_h); 2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann ILVRL_B2_SH(zero, running_avg_y, temp2_h, temp3_h); 2247bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(temp2_h, adjust0, temp3_h, adjust1, adjust2, adjust3); 2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann MAXI_SH2_SH(adjust2, adjust3, 0); 2267bc9febe8749e98a3812a0dc4380ceae75c29450Johann SAT_UH2_SH(adjust2, adjust3, 7); 2277bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_ceqi_h(diff0, 0); 2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = __msa_ceqi_h(diff1, 0); 2297bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = 2307bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust2, (v16u8)temp2_h, (v16u8)temp0_h); 2317bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust3 = 2327bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust3, (v16u8)temp3_h, (v16u8)temp1_h); 2337bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = 2347bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)zero, (v16u8)temp0_h); 2357bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = 2367bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust1, (v16u8)zero, (v16u8)temp1_h); 2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(col_sum2, adjust0, col_sum3, adjust1, col_sum2, col_sum3); 2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)adjust3, (v16i8)adjust2); 2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann ST_UB(running_avg_y, running_avg_y_ptr - avg_y_stride); 240da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ILVRL_B2_UB(mc_running_avg_y1, sig1, coeff0, coeff1); 241da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian HSUB_UB2_SH(coeff0, coeff1, diff0, diff1); 242da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff0 = __msa_add_a_h(diff0, zero); 243da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff1 = __msa_add_a_h(diff1, zero); 2447bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = abs_diff0 < delta_vec; 2457bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = abs_diff1 < delta_vec; 2467bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = (v8i16)__msa_bmz_v((v16u8)abs_diff0, (v16u8)delta_vec, 2477bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 2487bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff1 = (v8i16)__msa_bmz_v((v16u8)abs_diff1, (v16u8)delta_vec, 2497bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp1_h); 2507bc9febe8749e98a3812a0dc4380ceae75c29450Johann SUB2(zero, abs_diff0, zero, abs_diff1, abs_diff_neg0, abs_diff_neg1); 251da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp0_h = __msa_clei_s_h(diff0, 0); 252da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp1_h = __msa_clei_s_h(diff1, 0); 2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)abs_diff0, (v16u8)abs_diff_neg0, 2547bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 2557bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = (v8i16)__msa_bmnz_v((v16u8)abs_diff1, (v16u8)abs_diff_neg1, 2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp1_h); 2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann ILVRL_H2_SH(zero, running_avg_y1, temp2_h, temp3_h); 2587bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(temp2_h, adjust0, temp3_h, adjust1, adjust2, adjust3); 2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann MAXI_SH2_SH(adjust2, adjust3, 0); 2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann SAT_UH2_SH(adjust2, adjust3, 7); 2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_ceqi_h(diff0, 0); 2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_h = __msa_ceqi_h(diff1, 0); 2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = 2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust2, (v16u8)temp2_h, (v16u8)temp0_h); 2657bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust3 = 2667bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust3, (v16u8)temp3_h, (v16u8)temp1_h); 2677bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = 2687bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust0, (v16u8)zero, (v16u8)temp0_h); 2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust1 = 2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmz_v((v16u8)adjust1, (v16u8)zero, (v16u8)temp1_h); 2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann ADD2(col_sum2, adjust0, col_sum3, adjust1, col_sum2, col_sum3); 2727bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)adjust3, (v16i8)adjust2); 273da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ST_UB(running_avg_y, running_avg_y_ptr); 274da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian running_avg_y_ptr += avg_y_stride; 2757bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2767bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2777bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum2 = __msa_min_s_h(col_sum2, val_127); 2787bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum3 = __msa_min_s_h(col_sum3, val_127); 2797bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = col_sum2 + col_sum3; 2807bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_w = __msa_hadd_s_w(temp0_h, temp0_h); 2817bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d = __msa_hadd_s_d(temp0_w, temp0_w); 2827bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_d = __msa_splati_d(temp0_d, 1); 2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d += (v2i64)temp1_d; 2847bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff = __msa_copy_s_w((v4i32)temp0_d, 0); 2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (abs(sum_diff) > SUM_DIFF_THRESHOLD) { 2867bc9febe8749e98a3812a0dc4380ceae75c29450Johann return COPY_BLOCK; 2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2887bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann return COPY_BLOCK; 290da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 2917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 292da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 2937bc9febe8749e98a3812a0dc4380ceae75c29450Johann LD_UB8(sig_start, sig_stride, src0, src1, src2, src3, src4, src5, src6, src7); 2947bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_start += (8 * sig_stride); 2957bc9febe8749e98a3812a0dc4380ceae75c29450Johann LD_UB8(sig_start, sig_stride, src8, src9, src10, src11, src12, src13, src14, 2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann src15); 297da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 2987bc9febe8749e98a3812a0dc4380ceae75c29450Johann ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7, running_avg_y_start, 2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann avg_y_stride); 3007bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_start += (8 * avg_y_stride); 3017bc9febe8749e98a3812a0dc4380ceae75c29450Johann ST_UB8(src8, src9, src10, src11, src12, src13, src14, src15, 3027bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_start, avg_y_stride); 303da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 3047bc9febe8749e98a3812a0dc4380ceae75c29450Johann return FILTER_BLOCK; 305da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 306da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 3077bc9febe8749e98a3812a0dc4380ceae75c29450Johannint32_t vp8_denoiser_filter_uv_msa( 3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *mc_running_avg_y_ptr, int32_t mc_avg_y_stride, 3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *running_avg_y_ptr, int32_t avg_y_stride, uint8_t *sig_ptr, 3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sig_stride, uint32_t motion_magnitude, int32_t increase_denoising) { 3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *running_avg_y_start = running_avg_y_ptr; 3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint8_t *sig_start = sig_ptr; 3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t cnt = 0; 3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sum_diff = 0; 3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t shift_inc1 = 3; 3167bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t delta = 0; 3177bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sum_block = 0; 3187bc9febe8749e98a3812a0dc4380ceae75c29450Johann int32_t sum_diff_thresh; 3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann int64_t dst0, dst1, src0, src1, src2, src3; 3207bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 mc_running_avg_y0, running_avg_y, sig0; 3217bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 mc_running_avg_y1, running_avg_y1, sig1; 3227bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 sig2, sig3, sig4, sig5, sig6, sig7; 3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16u8 coeff0; 3247bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 diff0, abs_diff0, abs_diff_neg0; 3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 adjust0, adjust2; 3267bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 shift_inc1_vec = { 0 }; 3277bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 col_sum0 = { 0 }; 3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 temp0_h, temp2_h, cmp, delta_vec; 3297bc9febe8749e98a3812a0dc4380ceae75c29450Johann v4i32 temp0_w; 3307bc9febe8749e98a3812a0dc4380ceae75c29450Johann v2i64 temp0_d, temp1_d; 3317bc9febe8749e98a3812a0dc4380ceae75c29450Johann v16i8 zero = { 0 }; 3327bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 one = __msa_ldi_h(1); 3337bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 four = __msa_ldi_h(4); 3347bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 adj_val = { 6, 4, 3, 0, -6, -4, -3, 0 }; 3357bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3367bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig0 = LD_UB(sig_ptr); 3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3387bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)__msa_ilvr_b(zero, (v16i8)sig0); 3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig1 = LD_UB(sig_ptr); 3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig1); 3427bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig2 = LD_UB(sig_ptr); 3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3447bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig2); 3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig3 = LD_UB(sig_ptr); 3467bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3477bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig3); 3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig4 = LD_UB(sig_ptr); 3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3507bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig4); 3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig5 = LD_UB(sig_ptr); 3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig5); 3547bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig6 = LD_UB(sig_ptr); 3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3567bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig6); 3577bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig7 = LD_UB(sig_ptr); 3587bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += (v8i16)__msa_ilvr_b(zero, (v16i8)sig7); 3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_w = __msa_hadd_s_w(temp0_h, temp0_h); 3617bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d = __msa_hadd_s_d(temp0_w, temp0_w); 3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_d = __msa_splati_d(temp0_d, 1); 3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d += temp1_d; 3647bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_block = __msa_copy_s_w((v4i32)temp0_d, 0); 3657bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr -= sig_stride * 8; 3667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3677bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (abs(sum_block - (128 * 8 * 8)) < SUM_DIFF_FROM_AVG_THRESH_UV) { 3687bc9febe8749e98a3812a0dc4380ceae75c29450Johann return COPY_BLOCK; 3697bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3707bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3717bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) { 3727bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_add_a_h(adj_val, one); 3737bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3747bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (increase_denoising) { 3757bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_add_a_h(adj_val, one); 3767bc9febe8749e98a3812a0dc4380ceae75c29450Johann shift_inc1 = 4; 3777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 378da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 3797bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)zero - adj_val; 3807bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = (v8i16)__msa_ilvev_d((v2i64)temp0_h, (v2i64)adj_val); 3817bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 382da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_insert_h(adj_val, 3, cnt); 3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann adj_val = __msa_insert_h(adj_val, 7, cnt); 3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann shift_inc1_vec = __msa_fill_h(shift_inc1); 3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (cnt = 4; cnt--;) { 3877bc9febe8749e98a3812a0dc4380ceae75c29450Johann v8i16 mask0 = { 0 }; 3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y0 = LD_UB(mc_running_avg_y_ptr); 389da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig0 = LD_UB(sig_ptr); 390da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig_ptr += sig_stride; 3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr += mc_avg_y_stride; 3927bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y1 = LD_UB(mc_running_avg_y_ptr); 393da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig1 = LD_UB(sig_ptr); 3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann coeff0 = (v16u8)__msa_ilvr_b((v16i8)mc_running_avg_y0, (v16i8)sig0); 3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann diff0 = __msa_hsub_u_h(coeff0, coeff0); 3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = __msa_add_a_h(diff0, (v8i16)zero); 3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 15); 3987bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 3997bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4007bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 7); 4017bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 4027bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff0 < shift_inc1_vec; 4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 4057bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_clei_s_h(diff0, 0); 4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = temp0_h & four; 4087bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += temp0_h; 4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = __msa_vshf_h(mask0, adj_val, adj_val); 4107bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = __msa_ceqi_h(adjust0, 0); 4117bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)diff0, (v16u8)temp2_h); 4127bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum0 += adjust0; 4137bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)__msa_ilvr_b(zero, (v16i8)sig0); 4147bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += adjust0; 4157bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_maxi_s_h(temp0_h, 0); 4167bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)__msa_sat_u_h((v8u16)temp0_h, 7); 4177bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_pckev_b((v16i8)temp2_h, (v16i8)temp2_h); 4187bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)temp0_h, (v16i8)temp0_h); 4197bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = 4207bc9febe8749e98a3812a0dc4380ceae75c29450Johann __msa_bmnz_v(running_avg_y, mc_running_avg_y0, (v16u8)temp2_h); 4217bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst0 = __msa_copy_s_d((v2i64)running_avg_y, 0); 4227bc9febe8749e98a3812a0dc4380ceae75c29450Johann SD(dst0, running_avg_y_ptr); 4237bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 4247bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4257bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 = __msa_ldi_h(0); 4267bc9febe8749e98a3812a0dc4380ceae75c29450Johann coeff0 = (v16u8)__msa_ilvr_b((v16i8)mc_running_avg_y1, (v16i8)sig1); 4277bc9febe8749e98a3812a0dc4380ceae75c29450Johann diff0 = __msa_hsub_u_h(coeff0, coeff0); 4287bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = __msa_add_a_h(diff0, (v8i16)zero); 4297bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 15); 4307bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 4317bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4327bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = __msa_clei_s_h(abs_diff0, 7); 4337bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 4347bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4357bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = abs_diff0 < shift_inc1_vec; 4367bc9febe8749e98a3812a0dc4380ceae75c29450Johann cmp = cmp & one; 4377bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += cmp; 4387bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_clei_s_h(diff0, 0); 4397bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = temp0_h & four; 4407bc9febe8749e98a3812a0dc4380ceae75c29450Johann mask0 += temp0_h; 4417bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = __msa_vshf_h(mask0, adj_val, adj_val); 4427bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = __msa_ceqi_h(adjust0, 0); 4437bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)diff0, (v16u8)temp2_h); 4447bc9febe8749e98a3812a0dc4380ceae75c29450Johann col_sum0 += adjust0; 4457bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)__msa_ilvr_b(zero, (v16i8)sig1); 4467bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h += adjust0; 4477bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_maxi_s_h(temp0_h, 0); 4487bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = (v8i16)__msa_sat_u_h((v8u16)temp0_h, 7); 4497bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4507bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_pckev_b((v16i8)temp2_h, (v16i8)temp2_h); 4517bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)temp0_h, (v16i8)temp0_h); 4527bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = 4537bc9febe8749e98a3812a0dc4380ceae75c29450Johann __msa_bmnz_v(running_avg_y, mc_running_avg_y1, (v16u8)temp2_h); 4547bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst1 = __msa_copy_s_d((v2i64)running_avg_y, 0); 4557bc9febe8749e98a3812a0dc4380ceae75c29450Johann SD(dst1, running_avg_y_ptr); 456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 4577bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr += sig_stride; 4587bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr += mc_avg_y_stride; 4597bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 4607bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = col_sum0; 4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_w = __msa_hadd_s_w(temp0_h, temp0_h); 4647bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d = __msa_hadd_s_d(temp0_w, temp0_w); 4657bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_d = __msa_splati_d(temp0_d, 1); 4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d += temp1_d; 4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff = __msa_copy_s_w((v4i32)temp0_d, 0); 4687bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_ptr -= sig_stride * 8; 4697bc9febe8749e98a3812a0dc4380ceae75c29450Johann mc_running_avg_y_ptr -= mc_avg_y_stride * 8; 4707bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr -= avg_y_stride * 8; 4717bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff_thresh = SUM_DIFF_THRESHOLD_UV; 4727bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4737bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (increase_denoising) { 4747bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH_UV; 4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4767bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4777bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (abs(sum_diff) > sum_diff_thresh) { 4787bc9febe8749e98a3812a0dc4380ceae75c29450Johann delta = ((abs(sum_diff) - sum_diff_thresh) >> 8) + 1; 4797bc9febe8749e98a3812a0dc4380ceae75c29450Johann delta_vec = __msa_fill_h(delta); 4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (delta < 4) { 4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (cnt = 4; cnt--;) { 4827bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = LD_UB(running_avg_y_ptr); 483da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y0 = LD_UB(mc_running_avg_y_ptr); 484da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig0 = LD_UB(sig_ptr); 4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Update pointers for next iteration. */ 486da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig_ptr += sig_stride; 487da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y_ptr += mc_avg_y_stride; 4887bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_ptr += avg_y_stride; 4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann 490da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mc_running_avg_y1 = LD_UB(mc_running_avg_y_ptr); 491da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian sig1 = LD_UB(sig_ptr); 4927bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y1 = LD_UB(running_avg_y_ptr); 4937bc9febe8749e98a3812a0dc4380ceae75c29450Johann 494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian coeff0 = (v16u8)__msa_ilvr_b((v16i8)mc_running_avg_y0, (v16i8)sig0); 495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian diff0 = __msa_hsub_u_h(coeff0, coeff0); 496da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff0 = __msa_add_a_h(diff0, (v8i16)zero); 4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = delta_vec < abs_diff0; 4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = (v8i16)__msa_bmnz_v((v16u8)abs_diff0, (v16u8)delta_vec, 4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 5007bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff_neg0 = (v8i16)zero - abs_diff0; 501da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp0_h = __msa_clei_s_h(diff0, 0); 5027bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmz_v((v16u8)abs_diff0, (v16u8)abs_diff_neg0, 5037bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_ilvr_b(zero, (v16i8)running_avg_y); 5057bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = temp2_h + adjust0; 5067bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = __msa_maxi_s_h(adjust2, 0); 5077bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = (v8i16)__msa_sat_u_h((v8u16)adjust2, 7); 5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_ceqi_h(diff0, 0); 5097bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = 5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust2, (v16u8)temp2_h, (v16u8)temp0_h); 5117bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = 5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)zero, (v16u8)temp0_h); 513da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian col_sum0 += adjust0; 5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)adjust2, (v16i8)adjust2); 5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst0 = __msa_copy_s_d((v2i64)running_avg_y, 0); 5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann SD(dst0, running_avg_y_ptr - avg_y_stride); 517da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 518da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian coeff0 = (v16u8)__msa_ilvr_b((v16i8)mc_running_avg_y1, (v16i8)sig1); 519da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian diff0 = __msa_hsub_u_h(coeff0, coeff0); 520da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian abs_diff0 = __msa_add_a_h(diff0, (v8i16)zero); 5217bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = delta_vec < abs_diff0; 5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff0 = (v8i16)__msa_bmnz_v((v16u8)abs_diff0, (v16u8)delta_vec, 5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann abs_diff_neg0 = (v8i16)zero - abs_diff0; 525da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian temp0_h = __msa_clei_s_h(diff0, 0); 5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = (v8i16)__msa_bmz_v((v16u8)abs_diff0, (v16u8)abs_diff_neg0, 5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v16u8)temp0_h); 5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp2_h = (v8i16)__msa_ilvr_b(zero, (v16i8)running_avg_y1); 5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = temp2_h + adjust0; 5307bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = __msa_maxi_s_h(adjust2, 0); 5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = (v8i16)__msa_sat_u_h((v8u16)adjust2, 7); 5327bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = __msa_ceqi_h(diff0, 0); 5337bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust2 = 5347bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust2, (v16u8)temp2_h, (v16u8)temp0_h); 5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann adjust0 = 5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann (v8i16)__msa_bmnz_v((v16u8)adjust0, (v16u8)zero, (v16u8)temp0_h); 537da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian col_sum0 += adjust0; 5387bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y = (v16u8)__msa_pckev_b((v16i8)adjust2, (v16i8)adjust2); 539da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst1 = __msa_copy_s_d((v2i64)running_avg_y, 0); 540da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian SD(dst1, running_avg_y_ptr); 541da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian running_avg_y_ptr += avg_y_stride; 5427bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 5447bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_h = col_sum0; 5457bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_w = __msa_hadd_s_w(temp0_h, temp0_h); 5467bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d = __msa_hadd_s_d(temp0_w, temp0_w); 5477bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp1_d = __msa_splati_d(temp0_d, 1); 5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann temp0_d += temp1_d; 5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann sum_diff = __msa_copy_s_w((v4i32)temp0_d, 0); 550da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 5517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (abs(sum_diff) > sum_diff_thresh) { 5527bc9febe8749e98a3812a0dc4380ceae75c29450Johann return COPY_BLOCK; 5537bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5547bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 5557bc9febe8749e98a3812a0dc4380ceae75c29450Johann return COPY_BLOCK; 556da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 558da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 5597bc9febe8749e98a3812a0dc4380ceae75c29450Johann LD4(sig_start, sig_stride, src0, src1, src2, src3); 5607bc9febe8749e98a3812a0dc4380ceae75c29450Johann sig_start += (4 * sig_stride); 5617bc9febe8749e98a3812a0dc4380ceae75c29450Johann SD4(src0, src1, src2, src3, running_avg_y_start, avg_y_stride); 5627bc9febe8749e98a3812a0dc4380ceae75c29450Johann running_avg_y_start += (4 * avg_y_stride); 563da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 5647bc9febe8749e98a3812a0dc4380ceae75c29450Johann LD4(sig_start, sig_stride, src0, src1, src2, src3); 5657bc9febe8749e98a3812a0dc4380ceae75c29450Johann SD4(src0, src1, src2, src3, running_avg_y_start, avg_y_stride); 566da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann return FILTER_BLOCK; 568da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 569