1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_LOOPFILTER_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_LOOPFILTER_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_ports/mem.h"
155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_config.h"
1691037db265ecdd914a26e056cf69207b4f50924ehkuang
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h"
1891037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_seg_common.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" {
222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_LOOP_FILTER 63
2591037db265ecdd914a26e056cf69207b4f50924ehkuang#define MAX_SHARPNESS 7
2691037db265ecdd914a26e056cf69207b4f50924ehkuang
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define SIMD_WIDTH 16
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#define MAX_REF_LF_DELTAS       4
301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#define MAX_MODE_LF_DELTAS      2
311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
32da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianenum lf_path {
33da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  LF_PATH_420,
34da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  LF_PATH_444,
35da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  LF_PATH_SLOW,
36da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian};
37da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
3891037db265ecdd914a26e056cf69207b4f50924ehkuang// Need to align this structure so when it is declared and
3991037db265ecdd914a26e056cf69207b4f50924ehkuang// passed it can be loaded into vector registers.
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct {
415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, mblim[SIMD_WIDTH]);
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, lim[SIMD_WIDTH]);
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, hev_thr[SIMD_WIDTH]);
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} loop_filter_thresh;
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef struct {
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  loop_filter_thresh lfthr[MAX_LOOP_FILTER + 1];
4891037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t lvl[MAX_SEGMENTS][MAX_REF_FRAMES][MAX_MODE_LF_DELTAS];
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} loop_filter_info_n;
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// This structure holds bit masks for all 8x8 blocks in a 64x64 region.
522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Each 1 bit represents a position in which we want to apply the loop filter.
532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Left_ entries refer to whether we apply a filter on the border to the
542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// left of the block.   Above_ entries refer to whether or not to apply a
552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// filter on the above border.   Int_ entries refer to whether or not to
562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// apply borders on the 4x4 edges within the 8x8 block that each bit
572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// represents.
582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Since each transform is accompanied by a potentially different type of
592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// loop filter there is a different entry in the array for each transform size.
602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniantypedef struct {
612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint64_t left_y[TX_SIZES];
622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint64_t above_y[TX_SIZES];
632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint64_t int_4x4_y;
642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint16_t left_uv[TX_SIZES];
652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint16_t above_uv[TX_SIZES];
662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint16_t int_4x4_uv;
672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint8_t lfl_y[64];
682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} LOOP_FILTER_MASK;
692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
702263fc984bdc858ee931d3e35c87c404de923950Johannstruct loopfilter {
712263fc984bdc858ee931d3e35c87c404de923950Johann  int filter_level;
722263fc984bdc858ee931d3e35c87c404de923950Johann
732263fc984bdc858ee931d3e35c87c404de923950Johann  int sharpness_level;
742263fc984bdc858ee931d3e35c87c404de923950Johann  int last_sharpness_level;
752263fc984bdc858ee931d3e35c87c404de923950Johann
762263fc984bdc858ee931d3e35c87c404de923950Johann  uint8_t mode_ref_delta_enabled;
772263fc984bdc858ee931d3e35c87c404de923950Johann  uint8_t mode_ref_delta_update;
782263fc984bdc858ee931d3e35c87c404de923950Johann
792263fc984bdc858ee931d3e35c87c404de923950Johann  // 0 = Intra, Last, GF, ARF
802263fc984bdc858ee931d3e35c87c404de923950Johann  signed char ref_deltas[MAX_REF_LF_DELTAS];
812263fc984bdc858ee931d3e35c87c404de923950Johann  signed char last_ref_deltas[MAX_REF_LF_DELTAS];
822263fc984bdc858ee931d3e35c87c404de923950Johann
832263fc984bdc858ee931d3e35c87c404de923950Johann  // 0 = ZERO_MV, MV
842263fc984bdc858ee931d3e35c87c404de923950Johann  signed char mode_deltas[MAX_MODE_LF_DELTAS];
852263fc984bdc858ee931d3e35c87c404de923950Johann  signed char last_mode_deltas[MAX_MODE_LF_DELTAS];
862263fc984bdc858ee931d3e35c87c404de923950Johann
872263fc984bdc858ee931d3e35c87c404de923950Johann  LOOP_FILTER_MASK *lfm;
882263fc984bdc858ee931d3e35c87c404de923950Johann  int lfm_stride;
892263fc984bdc858ee931d3e35c87c404de923950Johann};
902263fc984bdc858ee931d3e35c87c404de923950Johann
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* assorted loopfilter functions which get used elsewhere */
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct VP9Common;
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct macroblockd;
942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct VP9LfSyncData;
952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// This function sets up the bit masks for the entire 64x64 region represented
972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// by mi_row, mi_col.
982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_setup_mask(struct VP9Common *const cm,
992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    const int mi_row, const int mi_col,
1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    MODE_INFO **mi_8x8, const int mode_info_stride,
1012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    LOOP_FILTER_MASK *lfm);
1022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
103da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_ss00(struct VP9Common *const cm,
104da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 struct macroblockd_plane *const plane,
105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 int mi_row,
106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 LOOP_FILTER_MASK *lfm);
107da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
108da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_ss11(struct VP9Common *const cm,
109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 struct macroblockd_plane *const plane,
110da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 int mi_row,
111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 LOOP_FILTER_MASK *lfm);
112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_non420(struct VP9Common *cm,
114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   struct macroblockd_plane *plane,
115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   MODE_INFO **mi_8x8,
116da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   int mi_row, int mi_col);
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1181184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_init(struct VP9Common *cm);
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
12091037db265ecdd914a26e056cf69207b4f50924ehkuang// Update the loop filter for the current frame.
1212263fc984bdc858ee931d3e35c87c404de923950Johann// This should be called before vp9_loop_filter_frame(), vp9_build_mask_frame()
12291037db265ecdd914a26e056cf69207b4f50924ehkuang// calls this function directly.
1231184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_frame_init(struct VP9Common *cm, int default_filt_lvl);
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
125ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_loop_filter_frame(YV12_BUFFER_CONFIG *frame,
126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                           struct VP9Common *cm,
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           struct macroblockd *mbd,
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           int filter_level,
1292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                           int y_only, int partial_frame);
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1312263fc984bdc858ee931d3e35c87c404de923950Johann// Get the superblock lfm for a given mi_row, mi_col.
1322263fc984bdc858ee931d3e35c87c404de923950Johannstatic INLINE LOOP_FILTER_MASK *get_lfm(const struct loopfilter *lf,
1332263fc984bdc858ee931d3e35c87c404de923950Johann                                        const int mi_row, const int mi_col) {
1342263fc984bdc858ee931d3e35c87c404de923950Johann  return &lf->lfm[(mi_col >> 3) + ((mi_row >> 3) * lf->lfm_stride)];
1352263fc984bdc858ee931d3e35c87c404de923950Johann}
1362263fc984bdc858ee931d3e35c87c404de923950Johann
1372263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_build_mask(struct VP9Common *cm, const MB_MODE_INFO *mbmi, int mi_row,
1382263fc984bdc858ee931d3e35c87c404de923950Johann                    int mi_col, int bw, int bh);
1392263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_adjust_mask(struct VP9Common *const cm, const int mi_row,
1402263fc984bdc858ee931d3e35c87c404de923950Johann                     const int mi_col, LOOP_FILTER_MASK *lfm);
1412263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_build_mask_frame(struct VP9Common *cm, int frame_filter_level,
1422263fc984bdc858ee931d3e35c87c404de923950Johann                          int partial_frame);
1432263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_reset_lfm(struct VP9Common *const cm);
144f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
145f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangtypedef struct LoopFilterWorkerData {
146da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  YV12_BUFFER_CONFIG *frame_buffer;
147f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  struct VP9Common *cm;
148ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  struct macroblockd_plane planes[MAX_MB_PLANE];
149ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
150f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  int start;
151f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  int stop;
152f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  int y_only;
153f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang} LFWorkerData;
154f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
155da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_loop_filter_data_reset(
156da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    LFWorkerData *lf_data, YV12_BUFFER_CONFIG *frame_buffer,
157da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    struct VP9Common *cm, const struct macroblockd_plane planes[MAX_MB_PLANE]);
158da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
159da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Operates on the rows described by 'lf_data'.
160da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint vp9_loop_filter_worker(LFWorkerData *const lf_data, void *unused);
1612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
1622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}  // extern "C"
1632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
1642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_COMMON_VP9_LOOPFILTER_H_
166