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