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" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_loopfilter.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h" 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h" 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_seg_common.h" 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit masks for left transform size. Each 1 represents a position where 201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we should apply a loop filter across the left border of an 8x8 block 211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// boundary. 221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_16X16-> ( in low order byte first we end up with 241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this 251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10101010 341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// A loopfilter should be applied to every other 8x8 horizontally. 361184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t left_64x64_txform_mask[TX_SIZES]= { 371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffffffffffffffff, // TX_4X4 381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffffffffffffffff, // TX_8x8 391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x5555555555555555, // TX_16x16 401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x1111111111111111, // TX_32x32 411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit masks for above transform size. Each 1 represents a position where 441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we should apply a loop filter across the top border of an 8x8 block 451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// boundary. 461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_32x32 -> ( in low order byte first we end up with 481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this 491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 11111111 511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 11111111 551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// A loopfilter should be applied to every other 4 the row vertically. 601184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t above_64x64_txform_mask[TX_SIZES]= { 611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffffffffffffffff, // TX_4X4 621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffffffffffffffff, // TX_8x8 631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x00ff00ff00ff00ff, // TX_16x16 641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000000ff000000ff, // TX_32x32 651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit masks for prediction sizes (left). Each 1 represents a position 681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// where left border of an 8x8 block. These are aligned to the right most 691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// appropriate bit, and then shifted into place. 701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// In the case of TX_16x32 -> ( low order byte first ) we end up with 721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// a mask that looks like this : 731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 10000000 781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 00000000 821184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t left_prediction_mask[BLOCK_SIZES] = { 831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X4, 841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X8, 851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X4, 861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X8, 871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000101, // BLOCK_8X16, 881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_16X8, 891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000101, // BLOCK_16X16, 901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000001010101, // BLOCK_16X32, 911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000101, // BLOCK_32X16, 921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000001010101, // BLOCK_32X32, 931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0101010101010101, // BLOCK_32X64, 941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000001010101, // BLOCK_64X32, 951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0101010101010101, // BLOCK_64X64 961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit mask to shift and set for each prediction size. 991184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t above_prediction_mask[BLOCK_SIZES] = { 1001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X4 1011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X8 1021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X4 1031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X8 1041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X16, 1051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000003, // BLOCK_16X8 1061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000003, // BLOCK_16X16 1071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000003, // BLOCK_16X32, 1081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000000000000000f, // BLOCK_32X16, 1091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000000000000000f, // BLOCK_32X32, 1101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000000000000000f, // BLOCK_32X64, 1111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x00000000000000ff, // BLOCK_64X32, 1121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x00000000000000ff, // BLOCK_64X64 1131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit mask to shift and set for each prediction size. A bit is set for 1151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// each 8x8 block that would be in the left most block of the given block 1161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// size in the 64x64 block. 1171184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t size_mask[BLOCK_SIZES] = { 1181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X4 1191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_4X8 1201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X4 1211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000001, // BLOCK_8X8 1221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000101, // BLOCK_8X16, 1231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000003, // BLOCK_16X8 1241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000303, // BLOCK_16X16 1251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000003030303, // BLOCK_16X32, 1261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0000000000000f0f, // BLOCK_32X16, 1271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000000000f0f0f0f, // BLOCK_32X32, 1281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0f0f0f0f0f0f0f0f, // BLOCK_32X64, 1291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x00000000ffffffff, // BLOCK_64X32, 1301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffffffffffffffff, // BLOCK_64X64 1311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// These are used for masking the left and above borders. 1341184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t left_border = 0x1111111111111111; 1351184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint64_t above_border = 0x000000ff000000ff; 1361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit masks for uv transform sizes. 1381184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_64x64_txform_mask_uv[TX_SIZES]= { 1391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffff, // TX_4X4 1401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffff, // TX_8x8 1411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x5555, // TX_16x16 1421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x1111, // TX_32x32 1431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1451184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_64x64_txform_mask_uv[TX_SIZES]= { 1461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffff, // TX_4X4 1471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffff, // TX_8x8 1481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0f0f, // TX_16x16 1491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000f, // TX_32x32 1501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit left mask to shift and set for each uv prediction size. 1531184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_prediction_mask_uv[BLOCK_SIZES] = { 1541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X4, 1551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X8, 1561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X4, 1571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X8, 1581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X16, 1591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X8, 1601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X16, 1611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0011, // BLOCK_16X32, 1621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_32X16, 1631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0011, // BLOCK_32X32, 1641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x1111, // BLOCK_32X64 1651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0011, // BLOCK_64X32, 1661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x1111, // BLOCK_64X64 1671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 16 bit above mask to shift and set for uv each prediction size. 1691184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_prediction_mask_uv[BLOCK_SIZES] = { 1701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X4 1711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X8 1721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X4 1731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X8 1741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X16, 1751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X8 1761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X16 1771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X32, 1781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0003, // BLOCK_32X16, 1791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0003, // BLOCK_32X32, 1801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0003, // BLOCK_32X64, 1811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000f, // BLOCK_64X32, 1821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x000f, // BLOCK_64X64 1831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 64 bit mask to shift and set for each uv prediction size 1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t size_mask_uv[BLOCK_SIZES] = { 1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X4 1881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_4X8 1891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X4 1901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X8 1911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_8X16, 1921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X8 1931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0001, // BLOCK_16X16 1941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0011, // BLOCK_16X32, 1951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0003, // BLOCK_32X16, 1961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x0033, // BLOCK_32X32, 1971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x3333, // BLOCK_32X64, 1981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0x00ff, // BLOCK_64X32, 1991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0xffff, // BLOCK_64X64 2001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 2011184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t left_border_uv = 0x1111; 2021184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint16_t above_border_uv = 0x000f; 2031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 204b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const int mode_lf_lut[MB_MODE_COUNT] = { 205b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // INTRA_MODES 206b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1, 1, 0, 1 // INTER_MODES (ZEROMV == 0) 207b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2091184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void update_sharpness(loop_filter_info_n *lfi, int sharpness_lvl) { 21091037db265ecdd914a26e056cf69207b4f50924ehkuang int lvl; 211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21291037db265ecdd914a26e056cf69207b4f50924ehkuang // For each possible value for the loop filter fill out limits 21391037db265ecdd914a26e056cf69207b4f50924ehkuang for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) { 21491037db265ecdd914a26e056cf69207b4f50924ehkuang // Set loop filter paramaeters that control sharpness. 21591037db265ecdd914a26e056cf69207b4f50924ehkuang int block_inside_limit = lvl >> ((sharpness_lvl > 0) + (sharpness_lvl > 4)); 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (sharpness_lvl > 0) { 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (block_inside_limit > (9 - sharpness_lvl)) 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang block_inside_limit = (9 - sharpness_lvl); 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (block_inside_limit < 1) 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang block_inside_limit = 1; 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_memset(lfi->lfthr[lvl].lim, block_inside_limit, SIMD_WIDTH); 2265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_memset(lfi->lfthr[lvl].mblim, (2 * (lvl + 2) + block_inside_limit), 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SIMD_WIDTH); 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2316ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic uint8_t get_filter_level(const loop_filter_info_n *lfi_n, 2326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MB_MODE_INFO *mbmi) { 2336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang return lfi_n->lvl[mbmi->segment_id][mbmi->ref_frame[0]] 2346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang [mode_lf_lut[mbmi->mode]]; 2356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang} 2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2371184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_init(VP9_COMMON *cm) { 238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang loop_filter_info_n *lfi = &cm->lf_info; 2391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct loopfilter *lf = &cm->lf; 2405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int lvl; 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // init limits for given sharpness 24391037db265ecdd914a26e056cf69207b4f50924ehkuang update_sharpness(lfi, lf->sharpness_level); 24491037db265ecdd914a26e056cf69207b4f50924ehkuang lf->last_sharpness_level = lf->sharpness_level; 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // init hev threshold const vectors 2475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) 2485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_memset(lfi->lfthr[lvl].hev_thr, (lvl >> 4), SIMD_WIDTH); 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2511184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_loop_filter_frame_init(VP9_COMMON *cm, int default_filt_lvl) { 252f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang int seg_id; 253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // n_shift is the a multiplier for lf_deltas 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // the multiplier is 1 for when filter_lvl is between 0 and 31; 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // 2 when filter_lvl is between 32 and 63 256b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int scale = 1 << (default_filt_lvl >> 5); 25791037db265ecdd914a26e056cf69207b4f50924ehkuang loop_filter_info_n *const lfi = &cm->lf_info; 2581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct loopfilter *const lf = &cm->lf; 259b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const struct segmentation *const seg = &cm->seg; 26091037db265ecdd914a26e056cf69207b4f50924ehkuang 26191037db265ecdd914a26e056cf69207b4f50924ehkuang // update limits if sharpness has changed 26291037db265ecdd914a26e056cf69207b4f50924ehkuang if (lf->last_sharpness_level != lf->sharpness_level) { 26391037db265ecdd914a26e056cf69207b4f50924ehkuang update_sharpness(lfi, lf->sharpness_level); 26491037db265ecdd914a26e056cf69207b4f50924ehkuang lf->last_sharpness_level = lf->sharpness_level; 265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 267f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang for (seg_id = 0; seg_id < MAX_SEGMENTS; seg_id++) { 268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int lvl_seg = default_filt_lvl; 2691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (vp9_segfeature_active(seg, seg_id, SEG_LVL_ALT_LF)) { 270f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang const int data = vp9_get_segdata(seg, seg_id, SEG_LVL_ALT_LF); 271b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lvl_seg = clamp(seg->abs_delta == SEGMENT_ABSDATA ? 272b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian data : default_filt_lvl + data, 273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 0, MAX_LOOP_FILTER); 274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 27691037db265ecdd914a26e056cf69207b4f50924ehkuang if (!lf->mode_ref_delta_enabled) { 27791037db265ecdd914a26e056cf69207b4f50924ehkuang // we could get rid of this if we assume that deltas are set to 27891037db265ecdd914a26e056cf69207b4f50924ehkuang // zero when not in use; encoder always uses deltas 2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_memset(lfi->lvl[seg_id], lvl_seg, sizeof(lfi->lvl[seg_id])); 280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 281b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int ref, mode; 282b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int intra_lvl = lvl_seg + lf->ref_deltas[INTRA_FRAME] * scale; 283b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->lvl[seg_id][INTRA_FRAME][0] = clamp(intra_lvl, 0, MAX_LOOP_FILTER); 284b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 285b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (ref = LAST_FRAME; ref < MAX_REF_FRAMES; ++ref) { 286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (mode = 0; mode < MAX_MODE_LF_DELTAS; ++mode) { 287b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int inter_lvl = lvl_seg + lf->ref_deltas[ref] * scale 288b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian + lf->mode_deltas[mode] * scale; 289b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->lvl[seg_id][ref][mode] = clamp(inter_lvl, 0, MAX_LOOP_FILTER); 290b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 292b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 296b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void filter_selectively_vert_row2(PLANE_TYPE plane_type, 297b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *s, int pitch, 298b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16_l, 299b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8_l, 300b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_l, 301b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int_l, 302b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 303b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint8_t *lfl) { 304b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int mask_shift = plane_type ? 4 : 8; 305b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int mask_cutoff = plane_type ? 0xf : 0xff; 306b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int lfl_forward = plane_type ? 4 : 8; 307b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 308b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16_0 = mask_16x16_l & mask_cutoff; 309b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8_0 = mask_8x8_l & mask_cutoff; 310b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_0 = mask_4x4_l & mask_cutoff; 311b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int_0 = mask_4x4_int_l & mask_cutoff; 312b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16_1 = (mask_16x16_l >> mask_shift) & mask_cutoff; 313b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8_1 = (mask_8x8_l >> mask_shift) & mask_cutoff; 314b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_1 = (mask_4x4_l >> mask_shift) & mask_cutoff; 315b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int_1 = (mask_4x4_int_l >> mask_shift) & mask_cutoff; 316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask; 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 318b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (mask = mask_16x16_0 | mask_8x8_0 | mask_4x4_0 | mask_4x4_int_0 | 319b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16_1 | mask_8x8_1 | mask_4x4_1 | mask_4x4_int_1; 320b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask; mask >>= 1) { 321b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const loop_filter_thresh *lfi0 = lfi_n->lfthr + *lfl; 322b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const loop_filter_thresh *lfi1 = lfi_n->lfthr + *(lfl + lfl_forward); 3235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 324b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // TODO(yunqingwang): count in loopfilter functions should be removed. 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (mask & 1) { 326b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_16x16_0 | mask_16x16_1) & 1) { 327b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_16x16_0 & mask_16x16_1) & 1) { 328b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_16_dual(s, pitch, lfi0->mblim, lfi0->lim, 329b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr); 330b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_16x16_0 & 1) { 331b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_16(s, pitch, lfi0->mblim, lfi0->lim, 332b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr); 333b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 334b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_16(s + 8 *pitch, pitch, lfi1->mblim, 335b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->lim, lfi1->hev_thr); 336b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 337b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 338b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 339b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_8x8_0 | mask_8x8_1) & 1) { 340b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_8x8_0 & mask_8x8_1) & 1) { 341b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_8_dual(s, pitch, lfi0->mblim, lfi0->lim, 342b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 343b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr); 344b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_8x8_0 & 1) { 345b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_8(s, pitch, lfi0->mblim, lfi0->lim, lfi0->hev_thr, 346b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1); 347b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 348b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_8(s + 8 * pitch, pitch, lfi1->mblim, lfi1->lim, 349b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr, 1); 350b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 351b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 352b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 353b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_4x4_0 | mask_4x4_1) & 1) { 354b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_4x4_0 & mask_4x4_1) & 1) { 355b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4_dual(s, pitch, lfi0->mblim, lfi0->lim, 356b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 357b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr); 358b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_4x4_0 & 1) { 359b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s, pitch, lfi0->mblim, lfi0->lim, lfi0->hev_thr, 360b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1); 361b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 362b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s + 8 * pitch, pitch, lfi1->mblim, lfi1->lim, 363b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr, 1); 364b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 365b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 366b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 367b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_4x4_int_0 | mask_4x4_int_1) & 1) { 368b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if ((mask_4x4_int_0 & mask_4x4_int_1) & 1) { 369b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4_dual(s + 4, pitch, lfi0->mblim, lfi0->lim, 370b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr, lfi1->mblim, lfi1->lim, 371b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr); 372b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_4x4_int_0 & 1) { 373b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s + 4, pitch, lfi0->mblim, lfi0->lim, 374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi0->hev_thr, 1); 375b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 376b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s + 8 * pitch + 4, pitch, lfi1->mblim, lfi1->lim, 377b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi1->hev_thr, 1); 378b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 381b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang s += 8; 3839b35249446b07f40ac5fcc3205f2c048616efacchkuang lfl += 1; 384b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16_0 >>= 1; 385b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8_0 >>= 1; 386b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_0 >>= 1; 387b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int_0 >>= 1; 388b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16_1 >>= 1; 389b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8_1 >>= 1; 390b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_1 >>= 1; 391b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int_1 >>= 1; 392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 394ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void filter_selectively_horiz(uint8_t *s, int pitch, 396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_16x16, 397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_8x8, 398ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4, 399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4_int, 4009b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_info_n *lfi_n, 4019b35249446b07f40ac5fcc3205f2c048616efacchkuang const uint8_t *lfl) { 402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask; 40391037db265ecdd914a26e056cf69207b4f50924ehkuang int count; 404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 40591037db265ecdd914a26e056cf69207b4f50924ehkuang for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 40691037db265ecdd914a26e056cf69207b4f50924ehkuang mask; mask >>= count) { 4079b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 4085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 40991037db265ecdd914a26e056cf69207b4f50924ehkuang count = 1; 410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (mask & 1) { 4119b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_16x16 & 1) { 4129b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_16x16 & 3) == 3) { 413b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 414b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 2); 4159b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 4169b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 417b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_16(s, pitch, lfi->mblim, lfi->lim, 418b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 4199b35249446b07f40ac5fcc3205f2c048616efacchkuang } 4209b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_8x8 & 1) { 4219b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_8x8 & 3) == 3) { 4229b35249446b07f40ac5fcc3205f2c048616efacchkuang // Next block's thresholds 4239b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 4249b35249446b07f40ac5fcc3205f2c048616efacchkuang 425b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_8_dual(s, pitch, lfi->mblim, lfi->lim, 426b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 427b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->hev_thr); 4289b35249446b07f40ac5fcc3205f2c048616efacchkuang 4299b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4_int & 3) == 3) { 430b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 431b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, lfin->mblim, 432b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr); 43391037db265ecdd914a26e056cf69207b4f50924ehkuang } else { 4349b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 435b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 436b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 4379b35249446b07f40ac5fcc3205f2c048616efacchkuang else if (mask_4x4_int & 2) 438b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 439b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1); 44091037db265ecdd914a26e056cf69207b4f50924ehkuang } 4419b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 4429b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 443b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_8(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 4449b35249446b07f40ac5fcc3205f2c048616efacchkuang 4459b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 446b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 447b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 4499b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_4x4 & 1) { 4509b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4 & 3) == 3) { 4519b35249446b07f40ac5fcc3205f2c048616efacchkuang // Next block's thresholds 4529b35249446b07f40ac5fcc3205f2c048616efacchkuang const loop_filter_thresh *lfin = lfi_n->lfthr + *(lfl + 1); 453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 454b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4_dual(s, pitch, lfi->mblim, lfi->lim, 455b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, lfin->mblim, lfin->lim, 456b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->hev_thr); 4579b35249446b07f40ac5fcc3205f2c048616efacchkuang if ((mask_4x4_int & 3) == 3) { 458b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4_dual(s + 4 * pitch, pitch, lfi->mblim, 459b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->lim, lfi->hev_thr, lfin->mblim, 460b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr); 4619b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 4629b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mask_4x4_int & 1) 463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 4659b35249446b07f40ac5fcc3205f2c048616efacchkuang else if (mask_4x4_int & 2) 466b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 8 + 4 * pitch, pitch, lfin->mblim, 467b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfin->lim, lfin->hev_thr, 1); 4689b35249446b07f40ac5fcc3205f2c048616efacchkuang } 4699b35249446b07f40ac5fcc3205f2c048616efacchkuang count = 2; 4709b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 471b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 4729b35249446b07f40ac5fcc3205f2c048616efacchkuang 473b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (mask_4x4_int & 1) 474b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 475b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 4769b35249446b07f40ac5fcc3205f2c048616efacchkuang } 4779b35249446b07f40ac5fcc3205f2c048616efacchkuang } else if (mask_4x4_int & 1) { 478b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_horizontal_4(s + 4 * pitch, pitch, lfi->mblim, lfi->lim, 479b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfi->hev_thr, 1); 4809b35249446b07f40ac5fcc3205f2c048616efacchkuang } 481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 48291037db265ecdd914a26e056cf69207b4f50924ehkuang s += 8 * count; 4839b35249446b07f40ac5fcc3205f2c048616efacchkuang lfl += count; 48491037db265ecdd914a26e056cf69207b4f50924ehkuang mask_16x16 >>= count; 48591037db265ecdd914a26e056cf69207b4f50924ehkuang mask_8x8 >>= count; 48691037db265ecdd914a26e056cf69207b4f50924ehkuang mask_4x4 >>= count; 48791037db265ecdd914a26e056cf69207b4f50924ehkuang mask_4x4_int >>= count; 488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 490ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function ors into the current lfm structure, where to do loop 4921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// filters for the specific mi we are looking at. It uses information 4931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// including the block_size_type (32x16, 32x32, etc), the transform size, 4941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// whether there were any coefficients encoded, and the loop filter strength 4951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// block we are currently looking at. Shift is used to position the 4961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// 1's we produce. 4971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// TODO(JBB) Need another function for different resolution color.. 4981184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void build_masks(const loop_filter_info_n *const lfi_n, 4991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi, const int shift_y, 5001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv, 5011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang LOOP_FILTER_MASK *lfm) { 5026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MB_MODE_INFO *mbmi = &mi->mbmi; 5036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const BLOCK_SIZE block_size = mbmi->sb_type; 5046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const TX_SIZE tx_size_y = mbmi->tx_size; 5056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const TX_SIZE tx_size_uv = get_uv_tx_size(mbmi); 5066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int filter_level = get_filter_level(lfi_n, mbmi); 5076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const left_y = &lfm->left_y[tx_size_y]; 5086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const above_y = &lfm->above_y[tx_size_y]; 5096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const int_4x4_y = &lfm->int_4x4_y; 5106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint16_t *const left_uv = &lfm->left_uv[tx_size_uv]; 5116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint16_t *const above_uv = &lfm->above_uv[tx_size_uv]; 5126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint16_t *const int_4x4_uv = &lfm->int_4x4_uv; 5139b35249446b07f40ac5fcc3205f2c048616efacchkuang int i; 5141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // If filter level is 0 we don't loop filter. 5169b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!filter_level) { 5171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 5189b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 5196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int w = num_8x8_blocks_wide_lookup[block_size]; 5206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int h = num_8x8_blocks_high_lookup[block_size]; 5219b35249446b07f40ac5fcc3205f2c048616efacchkuang int index = shift_y; 5229b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < h; i++) { 5239b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memset(&lfm->lfl_y[index], filter_level, w); 5249b35249446b07f40ac5fcc3205f2c048616efacchkuang index += 8; 5259b35249446b07f40ac5fcc3205f2c048616efacchkuang } 5269b35249446b07f40ac5fcc3205f2c048616efacchkuang } 5271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // These set 1 in the current block size for the block size edges. 5291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // For instance if the block size is 32x16, we'll set : 5301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // above = 1111 5311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 0000 5321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // and 5331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // left = 1000 5341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // = 1000 5351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // NOTE : In this example the low bit is left most ( 1000 ) is stored as 5361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 1, not 8... 5371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 5381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // U and v set things on a 16 bit scale. 5391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 5401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= above_prediction_mask[block_size] << shift_y; 5411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_uv |= above_prediction_mask_uv[block_size] << shift_uv; 5421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= left_prediction_mask[block_size] << shift_y; 5431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_uv |= left_prediction_mask_uv[block_size] << shift_uv; 5441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // If the block has no coefficients and is not intra we skip applying 5461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the loop filter on block edges. 5476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (mbmi->skip && is_inter_block(mbmi)) 5481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 5491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Here we are adding a mask for the transform size. The transform 5511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // size mask is set to be correct for a 64x64 prediction block size. We 5521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // mask to match the size of the block we are working on and then shift it 5531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // into place.. 5541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= (size_mask[block_size] & 5551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask[tx_size_y]) << shift_y; 5561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_uv |= (size_mask_uv[block_size] & 5571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 5581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= (size_mask[block_size] & 5601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask[tx_size_y]) << shift_y; 5611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_uv |= (size_mask_uv[block_size] & 5621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask_uv[tx_size_uv]) << shift_uv; 5631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Here we are trying to determine what to do with the internal 4x4 block 5651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // boundaries. These differ from the 4x4 boundaries on the outside edge of 5661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // an 8x8 in that the internal ones can be skipped and don't depend on 5671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the prediction block size. 5686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (tx_size_y == TX_4X4) 5691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffff) << shift_y; 5706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 5716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (tx_size_uv == TX_4X4) 5721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv; 5731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 5741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function does the same thing as the one above with the exception that 5761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// it only affects the y masks. It exists because for blocks < 16x16 in size, 5771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// we only update u and v masks on the first block. 5781184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void build_y_mask(const loop_filter_info_n *const lfi_n, 5791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi, const int shift_y, 5801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang LOOP_FILTER_MASK *lfm) { 5816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MB_MODE_INFO *mbmi = &mi->mbmi; 5826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const BLOCK_SIZE block_size = mbmi->sb_type; 5836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const TX_SIZE tx_size_y = mbmi->tx_size; 5846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int filter_level = get_filter_level(lfi_n, mbmi); 5856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const left_y = &lfm->left_y[tx_size_y]; 5866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const above_y = &lfm->above_y[tx_size_y]; 5876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint64_t *const int_4x4_y = &lfm->int_4x4_y; 5889b35249446b07f40ac5fcc3205f2c048616efacchkuang int i; 5891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5909b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!filter_level) { 5911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 5929b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 5936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int w = num_8x8_blocks_wide_lookup[block_size]; 5946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int h = num_8x8_blocks_high_lookup[block_size]; 5959b35249446b07f40ac5fcc3205f2c048616efacchkuang int index = shift_y; 5969b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < h; i++) { 5979b35249446b07f40ac5fcc3205f2c048616efacchkuang vpx_memset(&lfm->lfl_y[index], filter_level, w); 5989b35249446b07f40ac5fcc3205f2c048616efacchkuang index += 8; 5999b35249446b07f40ac5fcc3205f2c048616efacchkuang } 6009b35249446b07f40ac5fcc3205f2c048616efacchkuang } 6011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= above_prediction_mask[block_size] << shift_y; 6031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= left_prediction_mask[block_size] << shift_y; 6041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (mbmi->skip && is_inter_block(mbmi)) 6061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return; 6071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *above_y |= (size_mask[block_size] & 6091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang above_64x64_txform_mask[tx_size_y]) << shift_y; 6101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *left_y |= (size_mask[block_size] & 6121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang left_64x64_txform_mask[tx_size_y]) << shift_y; 6131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang if (tx_size_y == TX_4X4) 6151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffff) << shift_y; 6161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 6171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This function sets up the bit masks for the entire 64x64 region represented 6191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// by mi_row, mi_col. 6201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// TODO(JBB): This function only works for yv12. 621b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_setup_mask(VP9_COMMON *const cm, const int mi_row, const int mi_col, 622b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MODE_INFO **mi_8x8, const int mode_info_stride, 623b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian LOOP_FILTER_MASK *lfm) { 6241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int idx_32, idx_16, idx_8; 6251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const loop_filter_info_n *const lfi_n = &cm->lf_info; 6261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang MODE_INFO **mip = mi_8x8; 6271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang MODE_INFO **mip2 = mi_8x8; 6281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // These are offsets to the next mi in the 64x64 block. It is what gets 6301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // added to the mi ptr as we go through each loop. It helps us to avoids 6311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // setting up special row and column counters for each index. The last step 6321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // brings us out back to the starting position. 6331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset_32[] = {4, (mode_info_stride << 2) - 4, 4, 6341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang -(mode_info_stride << 2) - 4}; 6351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset_16[] = {2, (mode_info_stride << 1) - 2, 2, 6361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang -(mode_info_stride << 1) - 2}; 6371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int offset[] = {1, mode_info_stride - 1, 1, -mode_info_stride - 1}; 6381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Following variables represent shifts to position the current block 6401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // mask over the appropriate block. A shift of 36 to the left will move 6411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // the bits for the final 32 by 32 block in the 64x64 up 4 rows and left 6421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // 4 rows to the appropriate spot. 6431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_32_y[] = {0, 4, 32, 36}; 6441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_16_y[] = {0, 2, 16, 18}; 6451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_8_y[] = {0, 1, 8, 9}; 6461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_32_uv[] = {0, 2, 8, 10}; 6471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_16_uv[] = {0, 1, 4, 5}; 6481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int i; 6491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int max_rows = (mi_row + MI_BLOCK_SIZE > cm->mi_rows ? 6501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_rows - mi_row : MI_BLOCK_SIZE); 6511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int max_cols = (mi_col + MI_BLOCK_SIZE > cm->mi_cols ? 6521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_cols - mi_col : MI_BLOCK_SIZE); 6531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_zero(*lfm); 6551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // TODO(jimbankoski): Try moving most of the following code into decode 6571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // loop and storing lfm in the mbmi structure so that we don't have to go 6581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // through the recursive loop structure multiple times. 6591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 6601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_64X64: 6611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0] , 0, 0, lfm); 6621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_64X32: 6641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], 0, 0, lfm); 6651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride * 4; 6661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (4 >= max_rows) 6671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], 32, 8, lfm); 6691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X64: 6711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], 0, 0, lfm); 6721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 4; 6731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (4 >= max_cols) 6741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], 4, 2, lfm); 6761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: 6781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_32 = 0; idx_32 < 4; mip += offset_32[idx_32], ++idx_32) { 6791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32]; 6801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv = shift_32_uv[idx_32]; 6811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_32_col_offset = ((idx_32 & 1) << 2); 6821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_32_row_offset = ((idx_32 >> 1) << 2); 6831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_col_offset >= max_cols || mi_32_row_offset >= max_rows) 6841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 6851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 6861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X32: 6871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 6881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_32X16: 6901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 6911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_row_offset + 2 >= max_rows) 6921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 6931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride * 2; 6941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], shift_y + 16, shift_uv + 4, lfm); 6951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 6961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X32: 6971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 6981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_32_col_offset + 2 >= max_cols) 6991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 7001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 2; 7011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip2[0], shift_y + 2, shift_uv + 1, lfm); 7021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: 7041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_16 = 0; idx_16 < 4; mip += offset_16[idx_16], ++idx_16) { 7051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + shift_16_y[idx_16]; 7061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_uv = shift_32_uv[idx_32] + shift_16_uv[idx_16]; 7071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_16_col_offset = mi_32_col_offset + 7081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_16 & 1) << 1); 7091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_16_row_offset = mi_32_row_offset + 7101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_16 >> 1) << 1); 7111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_col_offset >= max_cols || mi_16_row_offset >= max_rows) 7131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 7141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (mip[0]->mbmi.sb_type) { 7161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X16: 7171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 7181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_16X8: 7201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 7211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_row_offset + 1 >= max_rows) 7221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 7231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + mode_info_stride; 7241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip2[0], shift_y+8, lfm); 7251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang case BLOCK_8X16: 7271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 7281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_16_col_offset +1 >= max_cols) 7291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 7301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip2 = mip + 1; 7311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip2[0], shift_y+1, lfm); 7321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: { 7341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + 7351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_16_y[idx_16] + 7361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_8_y[0]; 7371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_masks(lfi_n, mip[0], shift_y, shift_uv, lfm); 7381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mip += offset[0]; 7391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (idx_8 = 1; idx_8 < 4; mip += offset[idx_8], ++idx_8) { 7401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int shift_y = shift_32_y[idx_32] + 7411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_16_y[idx_16] + 7421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang shift_8_y[idx_8]; 7431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_8_col_offset = mi_16_col_offset + 7441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_8 & 1)); 7451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int mi_8_row_offset = mi_16_row_offset + 7461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ((idx_8 >> 1)); 7471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_8_col_offset >= max_cols || 7491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_8_row_offset >= max_rows) 7501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang continue; 7511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang build_y_mask(lfi_n, mip[0], shift_y, lfm); 7521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang break; 7611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // The largest loopfilter we have is 16x16 so we use the 16x16 mask 7631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // for 32x32 transforms also also. 7641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[TX_16X16] |= lfm->left_y[TX_32X32]; 7651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_y[TX_16X16] |= lfm->above_y[TX_32X32]; 7661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_16X16] |= lfm->left_uv[TX_32X32]; 7671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_16X16] |= lfm->above_uv[TX_32X32]; 7681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // We do at least 8 tap filter on every 32x32 even if the transform size 7701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // is 4x4. So if the 4x4 is set on a border pixel add it to the 8x8 and 7711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // remove it from the 4x4. 7721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[TX_8X8] |= lfm->left_y[TX_4X4] & left_border; 7731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[TX_4X4] &= ~left_border; 7741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_y[TX_8X8] |= lfm->above_y[TX_4X4] & above_border; 7751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_y[TX_4X4] &= ~above_border; 7761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_4X4] & left_border_uv; 7771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_4X4] &= ~left_border_uv; 7781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_4X4] & above_border_uv; 7791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_4X4] &= ~above_border_uv; 7801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // We do some special edge handling. 7821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_row + MI_BLOCK_SIZE > cm->mi_rows) { 7831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint64_t rows = cm->mi_rows - mi_row; 7841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Each pixel inside the border gets a 1, 7861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint64_t mask_y = (((uint64_t) 1 << (rows << 3)) - 1); 7871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint16_t mask_uv = (((uint16_t) 1 << (((rows + 1) >> 1) << 2)) - 1); 7881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Remove values completely outside our border. 7901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (i = 0; i < TX_32X32; i++) { 7911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[i] &= mask_y; 7921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_y[i] &= mask_y; 7931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[i] &= mask_uv; 7941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[i] &= mask_uv; 7951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 7961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->int_4x4_y &= mask_y; 7971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->int_4x4_uv &= mask_uv; 7981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // We don't apply a wide loop filter on the last uv block row. If set 8001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // apply the shorter one instead. 8011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (rows == 1) { 8021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16]; 8031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_16X16] = 0; 8041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (rows == 5) { 8061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16] & 0xff00; 8071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[TX_16X16] &= ~(lfm->above_uv[TX_16X16] & 0xff00); 8081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_col + MI_BLOCK_SIZE > cm->mi_cols) { 8121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint64_t columns = cm->mi_cols - mi_col; 8131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Each pixel inside the border gets a 1, the multiply copies the border 8151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // to where we need it. 8161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint64_t mask_y = (((1 << columns) - 1)) * 0x0101010101010101; 8171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint16_t mask_uv = ((1 << ((columns + 1) >> 1)) - 1) * 0x1111; 8181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Internal edges are not applied on the last column of the image so 8201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // we mask 1 more for the internal edges 8211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint16_t mask_uv_int = ((1 << (columns >> 1)) - 1) * 0x1111; 8221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Remove the bits outside the image edge. 8241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (i = 0; i < TX_32X32; i++) { 8251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[i] &= mask_y; 8261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_y[i] &= mask_y; 8271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[i] &= mask_uv; 8281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->above_uv[i] &= mask_uv; 8291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->int_4x4_y &= mask_y; 8311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->int_4x4_uv &= mask_uv_int; 8321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // We don't apply a wide loop filter on the last uv column. If set 8341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // apply the shorter one instead. 8351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (columns == 1) { 8361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_16X16]; 8371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_16X16] = 0; 8381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (columns == 5) { 8401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_8X8] |= (lfm->left_uv[TX_16X16] & 0xcccc); 8411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[TX_16X16] &= ~(lfm->left_uv[TX_16X16] & 0xcccc); 8421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // We don't a loop filter on the first column in the image. Mask that out. 8451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mi_col == 0) { 8461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (i = 0; i < TX_32X32; i++) { 8471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_y[i] &= 0xfefefefefefefefe; 8481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang lfm->left_uv[i] &= 0xeeee; 8491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 8501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 851b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 852b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Assert if we try to apply 2 different loop filters at the same position. 853b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_8X8])); 854b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_4X4])); 855b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_y[TX_8X8] & lfm->left_y[TX_4X4])); 856b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->int_4x4_y & lfm->left_y[TX_16X16])); 857b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_uv[TX_16X16]&lfm->left_uv[TX_8X8])); 858b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_uv[TX_16X16] & lfm->left_uv[TX_4X4])); 859b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->left_uv[TX_8X8] & lfm->left_uv[TX_4X4])); 860b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->int_4x4_uv & lfm->left_uv[TX_16X16])); 861b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_8X8])); 862b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_4X4])); 863b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_y[TX_8X8] & lfm->above_y[TX_4X4])); 864b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->int_4x4_y & lfm->above_y[TX_16X16])); 865b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_8X8])); 866b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_4X4])); 867b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->above_uv[TX_8X8] & lfm->above_uv[TX_4X4])); 868b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(!(lfm->int_4x4_uv & lfm->above_uv[TX_16X16])); 869b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 870b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 871b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void filter_selectively_vert(uint8_t *s, int pitch, 872b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16, 873b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8, 874b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4, 875b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int, 876b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const loop_filter_info_n *lfi_n, 877b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint8_t *lfl) { 878b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask; 879b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 880b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; 881b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask; mask >>= 1) { 882b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const loop_filter_thresh *lfi = lfi_n->lfthr + *lfl; 883b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 884b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (mask & 1) { 885b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (mask_16x16 & 1) { 886b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_16(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr); 887b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_8x8 & 1) { 888b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_8(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 889b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else if (mask_4x4 & 1) { 890b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 891b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 892b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 893b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (mask_4x4_int & 1) 894b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_lpf_vertical_4(s + 4, pitch, lfi->mblim, lfi->lim, lfi->hev_thr, 1); 895b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian s += 8; 896b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfl += 1; 897b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16 >>= 1; 898b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8 >>= 1; 899b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4 >>= 1; 900b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int >>= 1; 901b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 9021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 9039b35249446b07f40ac5fcc3205f2c048616efacchkuang 9041184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void filter_block_plane_non420(VP9_COMMON *cm, 9051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct macroblockd_plane *plane, 9061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang MODE_INFO **mi_8x8, 9071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int mi_row, int mi_col) { 90891037db265ecdd914a26e056cf69207b4f50924ehkuang const int ss_x = plane->subsampling_x; 90991037db265ecdd914a26e056cf69207b4f50924ehkuang const int ss_y = plane->subsampling_y; 91091037db265ecdd914a26e056cf69207b4f50924ehkuang const int row_step = 1 << ss_x; 91191037db265ecdd914a26e056cf69207b4f50924ehkuang const int col_step = 1 << ss_y; 9126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const int row_step_stride = cm->mi_stride * row_step; 91391037db265ecdd914a26e056cf69207b4f50924ehkuang struct buf_2d *const dst = &plane->dst; 914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t* const dst0 = dst->buf; 91591037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_16x16[MI_BLOCK_SIZE] = {0}; 91691037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_8x8[MI_BLOCK_SIZE] = {0}; 91791037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_4x4[MI_BLOCK_SIZE] = {0}; 91891037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned int mask_4x4_int[MI_BLOCK_SIZE] = {0}; 9199b35249446b07f40ac5fcc3205f2c048616efacchkuang uint8_t lfl[MI_BLOCK_SIZE * MI_BLOCK_SIZE]; 920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int r, c; 921ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 92291037db265ecdd914a26e056cf69207b4f50924ehkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += row_step) { 923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_16x16_c = 0; 924ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_8x8_c = 0; 925ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int mask_4x4_c = 0; 926ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int border_mask; 927ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 928ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Determine the vertical edges that need filtering 92991037db265ecdd914a26e056cf69207b4f50924ehkuang for (c = 0; c < MI_BLOCK_SIZE && mi_col + c < cm->mi_cols; c += col_step) { 9301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MODE_INFO *mi = mi_8x8[c]; 931b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const BLOCK_SIZE sb_type = mi[0].mbmi.sb_type; 932b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int skip_this = mi[0].mbmi.skip && is_inter_block(&mi[0].mbmi); 933ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // left edge of current unit is block/partition edge -> no skip 934b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int block_edge_left = (num_4x4_blocks_wide_lookup[sb_type] > 1) ? 935b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian !(c & (num_8x8_blocks_wide_lookup[sb_type] - 1)) : 1; 936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_this_c = skip_this && !block_edge_left; 937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // top edge of current unit is block/partition edge -> no skip 938b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int block_edge_above = (num_4x4_blocks_high_lookup[sb_type] > 1) ? 939b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian !(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1; 940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_this_r = skip_this && !block_edge_above; 94191037db265ecdd914a26e056cf69207b4f50924ehkuang const TX_SIZE tx_size = (plane->plane_type == PLANE_TYPE_UV) 9421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ? get_uv_tx_size(&mi[0].mbmi) 9431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang : mi[0].mbmi.tx_size; 944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1; 945ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1; 946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Filter level can vary per MI 9489b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!(lfl[(r << 3) + (c >> ss_x)] = 9496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang get_filter_level(&cm->lf_info, &mi[0].mbmi))) 950ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang continue; 951ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Build masks based on the transform size of each block 953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_32X32) { 954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c && ((c >> ss_x) & 3) == 0) { 955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_c) 956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c |= 1 << (c >> ss_x); 957ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r && ((r >> ss_y) & 3) == 0) { 961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_r) 962ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16[r] |= 1 << (c >> ss_x); 963ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (tx_size == TX_16X16) { 967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c && ((c >> ss_x) & 1) == 0) { 968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_c) 969ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c |= 1 << (c >> ss_x); 970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 971ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 972ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 973ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r && ((r >> ss_y) & 1) == 0) { 974ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_border_4x4_r) 975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16[r] |= 1 << (c >> ss_x); 976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 977ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 978ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 979ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 980ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // force 8x8 filtering on 32x32 boundaries 981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_c) { 982ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_8X8 || ((c >> ss_x) & 3) == 0) 983ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c |= 1 << (c >> ss_x); 984ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_c |= 1 << (c >> ss_x); 986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this_r) { 989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (tx_size == TX_8X8 || ((r >> ss_y) & 3) == 0) 990ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8[r] |= 1 << (c >> ss_x); 991ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4[r] |= 1 << (c >> ss_x); 993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!skip_this && tx_size < TX_8X8 && !skip_border_4x4_c) 996ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_int[r] |= 1 << (c >> ss_x); 997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1000ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Disable filtering on the leftmost column 1001ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang border_mask = ~(mi_col == 0); 1002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang filter_selectively_vert(dst->buf, dst->stride, 1003ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_16x16_c & border_mask, 1004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_8x8_c & border_mask, 1005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mask_4x4_c & border_mask, 10069b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_int[r], 10079b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfl[r << 3]); 1008ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf += 8 * dst->stride; 10091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_8x8 += row_step_stride; 1010ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1012ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Now do horizontal pass 1013ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf = dst0; 101491037db265ecdd914a26e056cf69207b4f50924ehkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += row_step) { 1015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1; 1016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned int mask_4x4_int_r = skip_border_4x4_r ? 0 : mask_4x4_int[r]; 1017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 10189b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_16x16_r; 10199b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_8x8_r; 10209b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_4x4_r; 10219b35249446b07f40ac5fcc3205f2c048616efacchkuang 10229b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mi_row + r == 0) { 10239b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = 0; 10249b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = 0; 10259b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = 0; 10269b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 10279b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = mask_16x16[r]; 10289b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = mask_8x8[r]; 10299b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = mask_4x4[r]; 10309b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10319b35249446b07f40ac5fcc3205f2c048616efacchkuang 1032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang filter_selectively_horiz(dst->buf, dst->stride, 10339b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r, 10349b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r, 10359b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r, 10369b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_int_r, 10379b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfl[r << 3]); 1038ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dst->buf += 8 * dst->stride; 1039ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1040ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 10411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1042b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_filter_block_plane(VP9_COMMON *const cm, 1043b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct macroblockd_plane *const plane, 1044b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int mi_row, 1045b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian LOOP_FILTER_MASK *lfm) { 10461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct buf_2d *const dst = &plane->dst; 10471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang uint8_t* const dst0 = dst->buf; 10481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int r, c; 10491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10509b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!plane->plane_type) { 10519b35249446b07f40ac5fcc3205f2c048616efacchkuang uint64_t mask_16x16 = lfm->left_y[TX_16X16]; 10529b35249446b07f40ac5fcc3205f2c048616efacchkuang uint64_t mask_8x8 = lfm->left_y[TX_8X8]; 10539b35249446b07f40ac5fcc3205f2c048616efacchkuang uint64_t mask_4x4 = lfm->left_y[TX_4X4]; 10549b35249446b07f40ac5fcc3205f2c048616efacchkuang uint64_t mask_4x4_int = lfm->int_4x4_y; 10551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1056b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Vertical pass: do 2 rows at one time 1057b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 2) { 1058b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16_l = mask_16x16 & 0xffff; 1059b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8_l = mask_8x8 & 0xffff; 1060b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_l = mask_4x4 & 0xffff; 1061b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int_l = mask_4x4_int & 0xffff; 10621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 10631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Disable filtering on the leftmost column 1064b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian filter_selectively_vert_row2(plane->plane_type, 1065b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst->buf, dst->stride, 1066b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16_l, 1067b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8_l, 1068b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_l, 1069b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int_l, 1070b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &cm->lf_info, &lfm->lfl_y[r << 3]); 1071b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1072b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst->buf += 16 * dst->stride; 1073b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16 >>= 16; 1074b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8 >>= 16; 1075b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4 >>= 16; 1076b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int >>= 16; 10779b35249446b07f40ac5fcc3205f2c048616efacchkuang } 10789b35249446b07f40ac5fcc3205f2c048616efacchkuang 10799b35249446b07f40ac5fcc3205f2c048616efacchkuang // Horizontal pass 10809b35249446b07f40ac5fcc3205f2c048616efacchkuang dst->buf = dst0; 10819b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16 = lfm->above_y[TX_16X16]; 10829b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8 = lfm->above_y[TX_8X8]; 10839b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4 = lfm->above_y[TX_4X4]; 1084b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int = lfm->int_4x4_y; 10859b35249446b07f40ac5fcc3205f2c048616efacchkuang 10869b35249446b07f40ac5fcc3205f2c048616efacchkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r++) { 10879b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_16x16_r; 10889b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_8x8_r; 10899b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_4x4_r; 10909b35249446b07f40ac5fcc3205f2c048616efacchkuang 10919b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mi_row + r == 0) { 10929b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = 0; 10939b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = 0; 10949b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = 0; 10959b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 10969b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = mask_16x16 & 0xff; 10979b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = mask_8x8 & 0xff; 10989b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = mask_4x4 & 0xff; 10999b35249446b07f40ac5fcc3205f2c048616efacchkuang } 11009b35249446b07f40ac5fcc3205f2c048616efacchkuang 11019b35249446b07f40ac5fcc3205f2c048616efacchkuang filter_selectively_horiz(dst->buf, dst->stride, 11029b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r, 11039b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r, 11049b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r, 1105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int & 0xff, 11069b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfm->lfl_y[r << 3]); 11079b35249446b07f40ac5fcc3205f2c048616efacchkuang 11089b35249446b07f40ac5fcc3205f2c048616efacchkuang dst->buf += 8 * dst->stride; 11099b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16 >>= 8; 11109b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8 >>= 8; 11119b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4 >>= 8; 1112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int >>= 8; 11139b35249446b07f40ac5fcc3205f2c048616efacchkuang } 11149b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 11159b35249446b07f40ac5fcc3205f2c048616efacchkuang uint16_t mask_16x16 = lfm->left_uv[TX_16X16]; 11169b35249446b07f40ac5fcc3205f2c048616efacchkuang uint16_t mask_8x8 = lfm->left_uv[TX_8X8]; 11179b35249446b07f40ac5fcc3205f2c048616efacchkuang uint16_t mask_4x4 = lfm->left_uv[TX_4X4]; 11189b35249446b07f40ac5fcc3205f2c048616efacchkuang uint16_t mask_4x4_int = lfm->int_4x4_uv; 11199b35249446b07f40ac5fcc3205f2c048616efacchkuang 1120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Vertical pass: do 2 rows at one time 1121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 4) { 11229b35249446b07f40ac5fcc3205f2c048616efacchkuang if (plane->plane_type == 1) { 1123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (c = 0; c < (MI_BLOCK_SIZE >> 1); c++) { 11249b35249446b07f40ac5fcc3205f2c048616efacchkuang lfm->lfl_uv[(r << 1) + c] = lfm->lfl_y[(r << 3) + (c << 1)]; 1125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian lfm->lfl_uv[((r + 2) << 1) + c] = lfm->lfl_y[((r + 2) << 3) + 1126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian (c << 1)]; 1127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 11289b35249446b07f40ac5fcc3205f2c048616efacchkuang } 11299b35249446b07f40ac5fcc3205f2c048616efacchkuang 1130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian { 1131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_16x16_l = mask_16x16 & 0xff; 1132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_8x8_l = mask_8x8 & 0xff; 1133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_l = mask_4x4 & 0xff; 1134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int mask_4x4_int_l = mask_4x4_int & 0xff; 1135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Disable filtering on the leftmost column 1137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian filter_selectively_vert_row2(plane->plane_type, 1138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst->buf, dst->stride, 1139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16_l, 1140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8_l, 1141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_l, 1142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int_l, 1143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &cm->lf_info, &lfm->lfl_uv[r << 1]); 1144b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1145b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian dst->buf += 16 * dst->stride; 1146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_16x16 >>= 8; 1147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_8x8 >>= 8; 1148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4 >>= 8; 1149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int >>= 8; 1150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 11511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 11521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 11539b35249446b07f40ac5fcc3205f2c048616efacchkuang // Horizontal pass 11549b35249446b07f40ac5fcc3205f2c048616efacchkuang dst->buf = dst0; 11559b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16 = lfm->above_uv[TX_16X16]; 11569b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8 = lfm->above_uv[TX_8X8]; 11579b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4 = lfm->above_uv[TX_4X4]; 1158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int = lfm->int_4x4_uv; 11599b35249446b07f40ac5fcc3205f2c048616efacchkuang 11609b35249446b07f40ac5fcc3205f2c048616efacchkuang for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 2) { 11619b35249446b07f40ac5fcc3205f2c048616efacchkuang const int skip_border_4x4_r = mi_row + r == cm->mi_rows - 1; 11629b35249446b07f40ac5fcc3205f2c048616efacchkuang const unsigned int mask_4x4_int_r = skip_border_4x4_r ? 1163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 0 : (mask_4x4_int & 0xf); 11649b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_16x16_r; 11659b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_8x8_r; 11669b35249446b07f40ac5fcc3205f2c048616efacchkuang unsigned int mask_4x4_r; 11679b35249446b07f40ac5fcc3205f2c048616efacchkuang 11689b35249446b07f40ac5fcc3205f2c048616efacchkuang if (mi_row + r == 0) { 11699b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = 0; 11709b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = 0; 11719b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = 0; 11729b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 11739b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r = mask_16x16 & 0xf; 11749b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r = mask_8x8 & 0xf; 11759b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r = mask_4x4 & 0xf; 11769b35249446b07f40ac5fcc3205f2c048616efacchkuang } 11771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 11781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang filter_selectively_horiz(dst->buf, dst->stride, 11799b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16_r, 11809b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8_r, 11819b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4_r, 11821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mask_4x4_int_r, 11839b35249446b07f40ac5fcc3205f2c048616efacchkuang &cm->lf_info, &lfm->lfl_uv[r << 1]); 11849b35249446b07f40ac5fcc3205f2c048616efacchkuang 11859b35249446b07f40ac5fcc3205f2c048616efacchkuang dst->buf += 8 * dst->stride; 11869b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_16x16 >>= 4; 11879b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_8x8 >>= 4; 11889b35249446b07f40ac5fcc3205f2c048616efacchkuang mask_4x4 >>= 4; 1189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian mask_4x4_int >>= 4; 11901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 11911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 11921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 1193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 119491037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_loop_filter_rows(const YV12_BUFFER_CONFIG *frame_buffer, 119591037db265ecdd914a26e056cf69207b4f50924ehkuang VP9_COMMON *cm, MACROBLOCKD *xd, 119691037db265ecdd914a26e056cf69207b4f50924ehkuang int start, int stop, int y_only) { 119791037db265ecdd914a26e056cf69207b4f50924ehkuang const int num_planes = y_only ? 1 : MAX_MB_PLANE; 1198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int mi_row, mi_col; 11991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang LOOP_FILTER_MASK lfm; 12001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int use_420 = y_only || (xd->plane[1].subsampling_y == 1 && 12011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang xd->plane[1].subsampling_x == 1); 1202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 120391037db265ecdd914a26e056cf69207b4f50924ehkuang for (mi_row = start; mi_row < stop; mi_row += MI_BLOCK_SIZE) { 12046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MODE_INFO **mi_8x8 = cm->mi_grid_visible + mi_row * cm->mi_stride; 1205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 120691037db265ecdd914a26e056cf69207b4f50924ehkuang for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) { 1207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int plane; 1208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1209b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_setup_dst_planes(xd, frame_buffer, mi_row, mi_col); 12101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 12111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // TODO(JBB): Make setup_mask work for non 420. 12121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (use_420) 12136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang vp9_setup_mask(cm, mi_row, mi_col, mi_8x8 + mi_col, cm->mi_stride, 12146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang &lfm); 12151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 121691037db265ecdd914a26e056cf69207b4f50924ehkuang for (plane = 0; plane < num_planes; ++plane) { 12171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (use_420) 1218b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_filter_block_plane(cm, &xd->plane[plane], mi_row, &lfm); 12191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang else 12201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang filter_block_plane_non420(cm, &xd->plane[plane], mi_8x8 + mi_col, 12211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_row, mi_col); 1222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 122691037db265ecdd914a26e056cf69207b4f50924ehkuang 122791037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_loop_filter_frame(VP9_COMMON *cm, MACROBLOCKD *xd, 12281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int frame_filter_level, 1229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int y_only, int partial_frame) { 12301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int start_mi_row, end_mi_row, mi_rows_to_filter; 123191037db265ecdd914a26e056cf69207b4f50924ehkuang if (!frame_filter_level) return; 12321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row = 0; 12331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_rows_to_filter = cm->mi_rows; 1234b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (partial_frame && cm->mi_rows > 8) { 12351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row = cm->mi_rows >> 1; 12361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row &= 0xfffffff8; 12371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang mi_rows_to_filter = MAX(cm->mi_rows / 8, 8); 12381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 12391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang end_mi_row = start_mi_row + mi_rows_to_filter; 12401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_frame_init(cm, frame_filter_level); 124191037db265ecdd914a26e056cf69207b4f50924ehkuang vp9_loop_filter_rows(cm->frame_to_show, cm, xd, 12421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang start_mi_row, end_mi_row, 12431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang y_only); 124491037db265ecdd914a26e056cf69207b4f50924ehkuang} 1245f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 1246f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangint vp9_loop_filter_worker(void *arg1, void *arg2) { 1247f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang LFWorkerData *const lf_data = (LFWorkerData*)arg1; 1248f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang (void)arg2; 1249f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_loop_filter_rows(lf_data->frame_buffer, lf_data->cm, &lf_data->xd, 1250f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang lf_data->start, lf_data->stop, lf_data->y_only); 1251f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang return 1; 1252f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang} 1253