1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 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. 9 */ 10 11 #include "vp9/common/vp9_onyxc_int.h" 12 #include "vp9/common/vp9_entropymv.h" 13 14 #define MV_COUNT_SAT 20 15 #define MV_MAX_UPDATE_FACTOR 128 16 17 // Integer pel reference mv threshold for use of high-precision 1/8 mv 18 #define COMPANDED_MVREF_THRESH 8 19 20 const vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = { 21 -MV_JOINT_ZERO, 2, 22 -MV_JOINT_HNZVZ, 4, 23 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ 24 }; 25 26 const vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = { 27 -MV_CLASS_0, 2, 28 -MV_CLASS_1, 4, 29 6, 8, 30 -MV_CLASS_2, -MV_CLASS_3, 31 10, 12, 32 -MV_CLASS_4, -MV_CLASS_5, 33 -MV_CLASS_6, 14, 34 16, 18, 35 -MV_CLASS_7, -MV_CLASS_8, 36 -MV_CLASS_9, -MV_CLASS_10, 37 }; 38 39 const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = { 40 -0, -1, 41 }; 42 43 const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = { 44 -0, 2, 45 -1, 4, 46 -2, -3 47 }; 48 49 static const nmv_context default_nmv_context = { 50 {32, 64, 96}, 51 { 52 { // Vertical component 53 128, // sign 54 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class 55 {216}, // class0 56 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 57 {{128, 128, 64}, {96, 112, 64}}, // class0_fp 58 {64, 96, 64}, // fp 59 160, // class0_hp bit 60 128, // hp 61 }, 62 { // Horizontal component 63 128, // sign 64 {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class 65 {208}, // class0 66 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 67 {{128, 128, 64}, {96, 112, 64}}, // class0_fp 68 {64, 96, 64}, // fp 69 160, // class0_hp bit 70 128, // hp 71 } 72 }, 73 }; 74 75 static const uint8_t log_in_base_2[] = { 76 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 77 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 78 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 79 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 80 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 81 6, 6, 6, 6, 6, 6, 6, 6, 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, 7, 7, 7, 7, 7, 7, 7, 7, 84 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 85 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 86 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 95 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 96 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 97 8, 8, 8, 8, 8, 8, 8, 8, 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, 9, 9, 9, 9, 9, 9, 9, 9, 116 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 117 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 118 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 119 }; 120 121 static INLINE int mv_class_base(MV_CLASS_TYPE c) { 122 return c ? CLASS0_SIZE << (c + 2) : 0; 123 } 124 125 MV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) { 126 const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ? 127 MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3]; 128 if (offset) 129 *offset = z - mv_class_base(c); 130 return c; 131 } 132 133 int vp9_use_mv_hp(const MV *ref) { 134 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH && 135 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH; 136 } 137 138 int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) { 139 return mv_class_base(c) + offset; 140 } 141 142 static void inc_mv_component(int v, nmv_component_counts *comp_counts, 143 int incr, int usehp) { 144 int s, z, c, o, d, e, f; 145 assert(v != 0); /* should not be zero */ 146 s = v < 0; 147 comp_counts->sign[s] += incr; 148 z = (s ? -v : v) - 1; /* magnitude - 1 */ 149 150 c = vp9_get_mv_class(z, &o); 151 comp_counts->classes[c] += incr; 152 153 d = (o >> 3); /* int mv data */ 154 f = (o >> 1) & 3; /* fractional pel mv data */ 155 e = (o & 1); /* high precision mv data */ 156 157 if (c == MV_CLASS_0) { 158 comp_counts->class0[d] += incr; 159 comp_counts->class0_fp[d][f] += incr; 160 comp_counts->class0_hp[e] += usehp * incr; 161 } else { 162 int i; 163 int b = c + CLASS0_BITS - 1; // number of bits 164 for (i = 0; i < b; ++i) 165 comp_counts->bits[i][((d >> i) & 1)] += incr; 166 comp_counts->fp[f] += incr; 167 comp_counts->hp[e] += usehp * incr; 168 } 169 } 170 171 void vp9_inc_mv(const MV *mv, nmv_context_counts *counts) { 172 if (counts != NULL) { 173 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv); 174 ++counts->joints[j]; 175 176 if (mv_joint_vertical(j)) { 177 inc_mv_component(mv->row, &counts->comps[0], 1, 1); 178 } 179 180 if (mv_joint_horizontal(j)) { 181 inc_mv_component(mv->col, &counts->comps[1], 1, 1); 182 } 183 } 184 } 185 186 static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) { 187 return merge_probs(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR); 188 } 189 190 static void adapt_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs, 191 const unsigned int *counts, vp9_prob *probs) { 192 vp9_tree_merge_probs(tree, pre_probs, counts, MV_COUNT_SAT, 193 MV_MAX_UPDATE_FACTOR, probs); 194 } 195 196 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) { 197 int i, j; 198 199 nmv_context *fc = &cm->fc.nmvc; 200 const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc; 201 const nmv_context_counts *counts = &cm->counts.mv; 202 203 adapt_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, fc->joints); 204 205 for (i = 0; i < 2; ++i) { 206 nmv_component *comp = &fc->comps[i]; 207 const nmv_component *pre_comp = &pre_fc->comps[i]; 208 const nmv_component_counts *c = &counts->comps[i]; 209 210 comp->sign = adapt_prob(pre_comp->sign, c->sign); 211 adapt_probs(vp9_mv_class_tree, pre_comp->classes, c->classes, 212 comp->classes); 213 adapt_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, comp->class0); 214 215 for (j = 0; j < MV_OFFSET_BITS; ++j) 216 comp->bits[j] = adapt_prob(pre_comp->bits[j], c->bits[j]); 217 218 for (j = 0; j < CLASS0_SIZE; ++j) 219 adapt_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], c->class0_fp[j], 220 comp->class0_fp[j]); 221 222 adapt_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp); 223 224 if (allow_hp) { 225 comp->class0_hp = adapt_prob(pre_comp->class0_hp, c->class0_hp); 226 comp->hp = adapt_prob(pre_comp->hp, c->hp); 227 } 228 } 229 } 230 231 void vp9_init_mv_probs(VP9_COMMON *cm) { 232 cm->fc.nmvc = default_nmv_context; 233 } 234