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// Integer pel reference mv threshold for use of high-precision 1/8 mv 15#define COMPANDED_MVREF_THRESH 8 16 17const vpx_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = { 18 -MV_JOINT_ZERO, 2, 19 -MV_JOINT_HNZVZ, 4, 20 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ 21}; 22 23const vpx_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = { 24 -MV_CLASS_0, 2, 25 -MV_CLASS_1, 4, 26 6, 8, 27 -MV_CLASS_2, -MV_CLASS_3, 28 10, 12, 29 -MV_CLASS_4, -MV_CLASS_5, 30 -MV_CLASS_6, 14, 31 16, 18, 32 -MV_CLASS_7, -MV_CLASS_8, 33 -MV_CLASS_9, -MV_CLASS_10, 34}; 35 36const vpx_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = { 37 -0, -1, 38}; 39 40const vpx_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = { 41 -0, 2, 42 -1, 4, 43 -2, -3 44}; 45 46static const nmv_context default_nmv_context = { 47 {32, 64, 96}, 48 { 49 { // Vertical component 50 128, // sign 51 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class 52 {216}, // class0 53 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 54 {{128, 128, 64}, {96, 112, 64}}, // class0_fp 55 {64, 96, 64}, // fp 56 160, // class0_hp bit 57 128, // hp 58 }, 59 { // Horizontal component 60 128, // sign 61 {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class 62 {208}, // class0 63 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits 64 {{128, 128, 64}, {96, 112, 64}}, // class0_fp 65 {64, 96, 64}, // fp 66 160, // class0_hp bit 67 128, // hp 68 } 69 }, 70}; 71 72static 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 116}; 117 118static INLINE int mv_class_base(MV_CLASS_TYPE c) { 119 return c ? CLASS0_SIZE << (c + 2) : 0; 120} 121 122MV_CLASS_TYPE vp9_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]; 125 if (offset) 126 *offset = z - mv_class_base(c); 127 return c; 128} 129 130int vp9_use_mv_hp(const MV *ref) { 131 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH && 132 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH; 133} 134 135static 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 */ 139 s = v < 0; 140 comp_counts->sign[s] += incr; 141 z = (s ? -v : v) - 1; /* magnitude - 1 */ 142 143 c = vp9_get_mv_class(z, &o); 144 comp_counts->classes[c] += incr; 145 146 d = (o >> 3); /* int mv data */ 147 f = (o >> 1) & 3; /* fractional pel mv data */ 148 e = (o & 1); /* high precision mv data */ 149 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; 154 } else { 155 int i; 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; 161 } 162} 163 164void vp9_inc_mv(const MV *mv, nmv_context_counts *counts) { 165 if (counts != NULL) { 166 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv); 167 ++counts->joints[j]; 168 169 if (mv_joint_vertical(j)) { 170 inc_mv_component(mv->row, &counts->comps[0], 1, 1); 171 } 172 173 if (mv_joint_horizontal(j)) { 174 inc_mv_component(mv->col, &counts->comps[1], 1, 1); 175 } 176 } 177} 178 179void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) { 180 int i, j; 181 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; 185 186 vpx_tree_merge_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, 187 fc->joints); 188 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]; 193 194 comp->sign = mode_mv_merge_probs(pre_comp->sign, c->sign); 195 vpx_tree_merge_probs(vp9_mv_class_tree, pre_comp->classes, c->classes, 196 comp->classes); 197 vpx_tree_merge_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, 198 comp->class0); 199 200 for (j = 0; j < MV_OFFSET_BITS; ++j) 201 comp->bits[j] = mode_mv_merge_probs(pre_comp->bits[j], c->bits[j]); 202 203 for (j = 0; j < CLASS0_SIZE; ++j) 204 vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], 205 c->class0_fp[j], comp->class0_fp[j]); 206 207 vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp); 208 209 if (allow_hp) { 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); 212 } 213 } 214} 215 216void vp9_init_mv_probs(VP9_COMMON *cm) { 217 cm->fc->nmvc = default_nmv_context; 218} 219