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