1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/loopfilter.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxc_int.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#define prototype_loopfilter(sym) \ 185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org void sym(unsigned char *src, int pitch, const unsigned char *blimit,\ 195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const unsigned char *limit, const unsigned char *thresh, int count) 205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6); 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6); 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6); 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6); 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if HAVE_NEON 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef void loopfilter_y_neon(unsigned char *src, int pitch, 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char blimit, unsigned char limit, unsigned char thresh); 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef void loopfilter_uv_neon(unsigned char *u, int pitch, 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char blimit, unsigned char limit, unsigned char thresh, 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *v); 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_y_neon vp8_loop_filter_horizontal_edge_y_neon; 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_y_neon vp8_loop_filter_vertical_edge_y_neon; 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_loop_filter_horizontal_edge_uv_neon; 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_loop_filter_vertical_edge_uv_neon; 397765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org 407765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgextern loopfilter_y_neon vp8_mbloop_filter_horizontal_edge_y_neon; 417765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgextern loopfilter_y_neon vp8_mbloop_filter_vertical_edge_y_neon; 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_mbloop_filter_horizontal_edge_uv_neon; 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_mbloop_filter_vertical_edge_uv_neon; 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA 475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org/* ARMV6/MEDIA loopfilter functions*/ 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal MB filtering */ 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2); 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (v_ptr) 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical MB Filtering */ 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2); 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (v_ptr) 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal B Filtering */ 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1); 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (v_ptr) 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1); 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, int y_stride, 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *blimit) 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, blimit); 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, blimit); 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, blimit); 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical B Filtering */ 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2); 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1); 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (v_ptr) 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1); 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, int y_stride, 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *blimit) 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, blimit); 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, blimit); 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, blimit); 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_NEON 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* NEON loopfilter functions */ 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal MB filtering */ 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char mblim = *lfi->mblim; 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char lim = *lfi->lim; 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char hev_thr = *lfi->hev_thr; 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr); 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr); 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical MB Filtering */ 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char mblim = *lfi->mblim; 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char lim = *lfi->lim; 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char hev_thr = *lfi->hev_thr; 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr); 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr); 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal B Filtering */ 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char blim = *lfi->blim; 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char lim = *lfi->lim; 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char hev_thr = *lfi->hev_thr; 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, blim, lim, hev_thr); 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, blim, lim, hev_thr); 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, blim, lim, hev_thr); 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, blim, lim, hev_thr, v_ptr + 4 * uv_stride); 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical B Filtering */ 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr, 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int y_stride, int uv_stride, loop_filter_info *lfi) 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char blim = *lfi->blim; 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char lim = *lfi->lim; 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char hev_thr = *lfi->hev_thr; 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, blim, lim, hev_thr); 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, blim, lim, hev_thr); 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, blim, lim, hev_thr); 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (u_ptr) 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, blim, lim, hev_thr, v_ptr + 4); 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 182