xref: /aosp_15_r20/external/libvpx/vp8/common/treecoder.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_COMMON_TREECODER_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_COMMON_TREECODER_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
15*fb1b10abSAndroid Build Coastguard Worker extern "C" {
16*fb1b10abSAndroid Build Coastguard Worker #endif
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker typedef unsigned char vp8bc_index_t; /* probability index */
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker typedef unsigned char vp8_prob;
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker #define vp8_prob_half ((vp8_prob)128)
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker typedef signed char vp8_tree_index;
25*fb1b10abSAndroid Build Coastguard Worker struct bool_coder_spec;
26*fb1b10abSAndroid Build Coastguard Worker 
27*fb1b10abSAndroid Build Coastguard Worker typedef struct bool_coder_spec bool_coder_spec;
28*fb1b10abSAndroid Build Coastguard Worker typedef struct bool_writer bool_writer;
29*fb1b10abSAndroid Build Coastguard Worker typedef struct bool_reader bool_reader;
30*fb1b10abSAndroid Build Coastguard Worker 
31*fb1b10abSAndroid Build Coastguard Worker typedef const bool_coder_spec c_bool_coder_spec;
32*fb1b10abSAndroid Build Coastguard Worker typedef const bool_writer c_bool_writer;
33*fb1b10abSAndroid Build Coastguard Worker typedef const bool_reader c_bool_reader;
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker #define vp8_complement(x) (255 - (x))
36*fb1b10abSAndroid Build Coastguard Worker 
37*fb1b10abSAndroid Build Coastguard Worker /* We build coding trees compactly in arrays.
38*fb1b10abSAndroid Build Coastguard Worker    Each node of the tree is a pair of vp8_tree_indices.
39*fb1b10abSAndroid Build Coastguard Worker    Array index often references a corresponding probability table.
40*fb1b10abSAndroid Build Coastguard Worker    Index <= 0 means done encoding/decoding and value = -Index,
41*fb1b10abSAndroid Build Coastguard Worker    Index > 0 means need another bit, specification at index.
42*fb1b10abSAndroid Build Coastguard Worker    Nonnegative indices are always even;  processing begins at node 0. */
43*fb1b10abSAndroid Build Coastguard Worker 
44*fb1b10abSAndroid Build Coastguard Worker typedef const vp8_tree_index vp8_tree[], *vp8_tree_p;
45*fb1b10abSAndroid Build Coastguard Worker 
46*fb1b10abSAndroid Build Coastguard Worker typedef const struct vp8_token_struct {
47*fb1b10abSAndroid Build Coastguard Worker   int value;
48*fb1b10abSAndroid Build Coastguard Worker   int Len;
49*fb1b10abSAndroid Build Coastguard Worker } vp8_token;
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker /* Construct encoding array from tree. */
52*fb1b10abSAndroid Build Coastguard Worker 
53*fb1b10abSAndroid Build Coastguard Worker void vp8_tokens_from_tree(struct vp8_token_struct *, vp8_tree);
54*fb1b10abSAndroid Build Coastguard Worker void vp8_tokens_from_tree_offset(struct vp8_token_struct *, vp8_tree,
55*fb1b10abSAndroid Build Coastguard Worker                                  int offset);
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker /* Convert array of token occurrence counts into a table of probabilities
58*fb1b10abSAndroid Build Coastguard Worker    for the associated binary encoding tree.  Also writes count of branches
59*fb1b10abSAndroid Build Coastguard Worker    taken for each node on the tree; this facilitiates decisions as to
60*fb1b10abSAndroid Build Coastguard Worker    probability updates. */
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker void vp8_tree_probs_from_distribution(int n, /* n = size of alphabet */
63*fb1b10abSAndroid Build Coastguard Worker                                       vp8_token tok[/* n */], vp8_tree tree,
64*fb1b10abSAndroid Build Coastguard Worker                                       vp8_prob probs[/* n-1 */],
65*fb1b10abSAndroid Build Coastguard Worker                                       unsigned int branch_ct[/* n-1 */][2],
66*fb1b10abSAndroid Build Coastguard Worker                                       const unsigned int num_events[/* n */],
67*fb1b10abSAndroid Build Coastguard Worker                                       unsigned int Pfactor, int Round);
68*fb1b10abSAndroid Build Coastguard Worker 
69*fb1b10abSAndroid Build Coastguard Worker /* Variant of above using coder spec rather than hardwired 8-bit probs. */
70*fb1b10abSAndroid Build Coastguard Worker 
71*fb1b10abSAndroid Build Coastguard Worker void vp8bc_tree_probs_from_distribution(int n, /* n = size of alphabet */
72*fb1b10abSAndroid Build Coastguard Worker                                         vp8_token tok[/* n */], vp8_tree tree,
73*fb1b10abSAndroid Build Coastguard Worker                                         vp8_prob probs[/* n-1 */],
74*fb1b10abSAndroid Build Coastguard Worker                                         unsigned int branch_ct[/* n-1 */][2],
75*fb1b10abSAndroid Build Coastguard Worker                                         const unsigned int num_events[/* n */],
76*fb1b10abSAndroid Build Coastguard Worker                                         c_bool_coder_spec *s);
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
79*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
80*fb1b10abSAndroid Build Coastguard Worker #endif
81*fb1b10abSAndroid Build Coastguard Worker 
82*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VP8_COMMON_TREECODER_H_
83