1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymv.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MV_COUNT_SAT 20 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MV_MAX_UPDATE_FACTOR 128 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang// Integer pel reference mv threshold for use of high-precision 1/8 mv 18f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang#define COMPANDED_MVREF_THRESH 8 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = { 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_JOINT_ZERO, 2, 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_JOINT_HNZVZ, 4, 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = { 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_0, 2, 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_1, 4, 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6, 8, 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_2, -MV_CLASS_3, 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 10, 12, 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_4, -MV_CLASS_5, 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_6, 14, 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16, 18, 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_7, -MV_CLASS_8, 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -MV_CLASS_9, -MV_CLASS_10, 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = { 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -0, -1, 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = { 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -0, 2, 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -1, 4, 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -2, -3 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4991037db265ecdd914a26e056cf69207b4f50924ehkuangstatic const nmv_context default_nmv_context = { 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang {32, 64, 96}, 516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang { 526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang { // Vertical component 536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 128, // sign 546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class 556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {216}, // class0 566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {{128, 128, 64}, {96, 112, 64}}, // class0_fp 586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {64, 96, 64}, // fp 596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 160, // class0_hp bit 606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 128, // hp 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang }, 626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang { // Horizontal component 636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 128, // sign 646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class 656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {208}, // class0 666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {{128, 128, 64}, {96, 112, 64}}, // class0_fp 686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang {64, 96, 64}, // fp 696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 160, // class0_hp bit 706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 128, // hp 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang }, 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 751184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint8_t log_in_base_2[] = { 761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 1191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 1201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 1216ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE int mv_class_base(MV_CLASS_TYPE c) { 1226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang return c ? CLASS0_SIZE << (c + 2) : 0; 1236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang} 1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangMV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) { 1266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ? 1276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3]; 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (offset) 129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *offset = z - mv_class_base(c); 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return c; 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 13391037db265ecdd914a26e056cf69207b4f50924ehkuangint vp9_use_mv_hp(const MV *ref) { 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH && 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH; 136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) { 139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return mv_class_base(c) + offset; 140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14291037db265ecdd914a26e056cf69207b4f50924ehkuangstatic void inc_mv_component(int v, nmv_component_counts *comp_counts, 14391037db265ecdd914a26e056cf69207b4f50924ehkuang int incr, int usehp) { 144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int s, z, c, o, d, e, f; 1455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang assert(v != 0); /* should not be zero */ 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang s = v < 0; 14791037db265ecdd914a26e056cf69207b4f50924ehkuang comp_counts->sign[s] += incr; 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang z = (s ? -v : v) - 1; /* magnitude - 1 */ 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang c = vp9_get_mv_class(z, &o); 15191037db265ecdd914a26e056cf69207b4f50924ehkuang comp_counts->classes[c] += incr; 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang d = (o >> 3); /* int mv data */ 154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang f = (o >> 1) & 3; /* fractional pel mv data */ 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang e = (o & 1); /* high precision mv data */ 1561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (c == MV_CLASS_0) { 15891037db265ecdd914a26e056cf69207b4f50924ehkuang comp_counts->class0[d] += incr; 1591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang comp_counts->class0_fp[d][f] += incr; 1601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang comp_counts->class0_hp[e] += usehp * incr; 161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int b = c + CLASS0_BITS - 1; // number of bits 164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < b; ++i) 16591037db265ecdd914a26e056cf69207b4f50924ehkuang comp_counts->bits[i][((d >> i) & 1)] += incr; 16691037db265ecdd914a26e056cf69207b4f50924ehkuang comp_counts->fp[f] += incr; 1671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang comp_counts->hp[e] += usehp * incr; 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vp9_inc_mv(const MV *mv, nmv_context_counts *counts) { 1725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (counts != NULL) { 1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const MV_JOINT_TYPE j = vp9_get_mv_joint(mv); 1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ++counts->joints[j]; 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (mv_joint_vertical(j)) { 1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang inc_mv_component(mv->row, &counts->comps[0], 1, 1); 1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (mv_joint_horizontal(j)) { 1815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang inc_mv_component(mv->col, &counts->comps[1], 1, 1); 1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 1831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 186f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangstatic vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) { 1875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang return merge_probs(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR); 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void adapt_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs, 1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const unsigned int *counts, vp9_prob *probs) { 192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_tree_merge_probs(tree, pre_probs, counts, MV_COUNT_SAT, 193b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian MV_MAX_UPDATE_FACTOR, probs); 194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 196f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangvoid vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) { 197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i, j; 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang nmv_context *fc = &cm->fc.nmvc; 2005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc; 2015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const nmv_context_counts *counts = &cm->counts.mv; 20291037db265ecdd914a26e056cf69207b4f50924ehkuang 2039b35249446b07f40ac5fcc3205f2c048616efacchkuang adapt_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, fc->joints); 204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < 2; ++i) { 2065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang nmv_component *comp = &fc->comps[i]; 2075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const nmv_component *pre_comp = &pre_fc->comps[i]; 2085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const nmv_component_counts *c = &counts->comps[i]; 2095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 2105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->sign = adapt_prob(pre_comp->sign, c->sign); 2115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang adapt_probs(vp9_mv_class_tree, pre_comp->classes, c->classes, 2125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->classes); 2135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang adapt_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, comp->class0); 21491037db265ecdd914a26e056cf69207b4f50924ehkuang 21591037db265ecdd914a26e056cf69207b4f50924ehkuang for (j = 0; j < MV_OFFSET_BITS; ++j) 2165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->bits[j] = adapt_prob(pre_comp->bits[j], c->bits[j]); 21791037db265ecdd914a26e056cf69207b4f50924ehkuang 21891037db265ecdd914a26e056cf69207b4f50924ehkuang for (j = 0; j < CLASS0_SIZE; ++j) 2195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang adapt_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], c->class0_fp[j], 2205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->class0_fp[j]); 22191037db265ecdd914a26e056cf69207b4f50924ehkuang 2225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang adapt_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp); 22391037db265ecdd914a26e056cf69207b4f50924ehkuang 224f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang if (allow_hp) { 2255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->class0_hp = adapt_prob(pre_comp->class0_hp, c->class0_hp); 2265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang comp->hp = adapt_prob(pre_comp->hp, c->hp); 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_init_mv_probs(VP9_COMMON *cm) { 23291037db265ecdd914a26e056cf69207b4f50924ehkuang cm->fc.nmvc = default_nmv_context; 233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 234