190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef loopfilter_h 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define loopfilter_h 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/mem.h" 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define MAX_LOOP_FILTER 63 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef enum 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber NORMAL_LOOPFILTER = 0, 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber SIMPLE_LOOPFILTER = 1 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} LOOPFILTERTYPE; 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* FRK 26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Need to align this structure so when it is declared and 27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * passed it can be loaded into vector registers. 28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, signed char, lim[16]); 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, signed char, flim[16]); 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, signed char, thr[16]); 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, signed char, mbflim[16]); 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} loop_filter_info; 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define prototype_loopfilter(sym) \ 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void sym(unsigned char *src, int pitch, const signed char *flimit,\ 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const signed char *limit, const signed char *thresh, int count) 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define prototype_loopfilter_block(sym) \ 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void sym(unsigned char *y, unsigned char *u, unsigned char *v,\ 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ystride, int uv_stride, loop_filter_info *lfi, int simpler) 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if ARCH_X86 || ARCH_X86_64 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "x86/loopfilter_x86.h" 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if ARCH_ARM 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "arm/loopfilter_arm.h" 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 542f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan#if ARCH_MIPS 552f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan#if defined(MIPS_DSP_REV) && MIPS_DSP_REV>=2 562f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan#include "mips/loopfilter_mips.h" 572f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan#endif 582f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan#endif 592f01f9a5c363613e7389fb28c250edcd4509f815Dragan Mrdjan 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_normal_mb_v 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_normal_mb_v vp8_loop_filter_mbv_c 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_normal_mb_v); 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_normal_b_v 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_normal_b_v vp8_loop_filter_bv_c 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_normal_b_v); 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_normal_mb_h 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_normal_mb_h vp8_loop_filter_mbh_c 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_normal_mb_h); 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_normal_b_h 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_normal_b_h vp8_loop_filter_bh_c 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_normal_b_h); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_simple_mb_v 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_simple_mb_v vp8_loop_filter_mbvs_c 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_simple_mb_v); 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_simple_b_v 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_simple_b_v vp8_loop_filter_bvs_c 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_simple_b_v); 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_simple_mb_h 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_simple_mb_h vp8_loop_filter_mbhs_c 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_simple_mb_h); 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef vp8_lf_simple_b_h 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vp8_lf_simple_b_h vp8_loop_filter_bhs_c 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter_block(vp8_lf_simple_b_h); 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef prototype_loopfilter_block((*vp8_lf_block_fn_t)); 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t normal_mb_v; 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t normal_b_v; 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t normal_mb_h; 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t normal_b_h; 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t simple_mb_v; 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t simple_b_v; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t simple_mb_h; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_lf_block_fn_t simple_b_h; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vp8_loopfilter_rtcd_vtable_t; 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define LF_INVOKE(ctx,fn) (ctx)->fn 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define LF_INVOKE(ctx,fn) vp8_lf_##fn 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 120f71323e297a928af368937089d3ed71239786f86Andreas Hubertypedef void loop_filter_uvfunction 121f71323e297a928af368937089d3ed71239786f86Andreas Huber( 122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char *u, /* source pointer */ 123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int p, /* pitch */ 124f71323e297a928af368937089d3ed71239786f86Andreas Huber const signed char *flimit, 125f71323e297a928af368937089d3ed71239786f86Andreas Huber const signed char *limit, 126f71323e297a928af368937089d3ed71239786f86Andreas Huber const signed char *thresh, 127f71323e297a928af368937089d3ed71239786f86Andreas Huber unsigned char *v 128f71323e297a928af368937089d3ed71239786f86Andreas Huber); 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 131