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 17extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6); 18extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6); 19extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6); 20extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6); 21extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6); 22extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6); 23 24extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon); 25extern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon); 26extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon); 27extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon); 28extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon); 29extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon); 30 31extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon; 32extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon; 33extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon; 34extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon; 35 36 37#if HAVE_ARMV6 38/*ARMV6 loopfilter functions*/ 39/* Horizontal MB filtering */ 40void 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 53void 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 */ 64void 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 77void 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 */ 88void 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 103void 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 */ 116void 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 131void 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 */ 147void 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 157void 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 */ 168void 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 178void 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 */ 189void 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 201void 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 */ 214void 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 226void 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