2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #include "vp10/common/onyxc_int.h"
12 #include "vp10/common/entropymv.h"
14 // Integer pel reference mv threshold for use of high-precision 1/8 mv
15 #define COMPANDED_MVREF_THRESH 8
17 const vpx_tree_index vp10_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
20 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
23 const vpx_tree_index vp10_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
27 -MV_CLASS_2, -MV_CLASS_3,
29 -MV_CLASS_4, -MV_CLASS_5,
32 -MV_CLASS_7, -MV_CLASS_8,
33 -MV_CLASS_9, -MV_CLASS_10,
36 const vpx_tree_index vp10_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
40 const vpx_tree_index vp10_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
46 static const nmv_context default_nmv_context = {
49 { // Vertical component
51 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class
53 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
54 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
59 { // Horizontal component
61 {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class
63 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
64 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
72 static const uint8_t log_in_base_2[] = {
73 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
74 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
75 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
76 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
77 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
78 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
79 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
80 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
81 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
82 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
83 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
84 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
85 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
86 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
87 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
88 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
89 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
90 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
91 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
92 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
93 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
94 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
95 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
96 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
97 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
98 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
99 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
100 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
101 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
102 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
103 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
104 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
105 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
106 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
107 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
108 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
109 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
110 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
111 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
112 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
113 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
114 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
115 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
118 static INLINE int mv_class_base(MV_CLASS_TYPE c) {
119 return c ? CLASS0_SIZE << (c + 2) : 0;
122 MV_CLASS_TYPE vp10_get_mv_class(int z, int *offset) {
123 const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ?
124 MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
126 *offset = z - mv_class_base(c);
130 int vp10_use_mv_hp(const MV *ref) {
131 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
132 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
135 static void inc_mv_component(int v, nmv_component_counts *comp_counts,
136 int incr, int usehp) {
137 int s, z, c, o, d, e, f;
138 assert(v != 0); /* should not be zero */
140 comp_counts->sign[s] += incr;
141 z = (s ? -v : v) - 1; /* magnitude - 1 */
143 c = vp10_get_mv_class(z, &o);
144 comp_counts->classes[c] += incr;
146 d = (o >> 3); /* int mv data */
147 f = (o >> 1) & 3; /* fractional pel mv data */
148 e = (o & 1); /* high precision mv data */
150 if (c == MV_CLASS_0) {
151 comp_counts->class0[d] += incr;
152 comp_counts->class0_fp[d][f] += incr;
153 comp_counts->class0_hp[e] += usehp * incr;
156 int b = c + CLASS0_BITS - 1; // number of bits
157 for (i = 0; i < b; ++i)
158 comp_counts->bits[i][((d >> i) & 1)] += incr;
159 comp_counts->fp[f] += incr;
160 comp_counts->hp[e] += usehp * incr;
164 void vp10_inc_mv(const MV *mv, nmv_context_counts *counts) {
165 if (counts != NULL) {
166 const MV_JOINT_TYPE j = vp10_get_mv_joint(mv);
169 if (mv_joint_vertical(j)) {
170 inc_mv_component(mv->row, &counts->comps[0], 1, 1);
173 if (mv_joint_horizontal(j)) {
174 inc_mv_component(mv->col, &counts->comps[1], 1, 1);
179 void vp10_adapt_mv_probs(VP10_COMMON *cm, int allow_hp) {
182 nmv_context *fc = &cm->fc->nmvc;
183 const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
184 const nmv_context_counts *counts = &cm->counts.mv;
186 vpx_tree_merge_probs(vp10_mv_joint_tree, pre_fc->joints, counts->joints,
189 for (i = 0; i < 2; ++i) {
190 nmv_component *comp = &fc->comps[i];
191 const nmv_component *pre_comp = &pre_fc->comps[i];
192 const nmv_component_counts *c = &counts->comps[i];
194 comp->sign = mode_mv_merge_probs(pre_comp->sign, c->sign);
195 vpx_tree_merge_probs(vp10_mv_class_tree, pre_comp->classes, c->classes,
197 vpx_tree_merge_probs(vp10_mv_class0_tree, pre_comp->class0, c->class0,
200 for (j = 0; j < MV_OFFSET_BITS; ++j)
201 comp->bits[j] = mode_mv_merge_probs(pre_comp->bits[j], c->bits[j]);
203 for (j = 0; j < CLASS0_SIZE; ++j)
204 vpx_tree_merge_probs(vp10_mv_fp_tree, pre_comp->class0_fp[j],
205 c->class0_fp[j], comp->class0_fp[j]);
207 vpx_tree_merge_probs(vp10_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
210 comp->class0_hp = mode_mv_merge_probs(pre_comp->class0_hp, c->class0_hp);
211 comp->hp = mode_mv_merge_probs(pre_comp->hp, c->hp);
216 void vp10_init_mv_probs(VP10_COMMON *cm) {
217 cm->fc->nmvc = default_nmv_context;