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