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
146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang// Integer pel reference mv threshold for use of high-precision 1/8 mv
15f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang#define COMPANDED_MVREF_THRESH 8
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianconst vpx_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_JOINT_ZERO, 2,
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_JOINT_HNZVZ, 4,
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianconst vpx_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_0, 2,
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_1, 4,
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  6, 8,
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_2, -MV_CLASS_3,
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  10, 12,
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_4, -MV_CLASS_5,
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_6, 14,
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  16, 18,
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_7, -MV_CLASS_8,
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -MV_CLASS_9, -MV_CLASS_10,
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianconst vpx_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -0, -1,
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianconst vpx_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -0, 2,
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -1, 4,
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  -2, -3
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4691037db265ecdd914a26e056cf69207b4f50924ehkuangstatic const nmv_context default_nmv_context = {
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  {32, 64, 96},
486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  {
496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    { // Vertical component
506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      128,                                                  // sign
516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {224, 144, 192, 168, 192, 176, 192, 198, 198, 245},   // class
526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {216},                                                // class0
536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   // bits
546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {{128, 128, 64}, {96, 112, 64}},                      // class0_fp
556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {64, 96, 64},                                         // fp
566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      160,                                                  // class0_hp bit
576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      128,                                                  // hp
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    },
596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    { // Horizontal component
606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      128,                                                  // sign
616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {216, 128, 176, 160, 176, 176, 192, 198, 198, 208},   // class
626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {208},                                                // class0
636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   // bits
646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {{128, 128, 64}, {96, 112, 64}},                      // class0_fp
656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      {64, 96, 64},                                         // fp
666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      160,                                                  // class0_hp bit
676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      128,                                                  // hp
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  },
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
721184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic const uint8_t log_in_base_2[] = {
731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  7, 7, 7, 7, 7, 7, 7, 7, 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, 8, 8, 8, 8, 8, 8, 8, 8,
841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  9, 9, 9, 9, 9, 9, 9, 9, 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, 10
1161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang};
1171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
1186ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic INLINE int mv_class_base(MV_CLASS_TYPE c) {
1196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  return c ? CLASS0_SIZE << (c + 2) : 0;
1206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
1216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangMV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) {
1236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ?
1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (offset)
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *offset = z - mv_class_base(c);
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return c;
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13091037db265ecdd914a26e056cf69207b4f50924ehkuangint vp9_use_mv_hp(const MV *ref) {
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang         (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13591037db265ecdd914a26e056cf69207b4f50924ehkuangstatic void inc_mv_component(int v, nmv_component_counts *comp_counts,
13691037db265ecdd914a26e056cf69207b4f50924ehkuang                             int incr, int usehp) {
137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int s, z, c, o, d, e, f;
1385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  assert(v != 0);            /* should not be zero */
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  s = v < 0;
14091037db265ecdd914a26e056cf69207b4f50924ehkuang  comp_counts->sign[s] += incr;
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  z = (s ? -v : v) - 1;       /* magnitude - 1 */
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  c = vp9_get_mv_class(z, &o);
14491037db265ecdd914a26e056cf69207b4f50924ehkuang  comp_counts->classes[c] += incr;
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  d = (o >> 3);               /* int mv data */
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  f = (o >> 1) & 3;           /* fractional pel mv data */
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  e = (o & 1);                /* high precision mv data */
1491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  if (c == MV_CLASS_0) {
15191037db265ecdd914a26e056cf69207b4f50924ehkuang    comp_counts->class0[d] += incr;
1521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    comp_counts->class0_fp[d][f] += incr;
1531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    comp_counts->class0_hp[e] += usehp * incr;
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int i;
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int b = c + CLASS0_BITS - 1;  // number of bits
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (i = 0; i < b; ++i)
15891037db265ecdd914a26e056cf69207b4f50924ehkuang      comp_counts->bits[i][((d >> i) & 1)] += incr;
15991037db265ecdd914a26e056cf69207b4f50924ehkuang    comp_counts->fp[f] += incr;
1601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    comp_counts->hp[e] += usehp * incr;
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vp9_inc_mv(const MV *mv, nmv_context_counts *counts) {
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (counts != NULL) {
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++counts->joints[j];
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (mv_joint_vertical(j)) {
1705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      inc_mv_component(mv->row, &counts->comps[0], 1, 1);
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (mv_joint_horizontal(j)) {
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      inc_mv_component(mv->col, &counts->comps[1], 1, 1);
1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
1761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  }
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
179f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangvoid vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) {
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i, j;
181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  nmv_context *fc = &cm->fc->nmvc;
1835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
1845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const nmv_context_counts *counts = &cm->counts.mv;
18591037db265ecdd914a26e056cf69207b4f50924ehkuang
1867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  vpx_tree_merge_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints,
1877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                       fc->joints);
188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < 2; ++i) {
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    nmv_component *comp = &fc->comps[i];
1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const nmv_component *pre_comp = &pre_fc->comps[i];
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const nmv_component_counts *c = &counts->comps[i];
1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    comp->sign = mode_mv_merge_probs(pre_comp->sign, c->sign);
1957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_tree_merge_probs(vp9_mv_class_tree, pre_comp->classes, c->classes,
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                         comp->classes);
1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_tree_merge_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0,
1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                         comp->class0);
19991037db265ecdd914a26e056cf69207b4f50924ehkuang
20091037db265ecdd914a26e056cf69207b4f50924ehkuang    for (j = 0; j < MV_OFFSET_BITS; ++j)
2017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      comp->bits[j] = mode_mv_merge_probs(pre_comp->bits[j], c->bits[j]);
20291037db265ecdd914a26e056cf69207b4f50924ehkuang
20391037db265ecdd914a26e056cf69207b4f50924ehkuang    for (j = 0; j < CLASS0_SIZE; ++j)
2047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j],
2057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                           c->class0_fp[j], comp->class0_fp[j]);
20691037db265ecdd914a26e056cf69207b4f50924ehkuang
2077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
20891037db265ecdd914a26e056cf69207b4f50924ehkuang
209f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    if (allow_hp) {
2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      comp->class0_hp = mode_mv_merge_probs(pre_comp->class0_hp, c->class0_hp);
2117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      comp->hp = mode_mv_merge_probs(pre_comp->hp, c->hp);
212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_init_mv_probs(VP9_COMMON *cm) {
2177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cm->fc->nmvc = default_nmv_context;
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
219