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
12#ifndef VP8_COMMON_TREECODER_H_
13#define VP8_COMMON_TREECODER_H_
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19typedef unsigned char vp8bc_index_t; /* probability index */
20
21
22typedef unsigned char vp8_prob;
23
24#define vp8_prob_half ( (vp8_prob) 128)
25
26typedef signed char vp8_tree_index;
27struct bool_coder_spec;
28
29typedef struct bool_coder_spec bool_coder_spec;
30typedef struct bool_writer bool_writer;
31typedef struct bool_reader bool_reader;
32
33typedef const bool_coder_spec c_bool_coder_spec;
34typedef const bool_writer c_bool_writer;
35typedef const bool_reader c_bool_reader;
36
37
38
39# define vp8_complement( x) (255 - x)
40
41
42/* We build coding trees compactly in arrays.
43   Each node of the tree is a pair of vp8_tree_indices.
44   Array index often references a corresponding probability table.
45   Index <= 0 means done encoding/decoding and value = -Index,
46   Index > 0 means need another bit, specification at index.
47   Nonnegative indices are always even;  processing begins at node 0. */
48
49typedef const vp8_tree_index vp8_tree[], *vp8_tree_p;
50
51
52typedef const struct vp8_token_struct
53{
54    int value;
55    int Len;
56} vp8_token;
57
58/* Construct encoding array from tree. */
59
60void vp8_tokens_from_tree(struct vp8_token_struct *, vp8_tree);
61void vp8_tokens_from_tree_offset(struct vp8_token_struct *, vp8_tree,
62                                 int offset);
63
64
65/* Convert array of token occurrence counts into a table of probabilities
66   for the associated binary encoding tree.  Also writes count of branches
67   taken for each node on the tree; this facilitiates decisions as to
68   probability updates. */
69
70void vp8_tree_probs_from_distribution(
71    int n,                      /* n = size of alphabet */
72    vp8_token tok               [ /* n */ ],
73    vp8_tree tree,
74    vp8_prob probs          [ /* n-1 */ ],
75    unsigned int branch_ct       [ /* n-1 */ ] [2],
76    const unsigned int num_events[ /* n */ ],
77    unsigned int Pfactor,
78    int Round
79);
80
81/* Variant of above using coder spec rather than hardwired 8-bit probs. */
82
83void vp8bc_tree_probs_from_distribution(
84    int n,                      /* n = size of alphabet */
85    vp8_token tok               [ /* n */ ],
86    vp8_tree tree,
87    vp8_prob probs          [ /* n-1 */ ],
88    unsigned int branch_ct       [ /* n-1 */ ] [2],
89    const unsigned int num_events[ /* n */ ],
90    c_bool_coder_spec *s
91);
92
93
94#ifdef __cplusplus
95}  // extern "C"
96#endif
97
98#endif  // VP8_COMMON_TREECODER_H_
99