Home | History | Annotate | Download | only in arm
      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