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 #ifndef VPX_VP8_COMMON_LOOPFILTER_H_
12 #define VPX_VP8_COMMON_LOOPFILTER_H_
13 
14 #include "vpx_ports/mem.h"
15 #include "vpx_config.h"
16 #include "vp8_rtcd.h"
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 #define MAX_LOOP_FILTER 63
23 /* fraction of total macroblock rows to be used in fast filter level picking */
24 /* has to be > 2 */
25 #define PARTIAL_FRAME_FRACTION 8
26 
27 typedef enum { NORMAL_LOOPFILTER = 0, SIMPLE_LOOPFILTER = 1 } LOOPFILTERTYPE;
28 
29 #if VPX_ARCH_ARM
30 #define SIMD_WIDTH 1
31 #else
32 #define SIMD_WIDTH 16
33 #endif
34 
35 /* Need to align this structure so when it is declared and
36  * passed it can be loaded into vector registers.
37  */
38 typedef struct {
39   DECLARE_ALIGNED(SIMD_WIDTH, unsigned char,
40                   mblim[MAX_LOOP_FILTER + 1][SIMD_WIDTH]);
41   DECLARE_ALIGNED(SIMD_WIDTH, unsigned char,
42                   blim[MAX_LOOP_FILTER + 1][SIMD_WIDTH]);
43   DECLARE_ALIGNED(SIMD_WIDTH, unsigned char,
44                   lim[MAX_LOOP_FILTER + 1][SIMD_WIDTH]);
45   DECLARE_ALIGNED(SIMD_WIDTH, unsigned char, hev_thr[4][SIMD_WIDTH]);
46   unsigned char lvl[4][4][4];
47   unsigned char hev_thr_lut[2][MAX_LOOP_FILTER + 1];
48   unsigned char mode_lf_lut[10];
49 } loop_filter_info_n;
50 
51 typedef struct loop_filter_info {
52   const unsigned char *mblim;
53   const unsigned char *blim;
54   const unsigned char *lim;
55   const unsigned char *hev_thr;
56 } loop_filter_info;
57 
58 typedef void loop_filter_uvfunction(unsigned char *u, /* source pointer */
59                                     int p,            /* pitch */
60                                     const unsigned char *blimit,
61                                     const unsigned char *limit,
62                                     const unsigned char *thresh,
63                                     unsigned char *v);
64 
65 /* assorted loopfilter functions which get used elsewhere */
66 struct VP8Common;
67 struct macroblockd;
68 struct modeinfo;
69 
70 void vp8_loop_filter_init(struct VP8Common *cm);
71 
72 void vp8_loop_filter_frame_init(struct VP8Common *cm, struct macroblockd *mbd,
73                                 int default_filt_lvl);
74 
75 void vp8_loop_filter_frame(struct VP8Common *cm, struct macroblockd *mbd,
76                            int frame_type);
77 
78 void vp8_loop_filter_partial_frame(struct VP8Common *cm,
79                                    struct macroblockd *mbd,
80                                    int default_filt_lvl);
81 
82 void vp8_loop_filter_frame_yonly(struct VP8Common *cm, struct macroblockd *mbd,
83                                  int default_filt_lvl);
84 
85 void vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi,
86                                       int sharpness_lvl);
87 
88 void vp8_loop_filter_row_normal(struct VP8Common *cm,
89                                 struct modeinfo *mode_info_context, int mb_row,
90                                 int post_ystride, int post_uvstride,
91                                 unsigned char *y_ptr, unsigned char *u_ptr,
92                                 unsigned char *v_ptr);
93 
94 void vp8_loop_filter_row_simple(struct VP8Common *cm,
95                                 struct modeinfo *mode_info_context, int mb_row,
96                                 int post_ystride, unsigned char *y_ptr);
97 #ifdef __cplusplus
98 }  // extern "C"
99 #endif
100 
101 #endif  // VPX_VP8_COMMON_LOOPFILTER_H_
102