16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* 26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * 46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Use of this source code is governed by a BSD-style license 56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * that can be found in the LICENSE file in the root of the source 66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * tree. An additional intellectual property rights grant can be found 76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * in the file PATENTS. All contributing project authors may 86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * be found in the AUTHORS file in the root of the source tree. 96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#ifndef VP9_COMMON_VP9_LOOPFILTER_H_ 126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define VP9_COMMON_VP9_LOOPFILTER_H_ 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vpx_ports/mem.h" 15ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vpx_config.h" 1647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org 176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_blockd.h" 1847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org#include "vp9/common/vp9_seg_common.h" 196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 20dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus 21dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" { 22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif 23dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define MAX_LOOP_FILTER 63 2547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org#define MAX_SHARPNESS 7 2647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org 276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define SIMD_WIDTH 16 286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#define MAX_REF_LF_DELTAS 4 3053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#define MAX_MODE_LF_DELTAS 2 3153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 3253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgstruct loopfilter { 3353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int filter_level; 3453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 3553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int sharpness_level; 3653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int last_sharpness_level; 3753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 3853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org uint8_t mode_ref_delta_enabled; 3953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org uint8_t mode_ref_delta_update; 4053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 4153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // 0 = Intra, Last, GF, ARF 4253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org signed char ref_deltas[MAX_REF_LF_DELTAS]; 4353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org signed char last_ref_deltas[MAX_REF_LF_DELTAS]; 4453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 4553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // 0 = ZERO_MV, MV 4653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org signed char mode_deltas[MAX_MODE_LF_DELTAS]; 4753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org signed char last_mode_deltas[MAX_MODE_LF_DELTAS]; 4853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org}; 4953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 5047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// Need to align this structure so when it is declared and 5147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// passed it can be loaded into vector registers. 526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgtypedef struct { 53ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, mblim[SIMD_WIDTH]); 54ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, lim[SIMD_WIDTH]); 55ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, hev_thr[SIMD_WIDTH]); 56ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org} loop_filter_thresh; 57ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org 58ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgtypedef struct { 59ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org loop_filter_thresh lfthr[MAX_LOOP_FILTER + 1]; 6047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org uint8_t lvl[MAX_SEGMENTS][MAX_REF_FRAMES][MAX_MODE_LF_DELTAS]; 616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org} loop_filter_info_n; 626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 6376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// This structure holds bit masks for all 8x8 blocks in a 64x64 region. 6476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Each 1 bit represents a position in which we want to apply the loop filter. 6576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Left_ entries refer to whether we apply a filter on the border to the 6676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// left of the block. Above_ entries refer to whether or not to apply a 6776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// filter on the above border. Int_ entries refer to whether or not to 6876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// apply borders on the 4x4 edges within the 8x8 block that each bit 6976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// represents. 7076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Since each transform is accompanied by a potentially different type of 7176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// loop filter there is a different entry in the array for each transform size. 7276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgtypedef struct { 7376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint64_t left_y[TX_SIZES]; 7476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint64_t above_y[TX_SIZES]; 7576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint64_t int_4x4_y; 7676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint16_t left_uv[TX_SIZES]; 7776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint16_t above_uv[TX_SIZES]; 7876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint16_t int_4x4_uv; 7976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint8_t lfl_y[64]; 8076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org uint8_t lfl_uv[16]; 8176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org} LOOP_FILTER_MASK; 8276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* assorted loopfilter functions which get used elsewhere */ 846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgstruct VP9Common; 856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgstruct macroblockd; 8676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstruct VP9LfSyncData; 8776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 8876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// This function sets up the bit masks for the entire 64x64 region represented 8976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// by mi_row, mi_col. 9076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgvoid vp9_setup_mask(struct VP9Common *const cm, 9176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org const int mi_row, const int mi_col, 9287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org MODE_INFO *mi_8x8, const int mode_info_stride, 9376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org LOOP_FILTER_MASK *lfm); 9476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 9576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgvoid vp9_filter_block_plane(struct VP9Common *const cm, 9676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org struct macroblockd_plane *const plane, 9776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org int mi_row, 9876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org LOOP_FILTER_MASK *lfm); 996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 10053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgvoid vp9_loop_filter_init(struct VP9Common *cm); 1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 10247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// Update the loop filter for the current frame. 10347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// This should be called before vp9_loop_filter_rows(), vp9_loop_filter_frame() 10447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// calls this function directly. 10553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgvoid vp9_loop_filter_frame_init(struct VP9Common *cm, int default_filt_lvl); 1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1077765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgvoid vp9_loop_filter_frame(YV12_BUFFER_CONFIG *frame, 1087765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org struct VP9Common *cm, 109d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org struct macroblockd *mbd, 110d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org int filter_level, 11176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org int y_only, int partial_frame); 1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 11347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org// Apply the loop filter to [start, stop) macro block rows in frame_buffer. 11487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer, 115118f379ec73bf762ee63784bc5f41ffd41107470johannkoenig@chromium.org struct VP9Common *cm, 116118f379ec73bf762ee63784bc5f41ffd41107470johannkoenig@chromium.org struct macroblockd_plane planes[MAX_MB_PLANE], 11747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org int start, int stop, int y_only); 11853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 11953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgtypedef struct LoopFilterWorkerData { 12087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org YV12_BUFFER_CONFIG *frame_buffer; 12153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org struct VP9Common *cm; 122118f379ec73bf762ee63784bc5f41ffd41107470johannkoenig@chromium.org struct macroblockd_plane planes[MAX_MB_PLANE]; 123118f379ec73bf762ee63784bc5f41ffd41107470johannkoenig@chromium.org 12453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int start; 12553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int stop; 12653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org int y_only; 12776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 12876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org struct VP9LfSyncData *lf_sync; 12976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org int num_lf_workers; 13053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org} LFWorkerData; 13153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org 13287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org// Operates on the rows described by 'lf_data'. 13387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgint vp9_loop_filter_worker(LFWorkerData *const lf_data, void *unused); 134dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus 135dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org} // extern "C" 136dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif 137dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 138d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif // VP9_COMMON_VP9_LOOPFILTER_H_ 139