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