vp9_prob.h 2.56 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  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.
John Koleszar's avatar
John Koleszar committed
9
10
 */

11
12
#ifndef VP9_COMMON_VP9_PROB_H_
#define VP9_COMMON_VP9_PROB_H_
John Koleszar's avatar
John Koleszar committed
13

14
#include "./vpx_config.h"
15
16
17

#include "vpx_ports/mem.h"

Dmitry Kovalev's avatar
Dmitry Kovalev committed
18
#include "vp9/common/vp9_common.h"
19

20
21
22
23
#ifdef __cplusplus
extern "C" {
#endif

24
typedef uint8_t vp9_prob;
John Koleszar's avatar
John Koleszar committed
25

26
27
#define MAX_PROB 255

28
#define vp9_prob_half ((vp9_prob) 128)
John Koleszar's avatar
John Koleszar committed
29

30
typedef int8_t vp9_tree_index;
John Koleszar's avatar
John Koleszar committed
31

32
33
#define TREE_SIZE(leaf_count) (2 * (leaf_count) - 2)

34
#define vp9_complement(x) (255 - x)
John Koleszar's avatar
John Koleszar committed
35
36

/* We build coding trees compactly in arrays.
37
   Each node of the tree is a pair of vp9_tree_indices.
John Koleszar's avatar
John Koleszar committed
38
39
40
41
42
   Array index often references a corresponding probability table.
   Index <= 0 means done encoding/decoding and value = -Index,
   Index > 0 means need another bit, specification at index.
   Nonnegative indices are always even;  processing begins at node 0. */

Dmitry Kovalev's avatar
Dmitry Kovalev committed
43
typedef const vp9_tree_index vp9_tree[];
John Koleszar's avatar
John Koleszar committed
44

45
static INLINE vp9_prob clip_prob(int p) {
46
  return (p > 255) ? 255 : (p < 1) ? 1 : p;
47
48
}

49
50
51
static INLINE vp9_prob get_prob(int num, int den) {
  return (den == 0) ? 128u : clip_prob(((int64_t)num * 256 + (den >> 1)) / den);
}
52

53
static INLINE vp9_prob get_binary_prob(int n0, int n1) {
54
55
56
  return get_prob(n0, n0 + n1);
}

57
/* This function assumes prob1 and prob2 are already within [1,255] range. */
58
static INLINE vp9_prob weighted_prob(int prob1, int prob2, int factor) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
59
  return ROUND_POWER_OF_TWO(prob1 * (256 - factor) + prob2 * factor, 8);
60
}
John Koleszar's avatar
John Koleszar committed
61

62
static INLINE vp9_prob merge_probs(vp9_prob pre_prob,
63
64
65
                                   const unsigned int ct[2],
                                   unsigned int count_sat,
                                   unsigned int max_update_factor) {
66
  const vp9_prob prob = get_binary_prob(ct[0], ct[1]);
67
68
69
70
71
  const unsigned int count = MIN(ct[0] + ct[1], count_sat);
  const unsigned int factor = max_update_factor * count / count_sat;
  return weighted_prob(pre_prob, prob, factor);
}

72
73
74
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);
75
76


77
DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]);
78

79
80
81
82
#ifdef __cplusplus
}  // extern "C"
#endif

83
#endif  // VP9_COMMON_VP9_PROB_H_