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 115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_config.h" 12da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_loopfilter.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h" 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h" 162263fc984bdc858ee931d3e35c87c404de923950Johann#include "vpx_dsp/vpx_dsp_common.h" 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h" 18da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_ports/mem.h" 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_seg_common.h" 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// 64 bit masks for left transform size. Each 1 represents a position where 231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we should apply a loop filter across the left border of an 8x8 block 241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// boundary. 251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_16X16-> ( in low order byte first we end up with 271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this 281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// A loopfilter should be applied to every other 8x8 horizontally. 391184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t left_64x64_txform_mask[TX_SIZES]= { 40da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0xffffffffffffffffULL, // TX_4X4 41da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0xffffffffffffffffULL, // TX_8x8 42da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x5555555555555555ULL, // TX_16x16 43da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x1111111111111111ULL, // TX_32x32 441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// 64 bit masks for above transform size. Each 1 represents a position where 471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we should apply a loop filter across the top border of an 8x8 block 481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// boundary. 491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_32x32 -> ( in low order byte first we end up with 511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this 521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 11111111 541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 11111111 581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// A loopfilter should be applied to every other 4 the row vertically. 631184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t above_64x64_txform_mask[TX_SIZES]= { 64da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0xffffffffffffffffULL, // TX_4X4 65da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0xffffffffffffffffULL, // TX_8x8 66da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x00ff00ff00ff00ffULL, // TX_16x16 67da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x000000ff000000ffULL, // TX_32x32 681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// 64 bit masks for prediction sizes (left). Each 1 represents a position 71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// where left border of an 8x8 block. These are aligned to the right most 72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// appropriate bit, and then shifted into place. 731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_16x32 -> ( low order byte first ) we end up with 751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this : 761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 851184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t left_prediction_mask[BLOCK_SIZES] = { 86da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X4, 87da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X8, 88da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X4, 89da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X8, 90da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000101ULL, // BLOCK_8X16, 91da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_16X8, 92da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000101ULL, // BLOCK_16X16, 93da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000001010101ULL, // BLOCK_16X32, 94da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000101ULL, // BLOCK_32X16, 95da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000001010101ULL, // BLOCK_32X32, 96da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0101010101010101ULL, // BLOCK_32X64, 97da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000001010101ULL, // BLOCK_64X32, 98da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0101010101010101ULL, // BLOCK_64X64 991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit mask to shift and set for each prediction size. 1021184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t above_prediction_mask[BLOCK_SIZES] = { 103da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X4 104da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X8 105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X4 106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X8 107da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X16, 108da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000003ULL, // BLOCK_16X8 109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000003ULL, // BLOCK_16X16 110da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000003ULL, // BLOCK_16X32, 111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x000000000000000fULL, // BLOCK_32X16, 112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x000000000000000fULL, // BLOCK_32X32, 113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x000000000000000fULL, // BLOCK_32X64, 114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x00000000000000ffULL, // BLOCK_64X32, 115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x00000000000000ffULL, // BLOCK_64X64 1161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 117ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// 64 bit mask to shift and set for each prediction size. A bit is set for 1181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// each 8x8 block that would be in the left most block of the given block 1191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// size in the 64x64 block. 1201184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t size_mask[BLOCK_SIZES] = { 121da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X4 122da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_4X8 123da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X4 124da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000001ULL, // BLOCK_8X8 125da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000101ULL, // BLOCK_8X16, 126da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000003ULL, // BLOCK_16X8 127da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000303ULL, // BLOCK_16X16 128da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000003030303ULL, // BLOCK_16X32, 129da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0000000000000f0fULL, // BLOCK_32X16, 130da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x000000000f0f0f0fULL, // BLOCK_32X32, 131da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x0f0f0f0f0f0f0f0fULL, // BLOCK_32X64, 132da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0x00000000ffffffffULL, // BLOCK_64X32, 133da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 0xffffffffffffffffULL, // BLOCK_64X64 1341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// These are used for masking the left and above borders. 137da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic const uint64_t left_border = 0x1111111111111111ULL; 138da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic const uint64_t above_border = 0x000000ff000000ffULL; 1391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit masks for uv transform sizes. 1411184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_64x64_txform_mask_uv[TX_SIZES]= { 142ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0xffff, // TX_4X4 143ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0xffff, // TX_8x8 144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x5555, // TX_16x16 145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x1111, // TX_32x32 1461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1481184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_64x64_txform_mask_uv[TX_SIZES]= { 149ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0xffff, // TX_4X4 150ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0xffff, // TX_8x8 151ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0f0f, // TX_16x16 152ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x000f, // TX_32x32 1531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit left mask to shift and set for each uv prediction size. 1561184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_prediction_mask_uv[BLOCK_SIZES] = { 157ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X4, 158ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X8, 159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X4, 160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X8, 161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X16, 162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X8, 163ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X16, 164ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0011, // BLOCK_16X32, 165ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_32X16, 166ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0011, // BLOCK_32X32, 167ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x1111, // BLOCK_32X64 168ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0011, // BLOCK_64X32, 169ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x1111, // BLOCK_64X64 1701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit above mask to shift and set for uv each prediction size. 1721184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_prediction_mask_uv[BLOCK_SIZES] = { 173ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X4 174ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X8 175ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X4 176ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X8 177ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X16, 178ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X8 179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X16 180ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X32, 181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0003, // BLOCK_32X16, 182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0003, // BLOCK_32X32, 183ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0003, // BLOCK_32X64, 184ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x000f, // BLOCK_64X32, 185ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x000f, // BLOCK_64X64 1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit mask to shift and set for each uv prediction size 1891184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t size_mask_uv[BLOCK_SIZES] = { 190ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X4 191ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_4X8 192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X4 193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X8 194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_8X16, 195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X8 196ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0001, // BLOCK_16X16 197ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0011, // BLOCK_16X32, 198ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0003, // BLOCK_32X16, 199ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x0033, // BLOCK_32X32, 200ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x3333, // BLOCK_32X64, 201ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0x00ff, // BLOCK_64X32, 202ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 0xffff, // BLOCK_64X64 2031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 2041184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_border_uv = 0x1111; 2051184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_border_uv = 0x000f; 2061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic const int mode_lf_lut[MB_MODE_COUNT] = { 2082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // INTRA_MODES 2092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1, 1, 0, 1 // INTER_MODES (ZEROMV == 0) 2102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2121184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void update_sharpness(loop_filter_info_n *lfi, int sharpness_lvl) { 21391037db265ecdd914a26e056cf69207b4f50924ehkuang int lvl; 214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21591037db265ecdd914a26e056cf69207b4f50924ehkuang // For each possible value for the loop filter fill out limits 21691037db265ecdd914a26e056cf69207b4f50924ehkuang for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) { 217ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Set loop filter parameters that control sharpness. 21891037db265ecdd914a26e056cf69207b4f50924ehkuang int block_inside_limit = lvl >> ((sharpness_lvl > 0) + (sharpness_lvl > 4)); 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (sharpness_lvl > 0) { 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (block_inside_limit > (9 - sharpness_lvl)) 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang block_inside_limit = (9 - sharpness_lvl); 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (block_inside_limit < 1) 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang block_inside_limit = 1; 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 228da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(lfi->lfthr[lvl].lim, block_inside_limit, SIMD_WIDTH); 229da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(lfi->lfthr[lvl].mblim, (2 * (lvl + 2) + block_inside_limit), 230da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian SIMD_WIDTH); 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2344fb68e5dd4e93c7599dc905d861de11ac39c5585hkuangstatic uint8_t get_filter_level(const loop_filter_info_n *lfi_n, 2354fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const MB_MODE_INFO *mbmi) { 2364fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang return lfi_n->lvl[mbmi->segment_id][mbmi->ref_frame[0]] 2374fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang [mode_lf_lut[mbmi->mode]]; 2384fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang} 2394fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang 2401184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_init(VP9_COMMON *cm) { 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang loop_filter_info_n *lfi = &cm->lf_info; 2421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct loopfilter *lf = &cm->lf; 2435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int lvl; 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // init limits for given sharpness 24691037db265ecdd914a26e056cf69207b4f50924ehkuang update_sharpness(lfi, lf->sharpness_level); 24791037db265ecdd914a26e056cf69207b4f50924ehkuang lf->last_sharpness_level = lf->sharpness_level; 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // init hev threshold const vectors 2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) 251da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(lfi->lfthr[lvl].hev_thr, (lvl >> 4), SIMD_WIDTH); 252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2541184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_frame_init(VP9_COMMON *cm, int default_filt_lvl) { 255f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang int seg_id; 256ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // n_shift is the multiplier for lf_deltas 257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // the multiplier is 1 for when filter_lvl is between 0 and 31; 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // 2 when filter_lvl is between 32 and 63 2592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int scale = 1 << (default_filt_lvl >> 5); 26091037db265ecdd914a26e056cf69207b4f50924ehkuang loop_filter_info_n *const lfi = &cm->lf_info; 2611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct loopfilter *const lf = &cm->lf; 2622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct segmentation *const seg = &cm->seg; 26391037db265ecdd914a26e056cf69207b4f50924ehkuang 26491037db265ecdd914a26e056cf69207b4f50924ehkuang // update limits if sharpness has changed 26591037db265ecdd914a26e056cf69207b4f50924ehkuang if (lf->last_sharpness_level != lf->sharpness_level) { 26691037db265ecdd914a26e056cf69207b4f50924ehkuang update_sharpness(lfi, lf->sharpness_level); 26791037db265ecdd914a26e056cf69207b4f50924ehkuang lf->last_sharpness_level = lf->sharpness_level; 268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 270f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang for (seg_id = 0; seg_id < MAX_SEGMENTS; seg_id++) { 2712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int lvl_seg = default_filt_lvl; 272da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (segfeature_active(seg, seg_id, SEG_LVL_ALT_LF)) { 273da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int data = get_segdata(seg, seg_id, SEG_LVL_ALT_LF); 2742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lvl_seg = clamp(seg->abs_delta == SEGMENT_ABSDATA ? 2752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian data : default_filt_lvl + data, 2762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 0, MAX_LOOP_FILTER); 277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 27991037db265ecdd914a26e056cf69207b4f50924ehkuang if (!lf->mode_ref_delta_enabled) { 28091037db265ecdd914a26e056cf69207b4f50924ehkuang // we could get rid of this if we assume that deltas are set to 28191037db265ecdd914a26e056cf69207b4f50924ehkuang // zero when not in use; encoder always uses deltas 282da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(lfi->lvl[seg_id], lvl_seg, sizeof(lfi->lvl[seg_id])); 2832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 2842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int ref, mode; 2852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int intra_lvl = lvl_seg + lf->ref_deltas[INTRA_FRAME] * scale; 2862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->lvl[seg_id][INTRA_FRAME][0] = clamp(intra_lvl, 0, MAX_LOOP_FILTER); 2872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (ref = LAST_FRAME; ref < MAX_REF_FRAMES; ++ref) { 2892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (mode = 0; mode < MAX_MODE_LF_DELTAS; ++mode) { 2902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int inter_lvl = lvl_seg + lf->ref_deltas[ref] * scale 2912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian + lf->mode_deltas[mode] * scale; 2922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->lvl[seg_id][ref][mode] = clamp(inter_lvl, 0, MAX_LOOP_FILTER); 2932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 299da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic void filter_selectively_vert_row2(int subsampling_factor, 3002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8_t *s, int pitch, 3012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_16x16_l, 3022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_8x8_l, 3032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_l, 3042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_int_l, 3052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 3062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint8_t *lfl) { 307da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int mask_shift = subsampling_factor ? 4 : 8; 308da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int mask_cutoff = subsampling_factor ? 0xf : 0xff; 309da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int lfl_forward = subsampling_factor ? 4 : 8; 3102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_16x16_0 = mask_16x16_l & mask_cutoff; 3122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_8x8_0 = mask_8x8_l & mask_cutoff; 3132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_0 = mask_4x4_l & mask_cutoff; 3142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_int_0 = mask_4x4_int_l & mask_cutoff; 3152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_16x16_1 = (mask_16x16_l >> mask_shift) & mask_cutoff; 3162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_8x8_1 = (mask_8x8_l >> mask_shift) & mask_cutoff; 3172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_1 = (mask_4x4_l >> mask_shift) & mask_cutoff; 3182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_int_1 = (mask_4x4_int_l >> mask_shift) & mask_cutoff; 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask; 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (mask = mask_16x16_0 | mask_8x8_0 | mask_4x4_0 | mask_4x4_int_0 | 322ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mask_16x16_1 | mask_8x8_1 | mask_4x4_1 | mask_4x4_int_1; 323ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mask; mask >>= 1) { 3242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const loop_filter_thresh *lfi0 = lfi_n->lfthr + *lfl; 3252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const loop_filter_thresh *lfi1 = lfi_n->lfthr + *(lfl + lfl_forward); 3265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 3272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // TODO(yunqingwang): count in loopfilter functions should be removed. 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (mask & 1) { 3292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_16x16_0 | mask_16x16_1) & 1) { 3302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_16x16_0 & mask_16x16_1) & 1) { 331da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_16_dual(s, pitch, lfi0->mblim, lfi0->lim, 3322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr); 3332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_16x16_0 & 1) { 334da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_16(s, pitch, lfi0->mblim, lfi0->lim, 3352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr); 3362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 337da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_16(s + 8 *pitch, pitch, lfi1->mblim, 3382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr); 3392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_8x8_0 | mask_8x8_1) & 1) { 3432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_8x8_0 & mask_8x8_1) & 1) { 344da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_8_dual(s, pitch, lfi0->mblim, lfi0->lim, 3452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 3462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr); 3472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_8x8_0 & 1) { 348da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_8(s, pitch, lfi0->mblim, lfi0->lim, lfi0->hev_thr, 3492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1); 3502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 351da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_8(s + 8 * pitch, pitch, lfi1->mblim, lfi1->lim, 3522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr, 1); 3532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_4x4_0 | mask_4x4_1) & 1) { 3572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_4x4_0 & mask_4x4_1) & 1) { 358da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4_dual(s, pitch, lfi0->mblim, lfi0->lim, 3592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 3602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr); 3612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_4x4_0 & 1) { 362da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s, pitch, lfi0->mblim, lfi0->lim, lfi0->hev_thr, 3632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1); 3642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 365da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s + 8 * pitch, pitch, lfi1->mblim, lfi1->lim, 3662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr, 1); 3672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_4x4_int_0 | mask_4x4_int_1) & 1) { 3712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if ((mask_4x4_int_0 & mask_4x4_int_1) & 1) { 372da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4_dual(s + 4, pitch, lfi0->mblim, lfi0->lim, 3732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 3742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr); 3752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_4x4_int_0 & 1) { 376da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s + 4, pitch, lfi0->mblim, lfi0->lim, 3772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi0->hev_thr, 1); 3782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 379da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s + 8 * pitch + 4, pitch, lfi1->mblim, lfi1->lim, 3802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi1->hev_thr, 1); 3812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang s += 8; 3869b35249446b07f40ac5fcc3205f2c048616efacchkuang lfl += 1; 3872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_16x16_0 >>= 1; 3882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_8x8_0 >>= 1; 3892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_0 >>= 1; 3902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_int_0 >>= 1; 3912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_16x16_1 >>= 1; 3922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_8x8_1 >>= 1; 3932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_1 >>= 1; 3942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_int_1 >>= 1; 395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 398da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 399da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic void highbd_filter_selectively_vert_row2(int subsampling_factor, 400da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint16_t *s, int pitch, 401da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_l, 402da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_l, 403da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_l, 404da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int_l, 405da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 406da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const uint8_t *lfl, int bd) { 407da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int mask_shift = subsampling_factor ? 4 : 8; 408da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int mask_cutoff = subsampling_factor ? 0xf : 0xff; 409da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int lfl_forward = subsampling_factor ? 4 : 8; 410da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 411da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_0 = mask_16x16_l & mask_cutoff; 412da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_0 = mask_8x8_l & mask_cutoff; 413da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_0 = mask_4x4_l & mask_cutoff; 414da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int_0 = mask_4x4_int_l & mask_cutoff; 415da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_1 = (mask_16x16_l >> mask_shift) & mask_cutoff; 416da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_1 = (mask_8x8_l >> mask_shift) & mask_cutoff; 417da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_1 = (mask_4x4_l >> mask_shift) & mask_cutoff; 418da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int_1 = (mask_4x4_int_l >> mask_shift) & mask_cutoff; 419da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask; 420da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 421da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (mask = mask_16x16_0 | mask_8x8_0 | mask_4x4_0 | mask_4x4_int_0 | 422da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_1 | mask_8x8_1 | mask_4x4_1 | mask_4x4_int_1; 423da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask; mask >>= 1) { 424da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfi0 = lfi_n->lfthr + *lfl; 425da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfi1 = lfi_n->lfthr + *(lfl + lfl_forward); 426da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 427da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // TODO(yunqingwang): count in loopfilter functions should be removed. 428da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask & 1) { 429da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_16x16_0 | mask_16x16_1) & 1) { 430da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_16x16_0 & mask_16x16_1) & 1) { 431da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_16_dual(s, pitch, lfi0->mblim, lfi0->lim, 432da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, bd); 433da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_16x16_0 & 1) { 434da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_16(s, pitch, lfi0->mblim, lfi0->lim, 435da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, bd); 436da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 437da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_16(s + 8 *pitch, pitch, lfi1->mblim, 438da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr, bd); 439da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_8x8_0 | mask_8x8_1) & 1) { 443da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_8x8_0 & mask_8x8_1) & 1) { 444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_8_dual(s, pitch, lfi0->mblim, lfi0->lim, 445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->hev_thr, bd); 447da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_8x8_0 & 1) { 448da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_8(s, pitch, lfi0->mblim, lfi0->lim, 449da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, 1, bd); 450da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 451da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_8(s + 8 * pitch, pitch, lfi1->mblim, 452da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr, 1, bd); 453da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 454da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 455da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_0 | mask_4x4_1) & 1) { 457da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_0 & mask_4x4_1) & 1) { 458da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4_dual(s, pitch, lfi0->mblim, lfi0->lim, 459da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 460da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->hev_thr, bd); 461da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4_0 & 1) { 462da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s, pitch, lfi0->mblim, lfi0->lim, 463da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, 1, bd); 464da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 465da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s + 8 * pitch, pitch, lfi1->mblim, 466da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr, 1, bd); 467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 468da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 469da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 470da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_int_0 | mask_4x4_int_1) & 1) { 471da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_int_0 & mask_4x4_int_1) & 1) { 472da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4_dual(s + 4, pitch, lfi0->mblim, lfi0->lim, 473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->hev_thr, bd); 475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4_int_0 & 1) { 476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s + 4, pitch, lfi0->mblim, lfi0->lim, 477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi0->hev_thr, 1, bd); 478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s + 8 * pitch + 4, pitch, lfi1->mblim, 480da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr, 1, bd); 481da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 483da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 484da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 485da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian s += 8; 486da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfl += 1; 487da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_0 >>= 1; 488da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_0 >>= 1; 489da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_0 >>= 1; 490da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int_0 >>= 1; 491da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_1 >>= 1; 492da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_1 >>= 1; 493da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_1 >>= 1; 494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int_1 >>= 1; 495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 496da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 497da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 498da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void filter_selectively_horiz(uint8_t *s, int pitch, 500ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_16x16, 501ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_8x8, 502ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4, 503ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4_int, 5049b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_info_n *lfi_n, 5059b35249446b07f40ac5fcc3205f2c048616efacchkuang const uint8_t *lfl) { 506ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask; 50791037db265ecdd914a26e056cf69207b4f50924ehkuang int count; 508ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 50991037db265ecdd914a26e056cf69207b4f50924ehkuang for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 51091037db265ecdd914a26e056cf69207b4f50924ehkuang mask; mask >>= count) { 5119b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 5125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 51391037db265ecdd914a26e056cf69207b4f50924ehkuang count = 1; 514ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (mask & 1) { 5159b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_16x16 & 1) { 5169b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_16x16 & 3) == 3) { 517da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 5182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 2); 5199b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 5209b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 521da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 5222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 5239b35249446b07f40ac5fcc3205f2c048616efacchkuang } 5249b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_8x8 & 1) { 5259b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_8x8 & 3) == 3) { 526da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Next block's thresholds. 5279b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 5289b35249446b07f40ac5fcc3205f2c048616efacchkuang 529da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_8_dual(s, pitch, lfi->mblim, lfi->lim, 5302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 5312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->hev_thr); 5329b35249446b07f40ac5fcc3205f2c048616efacchkuang 5339b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4_int & 3) == 3) { 534da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 5352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, lfin->mblim, 5362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr); 53791037db265ecdd914a26e056cf69207b4f50924ehkuang } else { 5389b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 539da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 5402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 5419b35249446b07f40ac5fcc3205f2c048616efacchkuang else if (mask_4x4_int & 2) 542da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 5432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1); 54491037db265ecdd914a26e056cf69207b4f50924ehkuang } 5459b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 5469b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 547da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_8(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 5489b35249446b07f40ac5fcc3205f2c048616efacchkuang 5499b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 550da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 5512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 552ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 5539b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_4x4 & 1) { 5549b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4 & 3) == 3) { 555da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Next block's thresholds. 5569b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 558da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4_dual(s, pitch, lfi->mblim, lfi->lim, 5592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 5602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->hev_thr); 5619b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4_int & 3) == 3) { 562da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 5632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, lfin->mblim, 5642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr); 5659b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 5669b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 567da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 5682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 5699b35249446b07f40ac5fcc3205f2c048616efacchkuang else if (mask_4x4_int & 2) 570da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 5712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1); 5729b35249446b07f40ac5fcc3205f2c048616efacchkuang } 5739b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 5749b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 575da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 5769b35249446b07f40ac5fcc3205f2c048616efacchkuang 5772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (mask_4x4_int & 1) 578da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 5792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 5809b35249446b07f40ac5fcc3205f2c048616efacchkuang } 5819b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_4x4_int & 1) { 582da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 5832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfi->hev_thr, 1); 5849b35249446b07f40ac5fcc3205f2c048616efacchkuang } 585ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 58691037db265ecdd914a26e056cf69207b4f50924ehkuang s += 8 * count; 5879b35249446b07f40ac5fcc3205f2c048616efacchkuang lfl += count; 58891037db265ecdd914a26e056cf69207b4f50924ehkuang mask_16x16 >>= count; 58991037db265ecdd914a26e056cf69207b4f50924ehkuang mask_8x8 >>= count; 59091037db265ecdd914a26e056cf69207b4f50924ehkuang mask_4x4 >>= count; 59191037db265ecdd914a26e056cf69207b4f50924ehkuang mask_4x4_int >>= count; 592ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 593ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 594ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 595da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 596da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic void highbd_filter_selectively_horiz(uint16_t *s, int pitch, 597da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16, 598da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8, 599da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4, 600da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int, 601da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 602da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const uint8_t *lfl, int bd) { 603da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask; 604da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int count; 605da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 606da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 607da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask; mask >>= count) { 608da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 609da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 610da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian count = 1; 611da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask & 1) { 612da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_16x16 & 1) { 613da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_16x16 & 3) == 3) { 614da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 615da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 2, bd); 616da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian count = 2; 617da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 618da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 619da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 620da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 621da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_8x8 & 1) { 622da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_8x8 & 3) == 3) { 623da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Next block's thresholds. 624da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 625da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 626da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_8_dual(s, pitch, lfi->mblim, lfi->lim, 627da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 628da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->hev_thr, bd); 629da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 630da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_int & 3) == 3) { 631da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 632da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 633da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->mblim, lfin->lim, 634da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->hev_thr, bd); 635da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 636da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_4x4_int & 1) { 637da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, 638da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 1, bd); 639da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4_int & 2) { 640da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 641da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1, bd); 642da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 643da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 644da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian count = 2; 645da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 646da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_8(s, pitch, lfi->mblim, lfi->lim, 647da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 648da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 649da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_4x4_int & 1) { 650da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, 651da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 1, bd); 652da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 653da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 654da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4 & 1) { 655da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4 & 3) == 3) { 656da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Next block's thresholds. 657da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 658da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 659da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4_dual(s, pitch, lfi->mblim, lfi->lim, 660da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 661da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->hev_thr, bd); 662da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if ((mask_4x4_int & 3) == 3) { 663da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 664da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 665da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->mblim, lfin->lim, 666da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->hev_thr, bd); 667da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 668da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_4x4_int & 1) { 669da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, 670da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 1, bd); 671da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4_int & 2) { 672da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 673da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1, bd); 674da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 675da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 676da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian count = 2; 677da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 678da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s, pitch, lfi->mblim, lfi->lim, 679da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 680da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 681da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_4x4_int & 1) { 682da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, 683da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, 1, bd); 684da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 685da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 686da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4_int & 1) { 687da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 688da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 689da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 690da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 691da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian s += 8 * count; 692da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfl += count; 693da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 >>= count; 694da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 >>= count; 695da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 >>= count; 696da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int >>= count; 697da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 698da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 699da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 700da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 7011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function ors into the current lfm structure, where to do loop 702ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// filters for the specific mi we are looking at. It uses information 703ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// including the block_size_type (32x16, 32x32, etc.), the transform size, 7041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// whether there were any coefficients encoded, and the loop filter strength 7051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// block we are currently looking at. Shift is used to position the 7061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 1's we produce. 7071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// TODO(JBB) Need another function for different resolution color.. 7081184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void build_masks(const loop_filter_info_n *const lfi_n, 7091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi, const int shift_y, 7101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv, 7111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang LOOP_FILTER_MASK *lfm) { 7124fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const MB_MODE_INFO *mbmi = &mi->mbmi; 7134fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const BLOCK_SIZE block_size = mbmi->sb_type; 7144fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const TX_SIZE tx_size_y = mbmi->tx_size; 715ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const TX_SIZE tx_size_uv = get_uv_tx_size_impl(tx_size_y, block_size, 1, 1); 7164fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int filter_level = get_filter_level(lfi_n, mbmi); 7174fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const left_y = &lfm->left_y[tx_size_y]; 7184fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const above_y = &lfm->above_y[tx_size_y]; 7194fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const int_4x4_y = &lfm->int_4x4_y; 7204fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint16_t *const left_uv = &lfm->left_uv[tx_size_uv]; 7214fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint16_t *const above_uv = &lfm->above_uv[tx_size_uv]; 7224fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint16_t *const int_4x4_uv = &lfm->int_4x4_uv; 7239b35249446b07f40ac5fcc3205f2c048616efacchkuang int i; 7241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // If filter level is 0 we don't loop filter. 7269b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!filter_level) { 7271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 7289b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 7294fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int w = num_8x8_blocks_wide_lookup[block_size]; 7304fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int h = num_8x8_blocks_high_lookup[block_size]; 7319b35249446b07f40ac5fcc3205f2c048616efacchkuang int index = shift_y; 7329b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < h; i++) { 733da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(&lfm->lfl_y[index], filter_level, w); 7349b35249446b07f40ac5fcc3205f2c048616efacchkuang index += 8; 7359b35249446b07f40ac5fcc3205f2c048616efacchkuang } 7369b35249446b07f40ac5fcc3205f2c048616efacchkuang } 7371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // These set 1 in the current block size for the block size edges. 739ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // For instance if the block size is 32x16, we'll set: 7401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // above = 1111 7411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 0000 7421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // and 7431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // left = 1000 7441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // = 1000 7451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // NOTE : In this example the low bit is left most ( 1000 ) is stored as 7461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 1, not 8... 7471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 748ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // U and V set things on a 16 bit scale. 7491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 7501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= above_prediction_mask[block_size] << shift_y; 7511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_uv |= above_prediction_mask_uv[block_size] << shift_uv; 7521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= left_prediction_mask[block_size] << shift_y; 7531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_uv |= left_prediction_mask_uv[block_size] << shift_uv; 7541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // If the block has no coefficients and is not intra we skip applying 7561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the loop filter on block edges. 7574fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang if (mbmi->skip && is_inter_block(mbmi)) 7581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 7591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 760ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Here we are adding a mask for the transform size. The transform 7611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // size mask is set to be correct for a 64x64 prediction block size. We 7621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // mask to match the size of the block we are working on and then shift it 7631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // into place.. 7641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= (size_mask[block_size] & 7651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask[tx_size_y]) << shift_y; 7661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_uv |= (size_mask_uv[block_size] & 7671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 7681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= (size_mask[block_size] & 7701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask[tx_size_y]) << shift_y; 7711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_uv |= (size_mask_uv[block_size] & 7721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 7731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Here we are trying to determine what to do with the internal 4x4 block 7751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // boundaries. These differ from the 4x4 boundaries on the outside edge of 7761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // an 8x8 in that the internal ones can be skipped and don't depend on 7771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the prediction block size. 7784fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang if (tx_size_y == TX_4X4) 7792263fc984bdc858ee931d3e35c87c404de923950Johann *int_4x4_y |= size_mask[block_size] << shift_y; 7804fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang 7814fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang if (tx_size_uv == TX_4X4) 7821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv; 7831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 7841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function does the same thing as the one above with the exception that 786ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// it only affects the y masks. It exists because for blocks < 16x16 in size, 7871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we only update u and v masks on the first block. 7881184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void build_y_mask(const loop_filter_info_n *const lfi_n, 7891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi, const int shift_y, 7901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang LOOP_FILTER_MASK *lfm) { 7914fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const MB_MODE_INFO *mbmi = &mi->mbmi; 7924fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const BLOCK_SIZE block_size = mbmi->sb_type; 7934fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const TX_SIZE tx_size_y = mbmi->tx_size; 7944fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int filter_level = get_filter_level(lfi_n, mbmi); 7954fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const left_y = &lfm->left_y[tx_size_y]; 7964fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const above_y = &lfm->above_y[tx_size_y]; 7974fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang uint64_t *const int_4x4_y = &lfm->int_4x4_y; 7989b35249446b07f40ac5fcc3205f2c048616efacchkuang int i; 7991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8009b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!filter_level) { 8011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 8029b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 8034fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int w = num_8x8_blocks_wide_lookup[block_size]; 8044fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int h = num_8x8_blocks_high_lookup[block_size]; 8059b35249446b07f40ac5fcc3205f2c048616efacchkuang int index = shift_y; 8069b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < h; i++) { 807da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(&lfm->lfl_y[index], filter_level, w); 8089b35249446b07f40ac5fcc3205f2c048616efacchkuang index += 8; 8099b35249446b07f40ac5fcc3205f2c048616efacchkuang } 8109b35249446b07f40ac5fcc3205f2c048616efacchkuang } 8111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= above_prediction_mask[block_size] << shift_y; 8131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= left_prediction_mask[block_size] << shift_y; 8141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8154fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang if (mbmi->skip && is_inter_block(mbmi)) 8161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 8171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= (size_mask[block_size] & 8191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask[tx_size_y]) << shift_y; 8201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= (size_mask[block_size] & 8221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask[tx_size_y]) << shift_y; 8231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8244fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang if (tx_size_y == TX_4X4) 8252263fc984bdc858ee931d3e35c87c404de923950Johann *int_4x4_y |= size_mask[block_size] << shift_y; 8262263fc984bdc858ee931d3e35c87c404de923950Johann} 8272263fc984bdc858ee931d3e35c87c404de923950Johann 8282263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_adjust_mask(VP9_COMMON *const cm, const int mi_row, 8292263fc984bdc858ee931d3e35c87c404de923950Johann const int mi_col, LOOP_FILTER_MASK *lfm) { 8302263fc984bdc858ee931d3e35c87c404de923950Johann int i; 8312263fc984bdc858ee931d3e35c87c404de923950Johann 8322263fc984bdc858ee931d3e35c87c404de923950Johann // The largest loopfilter we have is 16x16 so we use the 16x16 mask 8332263fc984bdc858ee931d3e35c87c404de923950Johann // for 32x32 transforms also. 8342263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[TX_16X16] |= lfm->left_y[TX_32X32]; 8352263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_y[TX_16X16] |= lfm->above_y[TX_32X32]; 8362263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_16X16] |= lfm->left_uv[TX_32X32]; 8372263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_16X16] |= lfm->above_uv[TX_32X32]; 8382263fc984bdc858ee931d3e35c87c404de923950Johann 8392263fc984bdc858ee931d3e35c87c404de923950Johann // We do at least 8 tap filter on every 32x32 even if the transform size 8402263fc984bdc858ee931d3e35c87c404de923950Johann // is 4x4. So if the 4x4 is set on a border pixel add it to the 8x8 and 8412263fc984bdc858ee931d3e35c87c404de923950Johann // remove it from the 4x4. 8422263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[TX_8X8] |= lfm->left_y[TX_4X4] & left_border; 8432263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[TX_4X4] &= ~left_border; 8442263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_y[TX_8X8] |= lfm->above_y[TX_4X4] & above_border; 8452263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_y[TX_4X4] &= ~above_border; 8462263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_4X4] & left_border_uv; 8472263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_4X4] &= ~left_border_uv; 8482263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_4X4] & above_border_uv; 8492263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_4X4] &= ~above_border_uv; 8502263fc984bdc858ee931d3e35c87c404de923950Johann 8512263fc984bdc858ee931d3e35c87c404de923950Johann // We do some special edge handling. 8522263fc984bdc858ee931d3e35c87c404de923950Johann if (mi_row + MI_BLOCK_SIZE > cm->mi_rows) { 8532263fc984bdc858ee931d3e35c87c404de923950Johann const uint64_t rows = cm->mi_rows - mi_row; 8542263fc984bdc858ee931d3e35c87c404de923950Johann 8552263fc984bdc858ee931d3e35c87c404de923950Johann // Each pixel inside the border gets a 1, 8562263fc984bdc858ee931d3e35c87c404de923950Johann const uint64_t mask_y = (((uint64_t) 1 << (rows << 3)) - 1); 8572263fc984bdc858ee931d3e35c87c404de923950Johann const uint16_t mask_uv = (((uint16_t) 1 << (((rows + 1) >> 1) << 2)) - 1); 8582263fc984bdc858ee931d3e35c87c404de923950Johann 8592263fc984bdc858ee931d3e35c87c404de923950Johann // Remove values completely outside our border. 8602263fc984bdc858ee931d3e35c87c404de923950Johann for (i = 0; i < TX_32X32; i++) { 8612263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[i] &= mask_y; 8622263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_y[i] &= mask_y; 8632263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[i] &= mask_uv; 8642263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[i] &= mask_uv; 8652263fc984bdc858ee931d3e35c87c404de923950Johann } 8662263fc984bdc858ee931d3e35c87c404de923950Johann lfm->int_4x4_y &= mask_y; 8672263fc984bdc858ee931d3e35c87c404de923950Johann lfm->int_4x4_uv &= mask_uv; 8682263fc984bdc858ee931d3e35c87c404de923950Johann 8692263fc984bdc858ee931d3e35c87c404de923950Johann // We don't apply a wide loop filter on the last uv block row. If set 8702263fc984bdc858ee931d3e35c87c404de923950Johann // apply the shorter one instead. 8712263fc984bdc858ee931d3e35c87c404de923950Johann if (rows == 1) { 8722263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16]; 8732263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_16X16] = 0; 8742263fc984bdc858ee931d3e35c87c404de923950Johann } 8752263fc984bdc858ee931d3e35c87c404de923950Johann if (rows == 5) { 8762263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16] & 0xff00; 8772263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[TX_16X16] &= ~(lfm->above_uv[TX_16X16] & 0xff00); 8782263fc984bdc858ee931d3e35c87c404de923950Johann } 8792263fc984bdc858ee931d3e35c87c404de923950Johann } 8802263fc984bdc858ee931d3e35c87c404de923950Johann 8812263fc984bdc858ee931d3e35c87c404de923950Johann if (mi_col + MI_BLOCK_SIZE > cm->mi_cols) { 8822263fc984bdc858ee931d3e35c87c404de923950Johann const uint64_t columns = cm->mi_cols - mi_col; 8832263fc984bdc858ee931d3e35c87c404de923950Johann 8842263fc984bdc858ee931d3e35c87c404de923950Johann // Each pixel inside the border gets a 1, the multiply copies the border 8852263fc984bdc858ee931d3e35c87c404de923950Johann // to where we need it. 8862263fc984bdc858ee931d3e35c87c404de923950Johann const uint64_t mask_y = (((1 << columns) - 1)) * 0x0101010101010101ULL; 8872263fc984bdc858ee931d3e35c87c404de923950Johann const uint16_t mask_uv = ((1 << ((columns + 1) >> 1)) - 1) * 0x1111; 8882263fc984bdc858ee931d3e35c87c404de923950Johann 8892263fc984bdc858ee931d3e35c87c404de923950Johann // Internal edges are not applied on the last column of the image so 8902263fc984bdc858ee931d3e35c87c404de923950Johann // we mask 1 more for the internal edges 8912263fc984bdc858ee931d3e35c87c404de923950Johann const uint16_t mask_uv_int = ((1 << (columns >> 1)) - 1) * 0x1111; 8922263fc984bdc858ee931d3e35c87c404de923950Johann 8932263fc984bdc858ee931d3e35c87c404de923950Johann // Remove the bits outside the image edge. 8942263fc984bdc858ee931d3e35c87c404de923950Johann for (i = 0; i < TX_32X32; i++) { 8952263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[i] &= mask_y; 8962263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_y[i] &= mask_y; 8972263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[i] &= mask_uv; 8982263fc984bdc858ee931d3e35c87c404de923950Johann lfm->above_uv[i] &= mask_uv; 8992263fc984bdc858ee931d3e35c87c404de923950Johann } 9002263fc984bdc858ee931d3e35c87c404de923950Johann lfm->int_4x4_y &= mask_y; 9012263fc984bdc858ee931d3e35c87c404de923950Johann lfm->int_4x4_uv &= mask_uv_int; 9022263fc984bdc858ee931d3e35c87c404de923950Johann 9032263fc984bdc858ee931d3e35c87c404de923950Johann // We don't apply a wide loop filter on the last uv column. If set 9042263fc984bdc858ee931d3e35c87c404de923950Johann // apply the shorter one instead. 9052263fc984bdc858ee931d3e35c87c404de923950Johann if (columns == 1) { 9062263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_16X16]; 9072263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_16X16] = 0; 9082263fc984bdc858ee931d3e35c87c404de923950Johann } 9092263fc984bdc858ee931d3e35c87c404de923950Johann if (columns == 5) { 9102263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_8X8] |= (lfm->left_uv[TX_16X16] & 0xcccc); 9112263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[TX_16X16] &= ~(lfm->left_uv[TX_16X16] & 0xcccc); 9122263fc984bdc858ee931d3e35c87c404de923950Johann } 9132263fc984bdc858ee931d3e35c87c404de923950Johann } 9142263fc984bdc858ee931d3e35c87c404de923950Johann // We don't apply a loop filter on the first column in the image, mask that 9152263fc984bdc858ee931d3e35c87c404de923950Johann // out. 9162263fc984bdc858ee931d3e35c87c404de923950Johann if (mi_col == 0) { 9172263fc984bdc858ee931d3e35c87c404de923950Johann for (i = 0; i < TX_32X32; i++) { 9182263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_y[i] &= 0xfefefefefefefefeULL; 9192263fc984bdc858ee931d3e35c87c404de923950Johann lfm->left_uv[i] &= 0xeeee; 9202263fc984bdc858ee931d3e35c87c404de923950Johann } 9212263fc984bdc858ee931d3e35c87c404de923950Johann } 9222263fc984bdc858ee931d3e35c87c404de923950Johann 9232263fc984bdc858ee931d3e35c87c404de923950Johann // Assert if we try to apply 2 different loop filters at the same position. 9242263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_8X8])); 9252263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_4X4])); 9262263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_y[TX_8X8] & lfm->left_y[TX_4X4])); 9272263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->int_4x4_y & lfm->left_y[TX_16X16])); 9282263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_uv[TX_16X16]&lfm->left_uv[TX_8X8])); 9292263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_uv[TX_16X16] & lfm->left_uv[TX_4X4])); 9302263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->left_uv[TX_8X8] & lfm->left_uv[TX_4X4])); 9312263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->int_4x4_uv & lfm->left_uv[TX_16X16])); 9322263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_8X8])); 9332263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_4X4])); 9342263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_y[TX_8X8] & lfm->above_y[TX_4X4])); 9352263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->int_4x4_y & lfm->above_y[TX_16X16])); 9362263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_8X8])); 9372263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_4X4])); 9382263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->above_uv[TX_8X8] & lfm->above_uv[TX_4X4])); 9392263fc984bdc858ee931d3e35c87c404de923950Johann assert(!(lfm->int_4x4_uv & lfm->above_uv[TX_16X16])); 9401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 9411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function sets up the bit masks for the entire 64x64 region represented 9431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// by mi_row, mi_col. 9441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// TODO(JBB): This function only works for yv12. 9452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_setup_mask(VP9_COMMON *const cm, const int mi_row, const int mi_col, 946ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MODE_INFO **mi, const int mode_info_stride, 9472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LOOP_FILTER_MASK *lfm) { 9481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int idx_32, idx_16, idx_8; 9491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const loop_filter_info_n *const lfi_n = &cm->lf_info; 950ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MODE_INFO **mip = mi; 951ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MODE_INFO **mip2 = mi; 9521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // These are offsets to the next mi in the 64x64 block. It is what gets 954ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // added to the mi ptr as we go through each loop. It helps us to avoid 955ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // setting up special row and column counters for each index. The last step 9561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // brings us out back to the starting position. 9571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset_32[] = {4, (mode_info_stride << 2) - 4, 4, 9581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang -(mode_info_stride << 2) - 4}; 9591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset_16[] = {2, (mode_info_stride << 1) - 2, 2, 9601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang -(mode_info_stride << 1) - 2}; 9611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset[] = {1, mode_info_stride - 1, 1, -mode_info_stride - 1}; 9621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Following variables represent shifts to position the current block 964ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // mask over the appropriate block. A shift of 36 to the left will move 9651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the bits for the final 32 by 32 block in the 64x64 up 4 rows and left 9661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 4 rows to the appropriate spot. 9671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_32_y[] = {0, 4, 32, 36}; 9681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_16_y[] = {0, 2, 16, 18}; 9691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_8_y[] = {0, 1, 8, 9}; 9701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_32_uv[] = {0, 2, 8, 10}; 9711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_16_uv[] = {0, 1, 4, 5}; 9721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int max_rows = (mi_row + MI_BLOCK_SIZE > cm->mi_rows ? 9731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_rows - mi_row : MI_BLOCK_SIZE); 9741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int max_cols = (mi_col + MI_BLOCK_SIZE > cm->mi_cols ? 9751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_cols - mi_col : MI_BLOCK_SIZE); 9761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_zero(*lfm); 978ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian assert(mip[0] != NULL); 9791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // TODO(jimbankoski): Try moving most of the following code into decode 9811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // loop and storing lfm in the mbmi structure so that we don't have to go 9821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // through the recursive loop structure multiple times. 9831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 9841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_64X64: 9851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0] , 0, 0, lfm); 9861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 9871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_64X32: 9881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], 0, 0, lfm); 9891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride * 4; 9901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (4 >= max_rows) 9911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 9921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], 32, 8, lfm); 9931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 9941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X64: 9951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], 0, 0, lfm); 9961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 4; 9971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (4 >= max_cols) 9981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 9991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], 4, 2, lfm); 10001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: 10021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_32 = 0; idx_32 < 4; mip += offset_32[idx_32], ++idx_32) { 10031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32]; 10041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv = shift_32_uv[idx_32]; 10051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_32_col_offset = ((idx_32 & 1) << 2); 10061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_32_row_offset = ((idx_32 >> 1) << 2); 10071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_col_offset >= max_cols || mi_32_row_offset >= max_rows) 10081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 10101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X32: 10111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X16: 10141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_row_offset + 2 >= max_rows) 10161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride * 2; 10181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], shift_y + 16, shift_uv + 4, lfm); 10191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X32: 10211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_col_offset + 2 >= max_cols) 10231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 2; 10251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], shift_y + 2, shift_uv + 1, lfm); 10261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: 10281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_16 = 0; idx_16 < 4; mip += offset_16[idx_16], ++idx_16) { 10291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + shift_16_y[idx_16]; 10301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv = shift_32_uv[idx_32] + shift_16_uv[idx_16]; 10311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_16_col_offset = mi_32_col_offset + 10321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_16 & 1) << 1); 10331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_16_row_offset = mi_32_row_offset + 10341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_16 >> 1) << 1); 10351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_col_offset >= max_cols || mi_16_row_offset >= max_rows) 10371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 10401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X16: 10411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X8: 10441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_row_offset + 1 >= max_rows) 10461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride; 10481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip2[0], shift_y+8, lfm); 10491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_8X16: 10511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_col_offset +1 >= max_cols) 10531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 1; 10551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip2[0], shift_y+1, lfm); 10561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: { 10581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + 10591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_16_y[idx_16] + 10601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_8_y[0]; 10611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 10621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip += offset[0]; 10631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_8 = 1; idx_8 < 4; mip += offset[idx_8], ++idx_8) { 10641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + 10651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_16_y[idx_16] + 10661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_8_y[idx_8]; 10671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_8_col_offset = mi_16_col_offset + 10681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_8 & 1)); 10691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_8_row_offset = mi_16_row_offset + 10701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_8 >> 1)); 10711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_8_col_offset >= max_cols || 10731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_8_row_offset >= max_rows) 10741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 10751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip[0], shift_y, lfm); 10761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 10851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 10861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10872263fc984bdc858ee931d3e35c87c404de923950Johann vp9_adjust_mask(cm, mi_row, mi_col, lfm); 10882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} 10892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void filter_selectively_vert(uint8_t *s, int pitch, 10912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_16x16, 10922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_8x8, 10932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4, 10942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask_4x4_int, 10952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 10962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint8_t *lfl) { 10972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int mask; 10982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 11002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask; mask >>= 1) { 11012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 11022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (mask & 1) { 11042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (mask_16x16 & 1) { 1105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_16(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr); 1106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_8x8 & 1) { 1107da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_8(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 1108da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (mask_4x4 & 1) { 1109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 1110da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_4x4_int & 1) 1113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_lpf_vertical_4(s + 4, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 1114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian s += 8; 1115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfl += 1; 1116da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 >>= 1; 1117da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 >>= 1; 1118da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 >>= 1; 1119da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int >>= 1; 1120da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1121da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 1122da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1123da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1124da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic void highbd_filter_selectively_vert(uint16_t *s, int pitch, 1125da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16, 1126da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8, 1127da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4, 1128da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int, 1129da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 1130da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const uint8_t *lfl, int bd) { 1131da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask; 1132da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1133da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 1134da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask; mask >>= 1) { 1135da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 1136da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1137da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask & 1) { 1138da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mask_16x16 & 1) { 1139da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_16(s, pitch, lfi->mblim, lfi->lim, 1140da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, bd); 11412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_8x8 & 1) { 1142da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_8(s, pitch, lfi->mblim, lfi->lim, 1143da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 11442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (mask_4x4 & 1) { 1145da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s, pitch, lfi->mblim, lfi->lim, 1146da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 11472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 11482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 11492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (mask_4x4_int & 1) 1150da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_lpf_vertical_4(s + 4, pitch, lfi->mblim, lfi->lim, 1151da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lfi->hev_thr, 1, bd); 11522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian s += 8; 11532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian lfl += 1; 11542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_16x16 >>= 1; 11552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_8x8 >>= 1; 11562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4 >>= 1; 11572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_int >>= 1; 11582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 11591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 1160da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 11619b35249446b07f40ac5fcc3205f2c048616efacchkuang 1162da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_non420(VP9_COMMON *cm, 1163da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian struct macroblockd_plane *plane, 1164da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian MODE_INFO **mi_8x8, 1165da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int mi_row, int mi_col) { 116691037db265ecdd914a26e056cf69207b4f50924ehkuang const int ss_x = plane->subsampling_x; 116791037db265ecdd914a26e056cf69207b4f50924ehkuang const int ss_y = plane->subsampling_y; 1168da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int row_step = 1 << ss_y; 1169da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int col_step = 1 << ss_x; 11704fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int row_step_stride = cm->mi_stride * row_step; 117191037db265ecdd914a26e056cf69207b4f50924ehkuang struct buf_2d *const dst = &plane->dst; 1172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t* const dst0 = dst->buf; 117391037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_16x16[MI_BLOCK_SIZE] = {0}; 117491037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_8x8[MI_BLOCK_SIZE] = {0}; 117591037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_4x4[MI_BLOCK_SIZE] = {0}; 117691037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_4x4_int[MI_BLOCK_SIZE] = {0}; 11779b35249446b07f40ac5fcc3205f2c048616efacchkuang uint8_t lfl[MI_BLOCK_SIZE * MI_BLOCK_SIZE]; 1178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int r, c; 1179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 118091037db265ecdd914a26e056cf69207b4f50924ehkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += row_step) { 1181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_16x16_c = 0; 1182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_8x8_c = 0; 1183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4_c = 0; 1184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int border_mask; 1185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Determine the vertical edges that need filtering 118791037db265ecdd914a26e056cf69207b4f50924ehkuang for (c = 0; c < MI_BLOCK_SIZE && mi_col + c < cm->mi_cols; c += col_step) { 11881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi = mi_8x8[c]; 11892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const BLOCK_SIZE sb_type = mi[0].mbmi.sb_type; 11902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int skip_this = mi[0].mbmi.skip && is_inter_block(&mi[0].mbmi); 1191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // left edge of current unit is block/partition edge -> no skip 11922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int block_edge_left = (num_4x4_blocks_wide_lookup[sb_type] > 1) ? 11932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian !(c & (num_8x8_blocks_wide_lookup[sb_type] - 1)) : 1; 1194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_this_c = skip_this && !block_edge_left; 1195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // top edge of current unit is block/partition edge -> no skip 11962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int block_edge_above = (num_4x4_blocks_high_lookup[sb_type] > 1) ? 11972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian !(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1; 1198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_this_r = skip_this && !block_edge_above; 11992263fc984bdc858ee931d3e35c87c404de923950Johann const TX_SIZE tx_size = get_uv_tx_size(&mi[0].mbmi, plane); 1200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1; 1201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1; 1202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Filter level can vary per MI 12049b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!(lfl[(r << 3) + (c >> ss_x)] = 12054fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang get_filter_level(&cm->lf_info, &mi[0].mbmi))) 1206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang continue; 1207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Build masks based on the transform size of each block 1209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_32X32) { 1210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c && ((c >> ss_x) & 3) == 0) { 1211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_c) 1212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c |= 1 << (c >> ss_x); 1213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 1215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r && ((r >> ss_y) & 3) == 0) { 1217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_r) 1218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16[r] |= 1 << (c >> ss_x); 1219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 1221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (tx_size == TX_16X16) { 1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c && ((c >> ss_x) & 1) == 0) { 1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_c) 1225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c |= 1 << (c >> ss_x); 1226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 1228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r && ((r >> ss_y) & 1) == 0) { 1230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_r) 1231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16[r] |= 1 << (c >> ss_x); 1232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 1234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // force 8x8 filtering on 32x32 boundaries 1237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c) { 1238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_8X8 || ((c >> ss_x) & 3) == 0) 1239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 1240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_c |= 1 << (c >> ss_x); 1242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r) { 1245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_8X8 || ((r >> ss_y) & 3) == 0) 1246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 1247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4[r] |= 1 << (c >> ss_x); 1249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this && tx_size < TX_8X8 && !skip_border_4x4_c) 1252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_int[r] |= 1 << (c >> ss_x); 1253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable filtering on the leftmost column 1257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang border_mask = ~(mi_col == 0); 1258da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1259da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1260da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_vert(CONVERT_TO_SHORTPTR(dst->buf), 1261da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->stride, 1262da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_c & border_mask, 1263da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_c & border_mask, 1264da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_c & border_mask, 1265da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int[r], 1266da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &cm->lf_info, &lfl[r << 3], 1267da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian (int)cm->bit_depth); 1268da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1269da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_vert(dst->buf, dst->stride, 1270da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_c & border_mask, 1271da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_c & border_mask, 1272da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_c & border_mask, 1273da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int[r], 1274da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &cm->lf_info, &lfl[r << 3]); 1275da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1276da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang filter_selectively_vert(dst->buf, dst->stride, 1278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c & border_mask, 1279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c & border_mask, 1280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_c & border_mask, 12819b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_int[r], 12829b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfl[r << 3]); 1283da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 1284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf += 8 * dst->stride; 12851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_8x8 += row_step_stride; 1286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Now do horizontal pass 1289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf = dst0; 129091037db265ecdd914a26e056cf69207b4f50924ehkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += row_step) { 1291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1; 1292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned int mask_4x4_int_r = skip_border_4x4_r ? 0 : mask_4x4_int[r]; 1293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 12949b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_16x16_r; 12959b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_8x8_r; 12969b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_4x4_r; 12979b35249446b07f40ac5fcc3205f2c048616efacchkuang 12989b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mi_row + r == 0) { 12999b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = 0; 13009b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = 0; 13019b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = 0; 13029b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 13039b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = mask_16x16[r]; 13049b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = mask_8x8[r]; 13059b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = mask_4x4[r]; 13069b35249446b07f40ac5fcc3205f2c048616efacchkuang } 1307da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1308da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1309da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_horiz(CONVERT_TO_SHORTPTR(dst->buf), 1310da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->stride, 1311da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r, 1312da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r, 1313da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, 1314da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int_r, 1315da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &cm->lf_info, &lfl[r << 3], 1316da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian (int)cm->bit_depth); 1317da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1318da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_horiz(dst->buf, dst->stride, 1319da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r, 1320da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r, 1321da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, 1322da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int_r, 1323da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &cm->lf_info, &lfl[r << 3]); 1324da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1325da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang filter_selectively_horiz(dst->buf, dst->stride, 13279b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r, 13289b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r, 13299b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r, 13309b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_int_r, 13319b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfl[r << 3]); 1332da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 1333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf += 8 * dst->stride; 1334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 13361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1337da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_ss00(VP9_COMMON *const cm, 1338da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian struct macroblockd_plane *const plane, 1339da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int mi_row, 1340da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LOOP_FILTER_MASK *lfm) { 13411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct buf_2d *const dst = &plane->dst; 1342da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint8_t *const dst0 = dst->buf; 1343da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int r; 1344da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64_t mask_16x16 = lfm->left_y[TX_16X16]; 1345da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64_t mask_8x8 = lfm->left_y[TX_8X8]; 1346da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64_t mask_4x4 = lfm->left_y[TX_4X4]; 1347da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64_t mask_4x4_int = lfm->int_4x4_y; 1348da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1349da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(plane->subsampling_x == 0 && plane->subsampling_y == 0); 1350da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1351da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Vertical pass: do 2 rows at one time 1352da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 2) { 1353da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_l = mask_16x16 & 0xffff; 1354da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_l = mask_8x8 & 0xffff; 1355da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_l = mask_4x4 & 0xffff; 1356da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int_l = mask_4x4_int & 0xffff; 1357da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1358da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Disable filtering on the leftmost column. 1359da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1360da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1361da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_vert_row2( 1362da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, CONVERT_TO_SHORTPTR(dst->buf), dst->stride, 1363da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info, 1364da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &lfm->lfl_y[r << 3], (int)cm->bit_depth); 1365da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1366da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_vert_row2( 1367da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, dst->buf, dst->stride, mask_16x16_l, mask_8x8_l, 1368da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_l, mask_4x4_int_l, &cm->lf_info, &lfm->lfl_y[r << 3]); 1369da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1370da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1371da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_vert_row2( 1372da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, dst->buf, dst->stride, mask_16x16_l, mask_8x8_l, 1373da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_l, mask_4x4_int_l, &cm->lf_info, &lfm->lfl_y[r << 3]); 1374da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 1375da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf += 16 * dst->stride; 1376da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 >>= 16; 1377da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 >>= 16; 1378da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 >>= 16; 1379da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int >>= 16; 1380da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1381da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1382da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Horizontal pass 1383da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf = dst0; 1384da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 = lfm->above_y[TX_16X16]; 1385da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 = lfm->above_y[TX_8X8]; 1386da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 = lfm->above_y[TX_4X4]; 1387da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int = lfm->int_4x4_y; 1388da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1389da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r++) { 1390da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_r; 1391da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_r; 1392da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_r; 1393da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1394da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mi_row + r == 0) { 1395da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r = 0; 1396da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r = 0; 1397da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r = 0; 1398da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1399da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r = mask_16x16 & 0xff; 1400da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r = mask_8x8 & 0xff; 1401da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r = mask_4x4 & 0xff; 1402da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1403da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1404da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1405da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1406da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_horiz( 1407da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian CONVERT_TO_SHORTPTR(dst->buf), dst->stride, mask_16x16_r, mask_8x8_r, 1408da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int & 0xff, &cm->lf_info, &lfm->lfl_y[r << 3], 1409da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian (int)cm->bit_depth); 1410da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1411da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r, 1412da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int & 0xff, &cm->lf_info, 1413da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &lfm->lfl_y[r << 3]); 1414da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1415da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1416da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r, 1417da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int & 0xff, &cm->lf_info, 1418da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian &lfm->lfl_y[r << 3]); 1419da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 1420da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1421da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf += 8 * dst->stride; 1422da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 >>= 8; 1423da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 >>= 8; 1424da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 >>= 8; 1425da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int >>= 8; 1426da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1427da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 1428da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1429da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_filter_block_plane_ss11(VP9_COMMON *const cm, 1430da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian struct macroblockd_plane *const plane, 1431da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int mi_row, 1432da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LOOP_FILTER_MASK *lfm) { 1433da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian struct buf_2d *const dst = &plane->dst; 1434da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint8_t *const dst0 = dst->buf; 14351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int r, c; 14362263fc984bdc858ee931d3e35c87c404de923950Johann uint8_t lfl_uv[16]; 14371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1438da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint16_t mask_16x16 = lfm->left_uv[TX_16X16]; 1439da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint16_t mask_8x8 = lfm->left_uv[TX_8X8]; 1440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint16_t mask_4x4 = lfm->left_uv[TX_4X4]; 1441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint16_t mask_4x4_int = lfm->int_4x4_uv; 14422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1443da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(plane->subsampling_x == 1 && plane->subsampling_y == 1); 1444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Vertical pass: do 2 rows at one time 1446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 4) { 14472263fc984bdc858ee931d3e35c87c404de923950Johann for (c = 0; c < (MI_BLOCK_SIZE >> 1); c++) { 14482263fc984bdc858ee931d3e35c87c404de923950Johann lfl_uv[(r << 1) + c] = lfm->lfl_y[(r << 3) + (c << 1)]; 14492263fc984bdc858ee931d3e35c87c404de923950Johann lfl_uv[((r + 2) << 1) + c] = lfm->lfl_y[((r + 2) << 3) + (c << 1)]; 14509b35249446b07f40ac5fcc3205f2c048616efacchkuang } 14519b35249446b07f40ac5fcc3205f2c048616efacchkuang 1452da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian { 1453da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_l = mask_16x16 & 0xff; 1454da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_l = mask_8x8 & 0xff; 1455da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_l = mask_4x4 & 0xff; 1456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_int_l = mask_4x4_int & 0xff; 1457da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1458da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Disable filtering on the leftmost column. 1459da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1460da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1461da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_vert_row2( 1462da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, CONVERT_TO_SHORTPTR(dst->buf), dst->stride, 1463da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info, 14642263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1], (int)cm->bit_depth); 14659b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 1466da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_vert_row2( 1467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, dst->buf, dst->stride, 1468da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info, 14692263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1]); 14709b35249446b07f40ac5fcc3205f2c048616efacchkuang } 1471da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1472da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_vert_row2( 1473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian plane->subsampling_x, dst->buf, dst->stride, 1474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info, 14752263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1]); 1476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 14779b35249446b07f40ac5fcc3205f2c048616efacchkuang 1478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf += 16 * dst->stride; 14799b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16 >>= 8; 14809b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8 >>= 8; 14819b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4 >>= 8; 14822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mask_4x4_int >>= 8; 14839b35249446b07f40ac5fcc3205f2c048616efacchkuang } 1484da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 14851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1486da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Horizontal pass 1487da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf = dst0; 1488da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 = lfm->above_uv[TX_16X16]; 1489da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 = lfm->above_uv[TX_8X8]; 1490da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 = lfm->above_uv[TX_4X4]; 1491da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int = lfm->int_4x4_uv; 1492da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1493da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 2) { 1494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int skip_border_4x4_r = mi_row + r == cm->mi_rows - 1; 1495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const unsigned int mask_4x4_int_r = 1496da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian skip_border_4x4_r ? 0 : (mask_4x4_int & 0xf); 1497da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_16x16_r; 1498da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_8x8_r; 1499da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian unsigned int mask_4x4_r; 15001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1501da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (mi_row + r == 0) { 1502da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r = 0; 1503da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r = 0; 1504da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r = 0; 1505da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1506da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16_r = mask_16x16 & 0xf; 1507da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8_r = mask_8x8 & 0xf; 1508da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r = mask_4x4 & 0xf; 1509da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 15109b35249446b07f40ac5fcc3205f2c048616efacchkuang 1511da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1512da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (cm->use_highbitdepth) { 1513da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_filter_selectively_horiz(CONVERT_TO_SHORTPTR(dst->buf), 1514da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->stride, mask_16x16_r, mask_8x8_r, 1515da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int_r, &cm->lf_info, 15162263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1], (int)cm->bit_depth); 1517da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 1518da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r, 1519da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int_r, &cm->lf_info, 15202263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1]); 15211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 1522da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 1523da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r, 1524da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_r, mask_4x4_int_r, &cm->lf_info, 15252263fc984bdc858ee931d3e35c87c404de923950Johann &lfl_uv[r << 1]); 1526da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 1527da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1528da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst->buf += 8 * dst->stride; 1529da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_16x16 >>= 4; 1530da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_8x8 >>= 4; 1531da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4 >>= 4; 1532da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mask_4x4_int >>= 4; 15331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 15341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 1535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15362263fc984bdc858ee931d3e35c87c404de923950Johannstatic void loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer, VP9_COMMON *cm, 15372263fc984bdc858ee931d3e35c87c404de923950Johann struct macroblockd_plane planes[MAX_MB_PLANE], 15382263fc984bdc858ee931d3e35c87c404de923950Johann int start, int stop, int y_only) { 153991037db265ecdd914a26e056cf69207b4f50924ehkuang const int num_planes = y_only ? 1 : MAX_MB_PLANE; 1540da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian enum lf_path path; 1541ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int mi_row, mi_col; 1542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (y_only) 1544da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian path = LF_PATH_444; 1545da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else if (planes[1].subsampling_y == 1 && planes[1].subsampling_x == 1) 1546da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian path = LF_PATH_420; 1547da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else if (planes[1].subsampling_y == 0 && planes[1].subsampling_x == 0) 1548da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian path = LF_PATH_444; 1549da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else 1550da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian path = LF_PATH_SLOW; 1551da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 155291037db265ecdd914a26e056cf69207b4f50924ehkuang for (mi_row = start; mi_row < stop; mi_row += MI_BLOCK_SIZE) { 1553ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MODE_INFO **mi = cm->mi_grid_visible + mi_row * cm->mi_stride; 15542263fc984bdc858ee931d3e35c87c404de923950Johann LOOP_FILTER_MASK *lfm = get_lfm(&cm->lf, mi_row, 0); 1555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15562263fc984bdc858ee931d3e35c87c404de923950Johann for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE, ++lfm) { 1557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int plane; 1558ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1559ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vp9_setup_dst_planes(planes, frame_buffer, mi_row, mi_col); 15601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 15611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // TODO(JBB): Make setup_mask work for non 420. 15622263fc984bdc858ee931d3e35c87c404de923950Johann vp9_adjust_mask(cm, mi_row, mi_col, lfm); 1563da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 15642263fc984bdc858ee931d3e35c87c404de923950Johann vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, lfm); 1565da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian for (plane = 1; plane < num_planes; ++plane) { 1566da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (path) { 1567da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case LF_PATH_420: 15682263fc984bdc858ee931d3e35c87c404de923950Johann vp9_filter_block_plane_ss11(cm, &planes[plane], mi_row, lfm); 1569da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 1570da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case LF_PATH_444: 15712263fc984bdc858ee931d3e35c87c404de923950Johann vp9_filter_block_plane_ss00(cm, &planes[plane], mi_row, lfm); 1572da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 1573da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case LF_PATH_SLOW: 1574da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_filter_block_plane_non420(cm, &planes[plane], mi + mi_col, 1575da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mi_row, mi_col); 1576da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 1577da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1580ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1581ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 158291037db265ecdd914a26e056cf69207b4f50924ehkuang 1583ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_loop_filter_frame(YV12_BUFFER_CONFIG *frame, 1584ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian VP9_COMMON *cm, MACROBLOCKD *xd, 15851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int frame_filter_level, 15862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int y_only, int partial_frame) { 15871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int start_mi_row, end_mi_row, mi_rows_to_filter; 158891037db265ecdd914a26e056cf69207b4f50924ehkuang if (!frame_filter_level) return; 15891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row = 0; 15901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_rows_to_filter = cm->mi_rows; 15912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (partial_frame && cm->mi_rows > 8) { 15921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row = cm->mi_rows >> 1; 15931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row &= 0xfffffff8; 15942263fc984bdc858ee931d3e35c87c404de923950Johann mi_rows_to_filter = VPXMAX(cm->mi_rows / 8, 8); 15952263fc984bdc858ee931d3e35c87c404de923950Johann } 15962263fc984bdc858ee931d3e35c87c404de923950Johann end_mi_row = start_mi_row + mi_rows_to_filter; 15972263fc984bdc858ee931d3e35c87c404de923950Johann loop_filter_rows(frame, cm, xd->plane, start_mi_row, end_mi_row, y_only); 15982263fc984bdc858ee931d3e35c87c404de923950Johann} 15992263fc984bdc858ee931d3e35c87c404de923950Johann 16002263fc984bdc858ee931d3e35c87c404de923950Johann// Used by the encoder to build the loopfilter masks. 16012263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_build_mask_frame(VP9_COMMON *cm, int frame_filter_level, 16022263fc984bdc858ee931d3e35c87c404de923950Johann int partial_frame) { 16032263fc984bdc858ee931d3e35c87c404de923950Johann int start_mi_row, end_mi_row, mi_rows_to_filter; 16042263fc984bdc858ee931d3e35c87c404de923950Johann int mi_col, mi_row; 16052263fc984bdc858ee931d3e35c87c404de923950Johann if (!frame_filter_level) return; 16062263fc984bdc858ee931d3e35c87c404de923950Johann start_mi_row = 0; 16072263fc984bdc858ee931d3e35c87c404de923950Johann mi_rows_to_filter = cm->mi_rows; 16082263fc984bdc858ee931d3e35c87c404de923950Johann if (partial_frame && cm->mi_rows > 8) { 16092263fc984bdc858ee931d3e35c87c404de923950Johann start_mi_row = cm->mi_rows >> 1; 16102263fc984bdc858ee931d3e35c87c404de923950Johann start_mi_row &= 0xfffffff8; 16112263fc984bdc858ee931d3e35c87c404de923950Johann mi_rows_to_filter = VPXMAX(cm->mi_rows / 8, 8); 16121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 16131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang end_mi_row = start_mi_row + mi_rows_to_filter; 16142263fc984bdc858ee931d3e35c87c404de923950Johann 16151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_frame_init(cm, frame_filter_level); 16162263fc984bdc858ee931d3e35c87c404de923950Johann 16172263fc984bdc858ee931d3e35c87c404de923950Johann for (mi_row = start_mi_row; mi_row < end_mi_row; mi_row += MI_BLOCK_SIZE) { 16182263fc984bdc858ee931d3e35c87c404de923950Johann MODE_INFO **mi = cm->mi_grid_visible + mi_row * cm->mi_stride; 16192263fc984bdc858ee931d3e35c87c404de923950Johann for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) { 16202263fc984bdc858ee931d3e35c87c404de923950Johann // vp9_setup_mask() zeros lfm 16212263fc984bdc858ee931d3e35c87c404de923950Johann vp9_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride, 16222263fc984bdc858ee931d3e35c87c404de923950Johann get_lfm(&cm->lf, mi_row, mi_col)); 16232263fc984bdc858ee931d3e35c87c404de923950Johann } 16242263fc984bdc858ee931d3e35c87c404de923950Johann } 16252263fc984bdc858ee931d3e35c87c404de923950Johann} 16262263fc984bdc858ee931d3e35c87c404de923950Johann 16272263fc984bdc858ee931d3e35c87c404de923950Johann// 8x8 blocks in a superblock. A "1" represents the first block in a 16x16 16282263fc984bdc858ee931d3e35c87c404de923950Johann// or greater area. 16292263fc984bdc858ee931d3e35c87c404de923950Johannstatic const uint8_t first_block_in_16x16[8][8] = { 16302263fc984bdc858ee931d3e35c87c404de923950Johann {1, 0, 1, 0, 1, 0, 1, 0}, 16312263fc984bdc858ee931d3e35c87c404de923950Johann {0, 0, 0, 0, 0, 0, 0, 0}, 16322263fc984bdc858ee931d3e35c87c404de923950Johann {1, 0, 1, 0, 1, 0, 1, 0}, 16332263fc984bdc858ee931d3e35c87c404de923950Johann {0, 0, 0, 0, 0, 0, 0, 0}, 16342263fc984bdc858ee931d3e35c87c404de923950Johann {1, 0, 1, 0, 1, 0, 1, 0}, 16352263fc984bdc858ee931d3e35c87c404de923950Johann {0, 0, 0, 0, 0, 0, 0, 0}, 16362263fc984bdc858ee931d3e35c87c404de923950Johann {1, 0, 1, 0, 1, 0, 1, 0}, 16372263fc984bdc858ee931d3e35c87c404de923950Johann {0, 0, 0, 0, 0, 0, 0, 0} 16382263fc984bdc858ee931d3e35c87c404de923950Johann}; 16392263fc984bdc858ee931d3e35c87c404de923950Johann 16402263fc984bdc858ee931d3e35c87c404de923950Johann// This function sets up the bit masks for a block represented 16412263fc984bdc858ee931d3e35c87c404de923950Johann// by mi_row, mi_col in a 64x64 region. 16422263fc984bdc858ee931d3e35c87c404de923950Johann// TODO(SJL): This function only works for yv12. 16432263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_build_mask(VP9_COMMON *cm, const MB_MODE_INFO *mbmi, int mi_row, 16442263fc984bdc858ee931d3e35c87c404de923950Johann int mi_col, int bw, int bh) { 16452263fc984bdc858ee931d3e35c87c404de923950Johann const BLOCK_SIZE block_size = mbmi->sb_type; 16462263fc984bdc858ee931d3e35c87c404de923950Johann const TX_SIZE tx_size_y = mbmi->tx_size; 16472263fc984bdc858ee931d3e35c87c404de923950Johann const loop_filter_info_n *const lfi_n = &cm->lf_info; 16482263fc984bdc858ee931d3e35c87c404de923950Johann const int filter_level = get_filter_level(lfi_n, mbmi); 16492263fc984bdc858ee931d3e35c87c404de923950Johann const TX_SIZE tx_size_uv = get_uv_tx_size_impl(tx_size_y, block_size, 1, 1); 16502263fc984bdc858ee931d3e35c87c404de923950Johann LOOP_FILTER_MASK *const lfm = get_lfm(&cm->lf, mi_row, mi_col); 16512263fc984bdc858ee931d3e35c87c404de923950Johann uint64_t *const left_y = &lfm->left_y[tx_size_y]; 16522263fc984bdc858ee931d3e35c87c404de923950Johann uint64_t *const above_y = &lfm->above_y[tx_size_y]; 16532263fc984bdc858ee931d3e35c87c404de923950Johann uint64_t *const int_4x4_y = &lfm->int_4x4_y; 16542263fc984bdc858ee931d3e35c87c404de923950Johann uint16_t *const left_uv = &lfm->left_uv[tx_size_uv]; 16552263fc984bdc858ee931d3e35c87c404de923950Johann uint16_t *const above_uv = &lfm->above_uv[tx_size_uv]; 16562263fc984bdc858ee931d3e35c87c404de923950Johann uint16_t *const int_4x4_uv = &lfm->int_4x4_uv; 16572263fc984bdc858ee931d3e35c87c404de923950Johann const int row_in_sb = (mi_row & 7); 16582263fc984bdc858ee931d3e35c87c404de923950Johann const int col_in_sb = (mi_col & 7); 16592263fc984bdc858ee931d3e35c87c404de923950Johann const int shift_y = col_in_sb + (row_in_sb << 3); 16602263fc984bdc858ee931d3e35c87c404de923950Johann const int shift_uv = (col_in_sb >> 1) + ((row_in_sb >> 1) << 2); 16612263fc984bdc858ee931d3e35c87c404de923950Johann const int build_uv = first_block_in_16x16[row_in_sb][col_in_sb]; 16622263fc984bdc858ee931d3e35c87c404de923950Johann 16632263fc984bdc858ee931d3e35c87c404de923950Johann if (!filter_level) { 16642263fc984bdc858ee931d3e35c87c404de923950Johann return; 16652263fc984bdc858ee931d3e35c87c404de923950Johann } else { 16662263fc984bdc858ee931d3e35c87c404de923950Johann int index = shift_y; 16672263fc984bdc858ee931d3e35c87c404de923950Johann int i; 16682263fc984bdc858ee931d3e35c87c404de923950Johann for (i = 0; i < bh; i++) { 16692263fc984bdc858ee931d3e35c87c404de923950Johann memset(&lfm->lfl_y[index], filter_level, bw); 16702263fc984bdc858ee931d3e35c87c404de923950Johann index += 8; 16712263fc984bdc858ee931d3e35c87c404de923950Johann } 16722263fc984bdc858ee931d3e35c87c404de923950Johann } 16732263fc984bdc858ee931d3e35c87c404de923950Johann 16742263fc984bdc858ee931d3e35c87c404de923950Johann // These set 1 in the current block size for the block size edges. 16752263fc984bdc858ee931d3e35c87c404de923950Johann // For instance if the block size is 32x16, we'll set: 16762263fc984bdc858ee931d3e35c87c404de923950Johann // above = 1111 16772263fc984bdc858ee931d3e35c87c404de923950Johann // 0000 16782263fc984bdc858ee931d3e35c87c404de923950Johann // and 16792263fc984bdc858ee931d3e35c87c404de923950Johann // left = 1000 16802263fc984bdc858ee931d3e35c87c404de923950Johann // = 1000 16812263fc984bdc858ee931d3e35c87c404de923950Johann // NOTE : In this example the low bit is left most ( 1000 ) is stored as 16822263fc984bdc858ee931d3e35c87c404de923950Johann // 1, not 8... 16832263fc984bdc858ee931d3e35c87c404de923950Johann // 16842263fc984bdc858ee931d3e35c87c404de923950Johann // U and V set things on a 16 bit scale. 16852263fc984bdc858ee931d3e35c87c404de923950Johann // 16862263fc984bdc858ee931d3e35c87c404de923950Johann *above_y |= above_prediction_mask[block_size] << shift_y; 16872263fc984bdc858ee931d3e35c87c404de923950Johann *left_y |= left_prediction_mask[block_size] << shift_y; 16882263fc984bdc858ee931d3e35c87c404de923950Johann 16892263fc984bdc858ee931d3e35c87c404de923950Johann if (build_uv) { 16902263fc984bdc858ee931d3e35c87c404de923950Johann *above_uv |= above_prediction_mask_uv[block_size] << shift_uv; 16912263fc984bdc858ee931d3e35c87c404de923950Johann *left_uv |= left_prediction_mask_uv[block_size] << shift_uv; 16922263fc984bdc858ee931d3e35c87c404de923950Johann } 16932263fc984bdc858ee931d3e35c87c404de923950Johann 16942263fc984bdc858ee931d3e35c87c404de923950Johann // If the block has no coefficients and is not intra we skip applying 16952263fc984bdc858ee931d3e35c87c404de923950Johann // the loop filter on block edges. 16962263fc984bdc858ee931d3e35c87c404de923950Johann if (mbmi->skip && is_inter_block(mbmi)) 16972263fc984bdc858ee931d3e35c87c404de923950Johann return; 16982263fc984bdc858ee931d3e35c87c404de923950Johann 16992263fc984bdc858ee931d3e35c87c404de923950Johann // Add a mask for the transform size. The transform size mask is set to 17002263fc984bdc858ee931d3e35c87c404de923950Johann // be correct for a 64x64 prediction block size. Mask to match the size of 17012263fc984bdc858ee931d3e35c87c404de923950Johann // the block we are working on and then shift it into place. 17022263fc984bdc858ee931d3e35c87c404de923950Johann *above_y |= (size_mask[block_size] & 17032263fc984bdc858ee931d3e35c87c404de923950Johann above_64x64_txform_mask[tx_size_y]) << shift_y; 17042263fc984bdc858ee931d3e35c87c404de923950Johann *left_y |= (size_mask[block_size] & 17052263fc984bdc858ee931d3e35c87c404de923950Johann left_64x64_txform_mask[tx_size_y]) << shift_y; 17062263fc984bdc858ee931d3e35c87c404de923950Johann 17072263fc984bdc858ee931d3e35c87c404de923950Johann if (build_uv) { 17082263fc984bdc858ee931d3e35c87c404de923950Johann *above_uv |= (size_mask_uv[block_size] & 17092263fc984bdc858ee931d3e35c87c404de923950Johann above_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 17102263fc984bdc858ee931d3e35c87c404de923950Johann 17112263fc984bdc858ee931d3e35c87c404de923950Johann *left_uv |= (size_mask_uv[block_size] & 17122263fc984bdc858ee931d3e35c87c404de923950Johann left_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 17132263fc984bdc858ee931d3e35c87c404de923950Johann } 17142263fc984bdc858ee931d3e35c87c404de923950Johann 17152263fc984bdc858ee931d3e35c87c404de923950Johann // Try to determine what to do with the internal 4x4 block boundaries. These 17162263fc984bdc858ee931d3e35c87c404de923950Johann // differ from the 4x4 boundaries on the outside edge of an 8x8 in that the 17172263fc984bdc858ee931d3e35c87c404de923950Johann // internal ones can be skipped and don't depend on the prediction block size. 17182263fc984bdc858ee931d3e35c87c404de923950Johann if (tx_size_y == TX_4X4) 17192263fc984bdc858ee931d3e35c87c404de923950Johann *int_4x4_y |= size_mask[block_size] << shift_y; 17202263fc984bdc858ee931d3e35c87c404de923950Johann 17212263fc984bdc858ee931d3e35c87c404de923950Johann if (build_uv && tx_size_uv == TX_4X4) 17222263fc984bdc858ee931d3e35c87c404de923950Johann *int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv; 172391037db265ecdd914a26e056cf69207b4f50924ehkuang} 1724f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 1725da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_loop_filter_data_reset( 1726da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LFWorkerData *lf_data, YV12_BUFFER_CONFIG *frame_buffer, 1727da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian struct VP9Common *cm, const struct macroblockd_plane planes[MAX_MB_PLANE]) { 1728da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lf_data->frame_buffer = frame_buffer; 1729da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lf_data->cm = cm; 1730da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lf_data->start = 0; 1731da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lf_data->stop = 0; 1732da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian lf_data->y_only = 0; 1733da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(lf_data->planes, planes, sizeof(lf_data->planes)); 1734da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 1735da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 17362263fc984bdc858ee931d3e35c87c404de923950Johannvoid vp9_reset_lfm(VP9_COMMON *const cm) { 17372263fc984bdc858ee931d3e35c87c404de923950Johann if (cm->lf.filter_level) { 17382263fc984bdc858ee931d3e35c87c404de923950Johann memset(cm->lf.lfm, 0, 17392263fc984bdc858ee931d3e35c87c404de923950Johann ((cm->mi_rows + (MI_BLOCK_SIZE - 1)) >> 3) * cm->lf.lfm_stride * 17402263fc984bdc858ee931d3e35c87c404de923950Johann sizeof(*cm->lf.lfm)); 17412263fc984bdc858ee931d3e35c87c404de923950Johann } 17422263fc984bdc858ee931d3e35c87c404de923950Johann} 17432263fc984bdc858ee931d3e35c87c404de923950Johann 1744da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint vp9_loop_filter_worker(LFWorkerData *const lf_data, void *unused) { 1745da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian (void)unused; 17462263fc984bdc858ee931d3e35c87c404de923950Johann loop_filter_rows(lf_data->frame_buffer, lf_data->cm, lf_data->planes, 17472263fc984bdc858ee931d3e35c87c404de923950Johann lf_data->start, lf_data->stop, lf_data->y_only); 1748f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang return 1; 1749f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang} 1750