xref: /aosp_15_r20/external/libvpx/vp8/common/entropy.c (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 #include "entropy.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "blockd.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "onyxc_int.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "coefupdateprobs.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) = {
19*fb1b10abSAndroid Build Coastguard Worker   0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
20*fb1b10abSAndroid Build Coastguard Worker   3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
21*fb1b10abSAndroid Build Coastguard Worker   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22*fb1b10abSAndroid Build Coastguard Worker   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
23*fb1b10abSAndroid Build Coastguard Worker   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
24*fb1b10abSAndroid Build Coastguard Worker   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25*fb1b10abSAndroid Build Coastguard Worker   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26*fb1b10abSAndroid Build Coastguard Worker   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27*fb1b10abSAndroid Build Coastguard Worker   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28*fb1b10abSAndroid Build Coastguard Worker   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
29*fb1b10abSAndroid Build Coastguard Worker };
30*fb1b10abSAndroid Build Coastguard Worker 
31*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const unsigned char,
32*fb1b10abSAndroid Build Coastguard Worker                 vp8_coef_bands[16]) = { 0, 1, 2, 3, 6, 4, 5, 6,
33*fb1b10abSAndroid Build Coastguard Worker                                         6, 6, 6, 6, 6, 6, 6, 7 };
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const unsigned char,
36*fb1b10abSAndroid Build Coastguard Worker                 vp8_prev_token_class[MAX_ENTROPY_TOKENS]) = {
37*fb1b10abSAndroid Build Coastguard Worker   0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0
38*fb1b10abSAndroid Build Coastguard Worker };
39*fb1b10abSAndroid Build Coastguard Worker 
40*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) = {
41*fb1b10abSAndroid Build Coastguard Worker   0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15,
42*fb1b10abSAndroid Build Coastguard Worker };
43*fb1b10abSAndroid Build Coastguard Worker 
44*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const short,
45*fb1b10abSAndroid Build Coastguard Worker                 vp8_default_inv_zig_zag[16]) = { 1, 2, 6,  7,  3,  5,  8,  13,
46*fb1b10abSAndroid Build Coastguard Worker                                                  4, 9, 12, 14, 10, 11, 15, 16 };
47*fb1b10abSAndroid Build Coastguard Worker 
48*fb1b10abSAndroid Build Coastguard Worker /* vp8_default_zig_zag_mask generated with:
49*fb1b10abSAndroid Build Coastguard Worker 
50*fb1b10abSAndroid Build Coastguard Worker     void vp8_init_scan_order_mask()
51*fb1b10abSAndroid Build Coastguard Worker     {
52*fb1b10abSAndroid Build Coastguard Worker         int i;
53*fb1b10abSAndroid Build Coastguard Worker 
54*fb1b10abSAndroid Build Coastguard Worker         for (i = 0; i < 16; ++i)
55*fb1b10abSAndroid Build Coastguard Worker         {
56*fb1b10abSAndroid Build Coastguard Worker             vp8_default_zig_zag_mask[vp8_default_zig_zag1d[i]] = 1 << i;
57*fb1b10abSAndroid Build Coastguard Worker         }
58*fb1b10abSAndroid Build Coastguard Worker 
59*fb1b10abSAndroid Build Coastguard Worker     }
60*fb1b10abSAndroid Build Coastguard Worker */
61*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, const short, vp8_default_zig_zag_mask[16]) = {
62*fb1b10abSAndroid Build Coastguard Worker   1, 2, 32, 64, 4, 16, 128, 4096, 8, 256, 2048, 8192, 512, 1024, 16384, -32768
63*fb1b10abSAndroid Build Coastguard Worker };
64*fb1b10abSAndroid Build Coastguard Worker 
65*fb1b10abSAndroid Build Coastguard Worker const int vp8_mb_feature_data_bits[MB_LVL_MAX] = { 7, 6 };
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker /* Array indices are identical to previously-existing CONTEXT_NODE indices */
68*fb1b10abSAndroid Build Coastguard Worker /* corresponding _CONTEXT_NODEs */
69*fb1b10abSAndroid Build Coastguard Worker /* clang-format off */
70*fb1b10abSAndroid Build Coastguard Worker const vp8_tree_index vp8_coef_tree[22] = {
71*fb1b10abSAndroid Build Coastguard Worker   -DCT_EOB_TOKEN, 2,                       /* 0 = EOB */
72*fb1b10abSAndroid Build Coastguard Worker   -ZERO_TOKEN, 4,                          /* 1 = ZERO */
73*fb1b10abSAndroid Build Coastguard Worker   -ONE_TOKEN, 6,                           /* 2 = ONE */
74*fb1b10abSAndroid Build Coastguard Worker   8, 12,                                   /* 3 = LOW_VAL */
75*fb1b10abSAndroid Build Coastguard Worker   -TWO_TOKEN, 10,                          /* 4 = TWO */
76*fb1b10abSAndroid Build Coastguard Worker   -THREE_TOKEN, -FOUR_TOKEN,               /* 5 = THREE */
77*fb1b10abSAndroid Build Coastguard Worker   14, 16,                                  /* 6 = HIGH_LOW */
78*fb1b10abSAndroid Build Coastguard Worker   -DCT_VAL_CATEGORY1, -DCT_VAL_CATEGORY2,  /* 7 = CAT_ONE */
79*fb1b10abSAndroid Build Coastguard Worker   18, 20,                                  /* 8 = CAT_THREEFOUR */
80*fb1b10abSAndroid Build Coastguard Worker   -DCT_VAL_CATEGORY3, -DCT_VAL_CATEGORY4,  /* 9 = CAT_THREE */
81*fb1b10abSAndroid Build Coastguard Worker   -DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6   /* 10 = CAT_FIVE */
82*fb1b10abSAndroid Build Coastguard Worker };
83*fb1b10abSAndroid Build Coastguard Worker /* clang-format on */
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker /* vp8_coef_encodings generated with:
86*fb1b10abSAndroid Build Coastguard Worker     vp8_tokens_from_tree(vp8_coef_encodings, vp8_coef_tree);
87*fb1b10abSAndroid Build Coastguard Worker */
88*fb1b10abSAndroid Build Coastguard Worker vp8_token vp8_coef_encodings[MAX_ENTROPY_TOKENS] = {
89*fb1b10abSAndroid Build Coastguard Worker   { 2, 2 },  { 6, 3 },   { 28, 5 },  { 58, 6 },  { 59, 6 },  { 60, 6 },
90*fb1b10abSAndroid Build Coastguard Worker   { 61, 6 }, { 124, 7 }, { 125, 7 }, { 126, 7 }, { 127, 7 }, { 0, 1 }
91*fb1b10abSAndroid Build Coastguard Worker };
92*fb1b10abSAndroid Build Coastguard Worker 
93*fb1b10abSAndroid Build Coastguard Worker /* Trees for extra bits.  Probabilities are constant and
94*fb1b10abSAndroid Build Coastguard Worker    do not depend on previously encoded bits */
95*fb1b10abSAndroid Build Coastguard Worker 
96*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat1[] = { 159 };
97*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat2[] = { 165, 145 };
98*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat3[] = { 173, 148, 140 };
99*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat4[] = { 176, 155, 140, 135 };
100*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat5[] = { 180, 157, 141, 134, 130 };
101*fb1b10abSAndroid Build Coastguard Worker static const vp8_prob Pcat6[] = { 254, 254, 243, 230, 196, 177,
102*fb1b10abSAndroid Build Coastguard Worker                                   153, 140, 133, 130, 129 };
103*fb1b10abSAndroid Build Coastguard Worker 
104*fb1b10abSAndroid Build Coastguard Worker /* tree index tables generated with:
105*fb1b10abSAndroid Build Coastguard Worker 
106*fb1b10abSAndroid Build Coastguard Worker     void init_bit_tree(vp8_tree_index *p, int n) {
107*fb1b10abSAndroid Build Coastguard Worker       int i = 0;
108*fb1b10abSAndroid Build Coastguard Worker 
109*fb1b10abSAndroid Build Coastguard Worker       while (++i < n) {
110*fb1b10abSAndroid Build Coastguard Worker           p[0] = p[1] = i << 1;
111*fb1b10abSAndroid Build Coastguard Worker           p += 2;
112*fb1b10abSAndroid Build Coastguard Worker       }
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker       p[0] = p[1] = 0;
115*fb1b10abSAndroid Build Coastguard Worker     }
116*fb1b10abSAndroid Build Coastguard Worker 
117*fb1b10abSAndroid Build Coastguard Worker     void init_bit_trees(void) {
118*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat1, 1);
119*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat2, 2);
120*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat3, 3);
121*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat4, 4);
122*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat5, 5);
123*fb1b10abSAndroid Build Coastguard Worker       init_bit_tree(cat6, 11);
124*fb1b10abSAndroid Build Coastguard Worker     }
125*fb1b10abSAndroid Build Coastguard Worker */
126*fb1b10abSAndroid Build Coastguard Worker 
127*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat1[2] = { 0, 0 };
128*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat2[4] = { 2, 2, 0, 0 };
129*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat3[6] = { 2, 2, 4, 4, 0, 0 };
130*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat4[8] = { 2, 2, 4, 4, 6, 6, 0, 0 };
131*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat5[10] = { 2, 2, 4, 4, 6, 6, 8, 8, 0, 0 };
132*fb1b10abSAndroid Build Coastguard Worker static const vp8_tree_index cat6[22] = { 2,  2,  4,  4,  6,  6,  8,  8,
133*fb1b10abSAndroid Build Coastguard Worker                                          10, 10, 12, 12, 14, 14, 16, 16,
134*fb1b10abSAndroid Build Coastguard Worker                                          18, 18, 20, 20, 0,  0 };
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker const vp8_extra_bit_struct vp8_extra_bits[12] = {
137*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, 0 },         { 0, 0, 0, 1 },          { 0, 0, 0, 2 },
138*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, 3 },         { 0, 0, 0, 4 },          { cat1, Pcat1, 1, 5 },
139*fb1b10abSAndroid Build Coastguard Worker   { cat2, Pcat2, 2, 7 },  { cat3, Pcat3, 3, 11 },  { cat4, Pcat4, 4, 19 },
140*fb1b10abSAndroid Build Coastguard Worker   { cat5, Pcat5, 5, 35 }, { cat6, Pcat6, 11, 67 }, { 0, 0, 0, 0 }
141*fb1b10abSAndroid Build Coastguard Worker };
142*fb1b10abSAndroid Build Coastguard Worker 
143*fb1b10abSAndroid Build Coastguard Worker #include "default_coef_probs.h"
144*fb1b10abSAndroid Build Coastguard Worker 
vp8_default_coef_probs(VP8_COMMON * pc)145*fb1b10abSAndroid Build Coastguard Worker void vp8_default_coef_probs(VP8_COMMON *pc) {
146*fb1b10abSAndroid Build Coastguard Worker   memcpy(pc->fc.coef_probs, default_coef_probs, sizeof(default_coef_probs));
147*fb1b10abSAndroid Build Coastguard Worker }
148