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