diff options
Diffstat (limited to 'vp9/common/vp9_prob.h')
-rw-r--r-- | vp9/common/vp9_prob.h | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/vp9/common/vp9_prob.h b/vp9/common/vp9_prob.h index bc1511a5e..c69c62c81 100644 --- a/vp9/common/vp9_prob.h +++ b/vp9/common/vp9_prob.h @@ -33,6 +33,8 @@ typedef int8_t vp9_tree_index; #define vp9_complement(x) (255 - x) +#define MODE_MV_COUNT_SAT 20 + /* We build coding trees compactly in arrays. Each node of the tree is a pair of vp9_tree_indices. Array index often references a corresponding probability table. @@ -69,9 +71,28 @@ static INLINE vp9_prob merge_probs(vp9_prob pre_prob, return weighted_prob(pre_prob, prob, factor); } +// MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; +static const int count_to_update_factor[MODE_MV_COUNT_SAT + 1] = { + 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, + 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 +}; + +static INLINE vp9_prob mode_mv_merge_probs(vp9_prob pre_prob, + const unsigned int ct[2]) { + const unsigned int den = ct[0] + ct[1]; + if (den == 0) { + return pre_prob; + } else { + const unsigned int count = MIN(den, MODE_MV_COUNT_SAT); + const unsigned int factor = count_to_update_factor[count]; + const vp9_prob prob = + clip_prob(((int64_t)(ct[0]) * 256 + (den >> 1)) / den); + return weighted_prob(pre_prob, prob, factor); + } +} + void vp9_tree_merge_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs, - const unsigned int *counts, unsigned int count_sat, - unsigned int max_update_factor, vp9_prob *probs); + const unsigned int *counts, vp9_prob *probs); DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]); |