1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 #include "vpx_ports/config.h" 13 #include <math.h> 14 #include "vp8/common/loopfilter.h" 15 #include "vp8/common/onyxc_int.h" 16 17 extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6); 18 extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6); 19 extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6); 20 extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6); 21 extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6); 22 extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6); 23 24 extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon); 25 extern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon); 26 extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon); 27 extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon); 28 extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon); 29 extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon); 30 31 extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon; 32 extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon; 33 extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon; 34 extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon; 35 36 37 #if HAVE_ARMV6 38 /*ARMV6 loopfilter functions*/ 39 /* Horizontal MB filtering */ 40 void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 41 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 42 { 43 (void) simpler_lpf; 44 vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 45 46 if (u_ptr) 47 vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1); 48 49 if (v_ptr) 50 vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1); 51 } 52 53 void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 54 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 55 { 56 (void) u_ptr; 57 (void) v_ptr; 58 (void) uv_stride; 59 (void) simpler_lpf; 60 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 61 } 62 63 /* Vertical MB Filtering */ 64 void vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 65 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 66 { 67 (void) simpler_lpf; 68 vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 69 70 if (u_ptr) 71 vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1); 72 73 if (v_ptr) 74 vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1); 75 } 76 77 void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 78 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 79 { 80 (void) u_ptr; 81 (void) v_ptr; 82 (void) uv_stride; 83 (void) simpler_lpf; 84 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 85 } 86 87 /* Horizontal B Filtering */ 88 void vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 89 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 90 { 91 (void) simpler_lpf; 92 vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 93 vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 94 vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 95 96 if (u_ptr) 97 vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1); 98 99 if (v_ptr) 100 vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1); 101 } 102 103 void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 104 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 105 { 106 (void) u_ptr; 107 (void) v_ptr; 108 (void) uv_stride; 109 (void) simpler_lpf; 110 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 111 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 112 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 113 } 114 115 /* Vertical B Filtering */ 116 void vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 117 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 118 { 119 (void) simpler_lpf; 120 vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 121 vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 122 vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 123 124 if (u_ptr) 125 vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1); 126 127 if (v_ptr) 128 vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1); 129 } 130 131 void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 132 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 133 { 134 (void) u_ptr; 135 (void) v_ptr; 136 (void) uv_stride; 137 (void) simpler_lpf; 138 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 139 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 140 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 141 } 142 #endif 143 144 #if HAVE_ARMV7 145 /* NEON loopfilter functions */ 146 /* Horizontal MB filtering */ 147 void vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 148 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 149 { 150 (void) simpler_lpf; 151 vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 152 153 if (u_ptr) 154 vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr); 155 } 156 157 void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 158 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 159 { 160 (void) u_ptr; 161 (void) v_ptr; 162 (void) uv_stride; 163 (void) simpler_lpf; 164 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 165 } 166 167 /* Vertical MB Filtering */ 168 void vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 169 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 170 { 171 (void) simpler_lpf; 172 vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 173 174 if (u_ptr) 175 vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr); 176 } 177 178 void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 179 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 180 { 181 (void) u_ptr; 182 (void) v_ptr; 183 (void) uv_stride; 184 (void) simpler_lpf; 185 vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2); 186 } 187 188 /* Horizontal B Filtering */ 189 void vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 190 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 191 { 192 (void) simpler_lpf; 193 vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 194 vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 195 vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 196 197 if (u_ptr) 198 vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4 * uv_stride); 199 } 200 201 void vp8_loop_filter_bhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 202 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 203 { 204 (void) u_ptr; 205 (void) v_ptr; 206 (void) uv_stride; 207 (void) simpler_lpf; 208 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 209 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 210 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 211 } 212 213 /* Vertical B Filtering */ 214 void vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 215 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 216 { 217 (void) simpler_lpf; 218 vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 219 vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 220 vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 221 222 if (u_ptr) 223 vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4); 224 } 225 226 void vp8_loop_filter_bvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 227 int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf) 228 { 229 (void) u_ptr; 230 (void) v_ptr; 231 (void) uv_stride; 232 (void) simpler_lpf; 233 vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 234 vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 235 vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2); 236 } 237 #endif 238