• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 Google Inc. All Rights Reserved.
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the COPYING file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS. All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 // -----------------------------------------------------------------------------
9 //
10 // Image transform methods for lossless encoder.
11 //
12 // Authors: Vikas Arora (vikaas.arora@gmail.com)
13 //          Jyrki Alakuijala (jyrki@google.com)
14 //          Urvang Joshi (urvang@google.com)
15 
16 #include "src/dsp/dsp.h"
17 
18 #include <assert.h>
19 #include <math.h>
20 #include <stdlib.h>
21 #include "src/dec/vp8li_dec.h"
22 #include "src/utils/endian_inl_utils.h"
23 #include "src/dsp/lossless.h"
24 #include "src/dsp/lossless_common.h"
25 #include "src/dsp/yuv.h"
26 
27 // lookup table for small values of log2(int)
28 const float kLog2Table[LOG_LOOKUP_IDX_MAX] = {
29   0.0000000000000000f, 0.0000000000000000f,
30   1.0000000000000000f, 1.5849625007211560f,
31   2.0000000000000000f, 2.3219280948873621f,
32   2.5849625007211560f, 2.8073549220576041f,
33   3.0000000000000000f, 3.1699250014423121f,
34   3.3219280948873621f, 3.4594316186372973f,
35   3.5849625007211560f, 3.7004397181410921f,
36   3.8073549220576041f, 3.9068905956085187f,
37   4.0000000000000000f, 4.0874628412503390f,
38   4.1699250014423121f, 4.2479275134435852f,
39   4.3219280948873626f, 4.3923174227787606f,
40   4.4594316186372973f, 4.5235619560570130f,
41   4.5849625007211560f, 4.6438561897747243f,
42   4.7004397181410917f, 4.7548875021634682f,
43   4.8073549220576037f, 4.8579809951275718f,
44   4.9068905956085187f, 4.9541963103868749f,
45   5.0000000000000000f, 5.0443941193584533f,
46   5.0874628412503390f, 5.1292830169449663f,
47   5.1699250014423121f, 5.2094533656289501f,
48   5.2479275134435852f, 5.2854022188622487f,
49   5.3219280948873626f, 5.3575520046180837f,
50   5.3923174227787606f, 5.4262647547020979f,
51   5.4594316186372973f, 5.4918530963296747f,
52   5.5235619560570130f, 5.5545888516776376f,
53   5.5849625007211560f, 5.6147098441152083f,
54   5.6438561897747243f, 5.6724253419714951f,
55   5.7004397181410917f, 5.7279204545631987f,
56   5.7548875021634682f, 5.7813597135246599f,
57   5.8073549220576037f, 5.8328900141647412f,
58   5.8579809951275718f, 5.8826430493618415f,
59   5.9068905956085187f, 5.9307373375628866f,
60   5.9541963103868749f, 5.9772799234999167f,
61   6.0000000000000000f, 6.0223678130284543f,
62   6.0443941193584533f, 6.0660891904577720f,
63   6.0874628412503390f, 6.1085244567781691f,
64   6.1292830169449663f, 6.1497471195046822f,
65   6.1699250014423121f, 6.1898245588800175f,
66   6.2094533656289501f, 6.2288186904958804f,
67   6.2479275134435852f, 6.2667865406949010f,
68   6.2854022188622487f, 6.3037807481771030f,
69   6.3219280948873626f, 6.3398500028846243f,
70   6.3575520046180837f, 6.3750394313469245f,
71   6.3923174227787606f, 6.4093909361377017f,
72   6.4262647547020979f, 6.4429434958487279f,
73   6.4594316186372973f, 6.4757334309663976f,
74   6.4918530963296747f, 6.5077946401986963f,
75   6.5235619560570130f, 6.5391588111080309f,
76   6.5545888516776376f, 6.5698556083309478f,
77   6.5849625007211560f, 6.5999128421871278f,
78   6.6147098441152083f, 6.6293566200796094f,
79   6.6438561897747243f, 6.6582114827517946f,
80   6.6724253419714951f, 6.6865005271832185f,
81   6.7004397181410917f, 6.7142455176661224f,
82   6.7279204545631987f, 6.7414669864011464f,
83   6.7548875021634682f, 6.7681843247769259f,
84   6.7813597135246599f, 6.7944158663501061f,
85   6.8073549220576037f, 6.8201789624151878f,
86   6.8328900141647412f, 6.8454900509443747f,
87   6.8579809951275718f, 6.8703647195834047f,
88   6.8826430493618415f, 6.8948177633079437f,
89   6.9068905956085187f, 6.9188632372745946f,
90   6.9307373375628866f, 6.9425145053392398f,
91   6.9541963103868749f, 6.9657842846620869f,
92   6.9772799234999167f, 6.9886846867721654f,
93   7.0000000000000000f, 7.0112272554232539f,
94   7.0223678130284543f, 7.0334230015374501f,
95   7.0443941193584533f, 7.0552824355011898f,
96   7.0660891904577720f, 7.0768155970508308f,
97   7.0874628412503390f, 7.0980320829605263f,
98   7.1085244567781691f, 7.1189410727235076f,
99   7.1292830169449663f, 7.1395513523987936f,
100   7.1497471195046822f, 7.1598713367783890f,
101   7.1699250014423121f, 7.1799090900149344f,
102   7.1898245588800175f, 7.1996723448363644f,
103   7.2094533656289501f, 7.2191685204621611f,
104   7.2288186904958804f, 7.2384047393250785f,
105   7.2479275134435852f, 7.2573878426926521f,
106   7.2667865406949010f, 7.2761244052742375f,
107   7.2854022188622487f, 7.2946207488916270f,
108   7.3037807481771030f, 7.3128829552843557f,
109   7.3219280948873626f, 7.3309168781146167f,
110   7.3398500028846243f, 7.3487281542310771f,
111   7.3575520046180837f, 7.3663222142458160f,
112   7.3750394313469245f, 7.3837042924740519f,
113   7.3923174227787606f, 7.4008794362821843f,
114   7.4093909361377017f, 7.4178525148858982f,
115   7.4262647547020979f, 7.4346282276367245f,
116   7.4429434958487279f, 7.4512111118323289f,
117   7.4594316186372973f, 7.4676055500829976f,
118   7.4757334309663976f, 7.4838157772642563f,
119   7.4918530963296747f, 7.4998458870832056f,
120   7.5077946401986963f, 7.5156998382840427f,
121   7.5235619560570130f, 7.5313814605163118f,
122   7.5391588111080309f, 7.5468944598876364f,
123   7.5545888516776376f, 7.5622424242210728f,
124   7.5698556083309478f, 7.5774288280357486f,
125   7.5849625007211560f, 7.5924570372680806f,
126   7.5999128421871278f, 7.6073303137496104f,
127   7.6147098441152083f, 7.6220518194563764f,
128   7.6293566200796094f, 7.6366246205436487f,
129   7.6438561897747243f, 7.6510516911789281f,
130   7.6582114827517946f, 7.6653359171851764f,
131   7.6724253419714951f, 7.6794800995054464f,
132   7.6865005271832185f, 7.6934869574993252f,
133   7.7004397181410917f, 7.7073591320808825f,
134   7.7142455176661224f, 7.7210991887071855f,
135   7.7279204545631987f, 7.7347096202258383f,
136   7.7414669864011464f, 7.7481928495894605f,
137   7.7548875021634682f, 7.7615512324444795f,
138   7.7681843247769259f, 7.7747870596011736f,
139   7.7813597135246599f, 7.7879025593914317f,
140   7.7944158663501061f, 7.8008998999203047f,
141   7.8073549220576037f, 7.8137811912170374f,
142   7.8201789624151878f, 7.8265484872909150f,
143   7.8328900141647412f, 7.8392037880969436f,
144   7.8454900509443747f, 7.8517490414160571f,
145   7.8579809951275718f, 7.8641861446542797f,
146   7.8703647195834047f, 7.8765169465649993f,
147   7.8826430493618415f, 7.8887432488982591f,
148   7.8948177633079437f, 7.9008668079807486f,
149   7.9068905956085187f, 7.9128893362299619f,
150   7.9188632372745946f, 7.9248125036057812f,
151   7.9307373375628866f, 7.9366379390025709f,
152   7.9425145053392398f, 7.9483672315846778f,
153   7.9541963103868749f, 7.9600019320680805f,
154   7.9657842846620869f, 7.9715435539507719f,
155   7.9772799234999167f, 7.9829935746943103f,
156   7.9886846867721654f, 7.9943534368588577f
157 };
158 
159 const float kSLog2Table[LOG_LOOKUP_IDX_MAX] = {
160   0.00000000f,    0.00000000f,  2.00000000f,   4.75488750f,
161   8.00000000f,   11.60964047f,  15.50977500f,  19.65148445f,
162   24.00000000f,  28.52932501f,  33.21928095f,  38.05374781f,
163   43.01955001f,  48.10571634f,  53.30296891f,  58.60335893f,
164   64.00000000f,  69.48686830f,  75.05865003f,  80.71062276f,
165   86.43856190f,  92.23866588f,  98.10749561f,  104.04192499f,
166   110.03910002f, 116.09640474f, 122.21143267f, 128.38196256f,
167   134.60593782f, 140.88144886f, 147.20671787f, 153.58008562f,
168   160.00000000f, 166.46500594f, 172.97373660f, 179.52490559f,
169   186.11730005f, 192.74977453f, 199.42124551f, 206.13068654f,
170   212.87712380f, 219.65963219f, 226.47733176f, 233.32938445f,
171   240.21499122f, 247.13338933f, 254.08384998f, 261.06567603f,
172   268.07820003f, 275.12078236f, 282.19280949f, 289.29369244f,
173   296.42286534f, 303.57978409f, 310.76392512f, 317.97478424f,
174   325.21187564f, 332.47473081f, 339.76289772f, 347.07593991f,
175   354.41343574f, 361.77497759f, 369.16017124f, 376.56863518f,
176   384.00000000f, 391.45390785f, 398.93001188f, 406.42797576f,
177   413.94747321f, 421.48818752f, 429.04981119f, 436.63204548f,
178   444.23460010f, 451.85719280f, 459.49954906f, 467.16140179f,
179   474.84249102f, 482.54256363f, 490.26137307f, 497.99867911f,
180   505.75424759f, 513.52785023f, 521.31926438f, 529.12827280f,
181   536.95466351f, 544.79822957f, 552.65876890f, 560.53608414f,
182   568.42998244f, 576.34027536f, 584.26677867f, 592.20931226f,
183   600.16769996f, 608.14176943f, 616.13135206f, 624.13628279f,
184   632.15640007f, 640.19154569f, 648.24156472f, 656.30630539f,
185   664.38561898f, 672.47935976f, 680.58738488f, 688.70955430f,
186   696.84573069f, 704.99577935f, 713.15956818f, 721.33696754f,
187   729.52785023f, 737.73209140f, 745.94956849f, 754.18016116f,
188   762.42375127f, 770.68022275f, 778.94946161f, 787.23135586f,
189   795.52579543f, 803.83267219f, 812.15187982f, 820.48331383f,
190   828.82687147f, 837.18245171f, 845.54995518f, 853.92928416f,
191   862.32034249f, 870.72303558f, 879.13727036f, 887.56295522f,
192   896.00000000f, 904.44831595f, 912.90781569f, 921.37841320f,
193   929.86002376f, 938.35256392f, 946.85595152f, 955.37010560f,
194   963.89494641f, 972.43039537f, 980.97637504f, 989.53280911f,
195   998.09962237f, 1006.67674069f, 1015.26409097f, 1023.86160116f,
196   1032.46920021f, 1041.08681805f, 1049.71438560f, 1058.35183469f,
197   1066.99909811f, 1075.65610955f, 1084.32280357f, 1092.99911564f,
198   1101.68498204f, 1110.38033993f, 1119.08512727f, 1127.79928282f,
199   1136.52274614f, 1145.25545758f, 1153.99735821f, 1162.74838989f,
200   1171.50849518f, 1180.27761738f, 1189.05570047f, 1197.84268914f,
201   1206.63852876f, 1215.44316535f, 1224.25654560f, 1233.07861684f,
202   1241.90932703f, 1250.74862473f, 1259.59645914f, 1268.45278005f,
203   1277.31753781f, 1286.19068338f, 1295.07216828f, 1303.96194457f,
204   1312.85996488f, 1321.76618236f, 1330.68055071f, 1339.60302413f,
205   1348.53355734f, 1357.47210556f, 1366.41862452f, 1375.37307041f,
206   1384.33539991f, 1393.30557020f, 1402.28353887f, 1411.26926400f,
207   1420.26270412f, 1429.26381818f, 1438.27256558f, 1447.28890615f,
208   1456.31280014f, 1465.34420819f, 1474.38309138f, 1483.42941118f,
209   1492.48312945f, 1501.54420843f, 1510.61261078f, 1519.68829949f,
210   1528.77123795f, 1537.86138993f, 1546.95871952f, 1556.06319119f,
211   1565.17476976f, 1574.29342040f, 1583.41910860f, 1592.55180020f,
212   1601.69146137f, 1610.83805860f, 1619.99155871f, 1629.15192882f,
213   1638.31913637f, 1647.49314911f, 1656.67393509f, 1665.86146266f,
214   1675.05570047f, 1684.25661744f, 1693.46418280f, 1702.67836605f,
215   1711.89913698f, 1721.12646563f, 1730.36032233f, 1739.60067768f,
216   1748.84750254f, 1758.10076802f, 1767.36044551f, 1776.62650662f,
217   1785.89892323f, 1795.17766747f, 1804.46271172f, 1813.75402857f,
218   1823.05159087f, 1832.35537170f, 1841.66534438f, 1850.98148244f,
219   1860.30375965f, 1869.63214999f, 1878.96662767f, 1888.30716711f,
220   1897.65374295f, 1907.00633003f, 1916.36490342f, 1925.72943838f,
221   1935.09991037f, 1944.47629506f, 1953.85856831f, 1963.24670620f,
222   1972.64068498f, 1982.04048108f, 1991.44607117f, 2000.85743204f,
223   2010.27454072f, 2019.69737440f, 2029.12591044f, 2038.56012640f
224 };
225 
226 const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX] = {
227   { 0, 0}, { 0, 0}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 1}, { 4, 1}, { 5, 1},
228   { 5, 1}, { 6, 2}, { 6, 2}, { 6, 2}, { 6, 2}, { 7, 2}, { 7, 2}, { 7, 2},
229   { 7, 2}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3},
230   { 8, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3},
231   { 9, 3}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
232   {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
233   {10, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
234   {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
235   {11, 4}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
236   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
237   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
238   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
239   {12, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
240   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
241   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
242   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
243   {13, 5}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
244   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
245   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
246   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
247   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
248   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
249   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
250   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
251   {14, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
252   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
253   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
254   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
255   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
256   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
257   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
258   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
259   {15, 6}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
260   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
261   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
262   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
263   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
264   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
265   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
266   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
267   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
268   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
269   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
270   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
271   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
272   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
273   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
274   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
275   {16, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
276   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
277   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
278   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
279   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
280   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
281   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
282   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
283   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
284   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
285   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
286   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
287   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
288   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
289   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
290   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
291 };
292 
293 const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = {
294    0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,
295    0,  1,  2,  3,  4,  5,  6,  7,  0,  1,  2,  3,  4,  5,  6,  7,
296    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
297    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
298    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
299   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
300    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
301   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
302    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
303   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
304   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
305   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
306    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
307   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
308   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
309   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
310    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
311   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
312   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
313   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
314   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
315   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
316   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
317   112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
318   127,
319    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
320   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
321   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
322   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
323   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
324   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
325   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
326   112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
327 };
328 
FastSLog2Slow_C(uint32_t v)329 static float FastSLog2Slow_C(uint32_t v) {
330   assert(v >= LOG_LOOKUP_IDX_MAX);
331   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
332     int log_cnt = 0;
333     uint32_t y = 1;
334     int correction = 0;
335     const float v_f = (float)v;
336     const uint32_t orig_v = v;
337     do {
338       ++log_cnt;
339       v = v >> 1;
340       y = y << 1;
341     } while (v >= LOG_LOOKUP_IDX_MAX);
342     // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
343     // Xf = floor(Xf) * (1 + (v % y) / v)
344     // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
345     // The correction factor: log(1 + d) ~ d; for very small d values, so
346     // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v
347     // LOG_2_RECIPROCAL ~ 23/16
348     correction = (23 * (orig_v & (y - 1))) >> 4;
349     return v_f * (kLog2Table[v] + log_cnt) + correction;
350   } else {
351     return (float)(LOG_2_RECIPROCAL * v * log((double)v));
352   }
353 }
354 
FastLog2Slow_C(uint32_t v)355 static float FastLog2Slow_C(uint32_t v) {
356   assert(v >= LOG_LOOKUP_IDX_MAX);
357   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
358     int log_cnt = 0;
359     uint32_t y = 1;
360     const uint32_t orig_v = v;
361     double log_2;
362     do {
363       ++log_cnt;
364       v = v >> 1;
365       y = y << 1;
366     } while (v >= LOG_LOOKUP_IDX_MAX);
367     log_2 = kLog2Table[v] + log_cnt;
368     if (orig_v >= APPROX_LOG_MAX) {
369       // Since the division is still expensive, add this correction factor only
370       // for large values of 'v'.
371       const int correction = (23 * (orig_v & (y - 1))) >> 4;
372       log_2 += (double)correction / orig_v;
373     }
374     return (float)log_2;
375   } else {
376     return (float)(LOG_2_RECIPROCAL * log((double)v));
377   }
378 }
379 
380 //------------------------------------------------------------------------------
381 // Methods to calculate Entropy (Shannon).
382 
383 // Compute the combined Shanon's entropy for distribution {X} and {X+Y}
CombinedShannonEntropy_C(const int X[256],const int Y[256])384 static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
385   int i;
386   double retval = 0.;
387   int sumX = 0, sumXY = 0;
388   for (i = 0; i < 256; ++i) {
389     const int x = X[i];
390     if (x != 0) {
391       const int xy = x + Y[i];
392       sumX += x;
393       retval -= VP8LFastSLog2(x);
394       sumXY += xy;
395       retval -= VP8LFastSLog2(xy);
396     } else if (Y[i] != 0) {
397       sumXY += Y[i];
398       retval -= VP8LFastSLog2(Y[i]);
399     }
400   }
401   retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
402   return (float)retval;
403 }
404 
VP8LBitEntropyInit(VP8LBitEntropy * const entropy)405 void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
406   entropy->entropy = 0.;
407   entropy->sum = 0;
408   entropy->nonzeros = 0;
409   entropy->max_val = 0;
410   entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM;
411 }
412 
VP8LBitsEntropyUnrefined(const uint32_t * const array,int n,VP8LBitEntropy * const entropy)413 void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
414                               VP8LBitEntropy* const entropy) {
415   int i;
416 
417   VP8LBitEntropyInit(entropy);
418 
419   for (i = 0; i < n; ++i) {
420     if (array[i] != 0) {
421       entropy->sum += array[i];
422       entropy->nonzero_code = i;
423       ++entropy->nonzeros;
424       entropy->entropy -= VP8LFastSLog2(array[i]);
425       if (entropy->max_val < array[i]) {
426         entropy->max_val = array[i];
427       }
428     }
429   }
430   entropy->entropy += VP8LFastSLog2(entropy->sum);
431 }
432 
GetEntropyUnrefinedHelper(uint32_t val,int i,uint32_t * const val_prev,int * const i_prev,VP8LBitEntropy * const bit_entropy,VP8LStreaks * const stats)433 static WEBP_INLINE void GetEntropyUnrefinedHelper(
434     uint32_t val, int i, uint32_t* const val_prev, int* const i_prev,
435     VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) {
436   const int streak = i - *i_prev;
437 
438   // Gather info for the bit entropy.
439   if (*val_prev != 0) {
440     bit_entropy->sum += (*val_prev) * streak;
441     bit_entropy->nonzeros += streak;
442     bit_entropy->nonzero_code = *i_prev;
443     bit_entropy->entropy -= VP8LFastSLog2(*val_prev) * streak;
444     if (bit_entropy->max_val < *val_prev) {
445       bit_entropy->max_val = *val_prev;
446     }
447   }
448 
449   // Gather info for the Huffman cost.
450   stats->counts[*val_prev != 0] += (streak > 3);
451   stats->streaks[*val_prev != 0][(streak > 3)] += streak;
452 
453   *val_prev = val;
454   *i_prev = i;
455 }
456 
GetEntropyUnrefined_C(const uint32_t X[],int length,VP8LBitEntropy * const bit_entropy,VP8LStreaks * const stats)457 static void GetEntropyUnrefined_C(const uint32_t X[], int length,
458                                   VP8LBitEntropy* const bit_entropy,
459                                   VP8LStreaks* const stats) {
460   int i;
461   int i_prev = 0;
462   uint32_t x_prev = X[0];
463 
464   memset(stats, 0, sizeof(*stats));
465   VP8LBitEntropyInit(bit_entropy);
466 
467   for (i = 1; i < length; ++i) {
468     const uint32_t x = X[i];
469     if (x != x_prev) {
470       GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats);
471     }
472   }
473   GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats);
474 
475   bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
476 }
477 
GetCombinedEntropyUnrefined_C(const uint32_t X[],const uint32_t Y[],int length,VP8LBitEntropy * const bit_entropy,VP8LStreaks * const stats)478 static void GetCombinedEntropyUnrefined_C(const uint32_t X[],
479                                           const uint32_t Y[],
480                                           int length,
481                                           VP8LBitEntropy* const bit_entropy,
482                                           VP8LStreaks* const stats) {
483   int i = 1;
484   int i_prev = 0;
485   uint32_t xy_prev = X[0] + Y[0];
486 
487   memset(stats, 0, sizeof(*stats));
488   VP8LBitEntropyInit(bit_entropy);
489 
490   for (i = 1; i < length; ++i) {
491     const uint32_t xy = X[i] + Y[i];
492     if (xy != xy_prev) {
493       GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats);
494     }
495   }
496   GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats);
497 
498   bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
499 }
500 
501 //------------------------------------------------------------------------------
502 
VP8LSubtractGreenFromBlueAndRed_C(uint32_t * argb_data,int num_pixels)503 void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
504   int i;
505   for (i = 0; i < num_pixels; ++i) {
506     const int argb = argb_data[i];
507     const int green = (argb >> 8) & 0xff;
508     const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
509     const uint32_t new_b = (((argb >>  0) & 0xff) - green) & 0xff;
510     argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
511   }
512 }
513 
ColorTransformDelta(int8_t color_pred,int8_t color)514 static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) {
515   return ((int)color_pred * color) >> 5;
516 }
517 
U32ToS8(uint32_t v)518 static WEBP_INLINE int8_t U32ToS8(uint32_t v) {
519   return (int8_t)(v & 0xff);
520 }
521 
VP8LTransformColor_C(const VP8LMultipliers * const m,uint32_t * data,int num_pixels)522 void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
523                           int num_pixels) {
524   int i;
525   for (i = 0; i < num_pixels; ++i) {
526     const uint32_t argb = data[i];
527     const int8_t green = U32ToS8(argb >>  8);
528     const int8_t red   = U32ToS8(argb >> 16);
529     int new_red = red & 0xff;
530     int new_blue = argb & 0xff;
531     new_red -= ColorTransformDelta(m->green_to_red_, green);
532     new_red &= 0xff;
533     new_blue -= ColorTransformDelta(m->green_to_blue_, green);
534     new_blue -= ColorTransformDelta(m->red_to_blue_, red);
535     new_blue &= 0xff;
536     data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
537   }
538 }
539 
TransformColorRed(uint8_t green_to_red,uint32_t argb)540 static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
541                                              uint32_t argb) {
542   const int8_t green = U32ToS8(argb >> 8);
543   int new_red = argb >> 16;
544   new_red -= ColorTransformDelta(green_to_red, green);
545   return (new_red & 0xff);
546 }
547 
TransformColorBlue(uint8_t green_to_blue,uint8_t red_to_blue,uint32_t argb)548 static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
549                                               uint8_t red_to_blue,
550                                               uint32_t argb) {
551   const int8_t green = U32ToS8(argb >>  8);
552   const int8_t red   = U32ToS8(argb >> 16);
553   uint8_t new_blue = argb & 0xff;
554   new_blue -= ColorTransformDelta(green_to_blue, green);
555   new_blue -= ColorTransformDelta(red_to_blue, red);
556   return (new_blue & 0xff);
557 }
558 
VP8LCollectColorRedTransforms_C(const uint32_t * argb,int stride,int tile_width,int tile_height,int green_to_red,int histo[])559 void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride,
560                                      int tile_width, int tile_height,
561                                      int green_to_red, int histo[]) {
562   while (tile_height-- > 0) {
563     int x;
564     for (x = 0; x < tile_width; ++x) {
565       ++histo[TransformColorRed((uint8_t)green_to_red, argb[x])];
566     }
567     argb += stride;
568   }
569 }
570 
VP8LCollectColorBlueTransforms_C(const uint32_t * argb,int stride,int tile_width,int tile_height,int green_to_blue,int red_to_blue,int histo[])571 void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride,
572                                       int tile_width, int tile_height,
573                                       int green_to_blue, int red_to_blue,
574                                       int histo[]) {
575   while (tile_height-- > 0) {
576     int x;
577     for (x = 0; x < tile_width; ++x) {
578       ++histo[TransformColorBlue((uint8_t)green_to_blue, (uint8_t)red_to_blue,
579                                  argb[x])];
580     }
581     argb += stride;
582   }
583 }
584 
585 //------------------------------------------------------------------------------
586 
VectorMismatch_C(const uint32_t * const array1,const uint32_t * const array2,int length)587 static int VectorMismatch_C(const uint32_t* const array1,
588                             const uint32_t* const array2, int length) {
589   int match_len = 0;
590 
591   while (match_len < length && array1[match_len] == array2[match_len]) {
592     ++match_len;
593   }
594   return match_len;
595 }
596 
597 // Bundles multiple (1, 2, 4 or 8) pixels into a single pixel.
VP8LBundleColorMap_C(const uint8_t * const row,int width,int xbits,uint32_t * dst)598 void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
599                           uint32_t* dst) {
600   int x;
601   if (xbits > 0) {
602     const int bit_depth = 1 << (3 - xbits);
603     const int mask = (1 << xbits) - 1;
604     uint32_t code = 0xff000000;
605     for (x = 0; x < width; ++x) {
606       const int xsub = x & mask;
607       if (xsub == 0) {
608         code = 0xff000000;
609       }
610       code |= row[x] << (8 + bit_depth * xsub);
611       dst[x >> xbits] = code;
612     }
613   } else {
614     for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8);
615   }
616 }
617 
618 //------------------------------------------------------------------------------
619 
ExtraCost_C(const uint32_t * population,int length)620 static double ExtraCost_C(const uint32_t* population, int length) {
621   int i;
622   double cost = 0.;
623   for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
624   return cost;
625 }
626 
ExtraCostCombined_C(const uint32_t * X,const uint32_t * Y,int length)627 static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
628                                   int length) {
629   int i;
630   double cost = 0.;
631   for (i = 2; i < length - 2; ++i) {
632     const int xy = X[i + 2] + Y[i + 2];
633     cost += (i >> 1) * xy;
634   }
635   return cost;
636 }
637 
638 //------------------------------------------------------------------------------
639 
AddVector_C(const uint32_t * a,const uint32_t * b,uint32_t * out,int size)640 static void AddVector_C(const uint32_t* a, const uint32_t* b, uint32_t* out,
641                         int size) {
642   int i;
643   for (i = 0; i < size; ++i) out[i] = a[i] + b[i];
644 }
645 
AddVectorEq_C(const uint32_t * a,uint32_t * out,int size)646 static void AddVectorEq_C(const uint32_t* a, uint32_t* out, int size) {
647   int i;
648   for (i = 0; i < size; ++i) out[i] += a[i];
649 }
650 
651 #define ADD(X, ARG, LEN) do {                                                  \
652   if (a->is_used_[X]) {                                                        \
653     if (b->is_used_[X]) {                                                      \
654       VP8LAddVector(a->ARG, b->ARG, out->ARG, (LEN));                          \
655     } else {                                                                   \
656       memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0]));           \
657     }                                                                          \
658   } else if (b->is_used_[X]) {                                                 \
659     memcpy(&out->ARG[0], &b->ARG[0], (LEN) * sizeof(out->ARG[0]));             \
660   } else {                                                                     \
661     memset(&out->ARG[0], 0, (LEN) * sizeof(out->ARG[0]));                      \
662   }                                                                            \
663 } while (0)
664 
665 #define ADD_EQ(X, ARG, LEN) do {                                               \
666   if (a->is_used_[X]) {                                                        \
667     if (out->is_used_[X]) {                                                    \
668       VP8LAddVectorEq(a->ARG, out->ARG, (LEN));                                \
669     } else {                                                                   \
670       memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0]));           \
671     }                                                                          \
672   }                                                                            \
673 } while (0)
674 
VP8LHistogramAdd(const VP8LHistogram * const a,const VP8LHistogram * const b,VP8LHistogram * const out)675 void VP8LHistogramAdd(const VP8LHistogram* const a,
676                       const VP8LHistogram* const b, VP8LHistogram* const out) {
677   int i;
678   const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
679   assert(a->palette_code_bits_ == b->palette_code_bits_);
680 
681   if (b != out) {
682     ADD(0, literal_, literal_size);
683     ADD(1, red_, NUM_LITERAL_CODES);
684     ADD(2, blue_, NUM_LITERAL_CODES);
685     ADD(3, alpha_, NUM_LITERAL_CODES);
686     ADD(4, distance_, NUM_DISTANCE_CODES);
687     for (i = 0; i < 5; ++i) {
688       out->is_used_[i] = (a->is_used_[i] | b->is_used_[i]);
689     }
690   } else {
691     ADD_EQ(0, literal_, literal_size);
692     ADD_EQ(1, red_, NUM_LITERAL_CODES);
693     ADD_EQ(2, blue_, NUM_LITERAL_CODES);
694     ADD_EQ(3, alpha_, NUM_LITERAL_CODES);
695     ADD_EQ(4, distance_, NUM_DISTANCE_CODES);
696     for (i = 0; i < 5; ++i) out->is_used_[i] |= a->is_used_[i];
697   }
698 }
699 #undef ADD
700 #undef ADD_EQ
701 
702 //------------------------------------------------------------------------------
703 // Image transforms.
704 
PredictorSub0_C(const uint32_t * in,const uint32_t * upper,int num_pixels,uint32_t * out)705 static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
706                             int num_pixels, uint32_t* out) {
707   int i;
708   for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK);
709   (void)upper;
710 }
711 
PredictorSub1_C(const uint32_t * in,const uint32_t * upper,int num_pixels,uint32_t * out)712 static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
713                             int num_pixels, uint32_t* out) {
714   int i;
715   for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]);
716   (void)upper;
717 }
718 
719 // It subtracts the prediction from the input pixel and stores the residual
720 // in the output pixel.
721 #define GENERATE_PREDICTOR_SUB(PREDICTOR_I)                                \
722 static void PredictorSub##PREDICTOR_I##_C(const uint32_t* in,              \
723                                           const uint32_t* upper,           \
724                                           int num_pixels, uint32_t* out) { \
725   int x;                                                                   \
726   assert(upper != NULL);                                                   \
727   for (x = 0; x < num_pixels; ++x) {                                       \
728     const uint32_t pred =                                                  \
729         VP8LPredictor##PREDICTOR_I##_C(in[x - 1], upper + x);              \
730     out[x] = VP8LSubPixels(in[x], pred);                                   \
731   }                                                                        \
732 }
733 
734 GENERATE_PREDICTOR_SUB(2)
735 GENERATE_PREDICTOR_SUB(3)
736 GENERATE_PREDICTOR_SUB(4)
737 GENERATE_PREDICTOR_SUB(5)
738 GENERATE_PREDICTOR_SUB(6)
739 GENERATE_PREDICTOR_SUB(7)
740 GENERATE_PREDICTOR_SUB(8)
741 GENERATE_PREDICTOR_SUB(9)
742 GENERATE_PREDICTOR_SUB(10)
743 GENERATE_PREDICTOR_SUB(11)
744 GENERATE_PREDICTOR_SUB(12)
745 GENERATE_PREDICTOR_SUB(13)
746 
747 //------------------------------------------------------------------------------
748 
749 VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed;
750 
751 VP8LTransformColorFunc VP8LTransformColor;
752 
753 VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms;
754 VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms;
755 
756 VP8LFastLog2SlowFunc VP8LFastLog2Slow;
757 VP8LFastLog2SlowFunc VP8LFastSLog2Slow;
758 
759 VP8LCostFunc VP8LExtraCost;
760 VP8LCostCombinedFunc VP8LExtraCostCombined;
761 VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
762 
763 VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
764 VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
765 
766 VP8LAddVectorFunc VP8LAddVector;
767 VP8LAddVectorEqFunc VP8LAddVectorEq;
768 
769 VP8LVectorMismatchFunc VP8LVectorMismatch;
770 VP8LBundleColorMapFunc VP8LBundleColorMap;
771 
772 VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
773 VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
774 
775 extern void VP8LEncDspInitSSE2(void);
776 extern void VP8LEncDspInitSSE41(void);
777 extern void VP8LEncDspInitNEON(void);
778 extern void VP8LEncDspInitMIPS32(void);
779 extern void VP8LEncDspInitMIPSdspR2(void);
780 extern void VP8LEncDspInitMSA(void);
781 
WEBP_DSP_INIT_FUNC(VP8LEncDspInit)782 WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
783   VP8LDspInit();
784 
785 #if !WEBP_NEON_OMIT_C_CODE
786   VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
787 
788   VP8LTransformColor = VP8LTransformColor_C;
789 #endif
790 
791   VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C;
792   VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C;
793 
794   VP8LFastLog2Slow = FastLog2Slow_C;
795   VP8LFastSLog2Slow = FastSLog2Slow_C;
796 
797   VP8LExtraCost = ExtraCost_C;
798   VP8LExtraCostCombined = ExtraCostCombined_C;
799   VP8LCombinedShannonEntropy = CombinedShannonEntropy_C;
800 
801   VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
802   VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
803 
804   VP8LAddVector = AddVector_C;
805   VP8LAddVectorEq = AddVectorEq_C;
806 
807   VP8LVectorMismatch = VectorMismatch_C;
808   VP8LBundleColorMap = VP8LBundleColorMap_C;
809 
810   VP8LPredictorsSub[0] = PredictorSub0_C;
811   VP8LPredictorsSub[1] = PredictorSub1_C;
812   VP8LPredictorsSub[2] = PredictorSub2_C;
813   VP8LPredictorsSub[3] = PredictorSub3_C;
814   VP8LPredictorsSub[4] = PredictorSub4_C;
815   VP8LPredictorsSub[5] = PredictorSub5_C;
816   VP8LPredictorsSub[6] = PredictorSub6_C;
817   VP8LPredictorsSub[7] = PredictorSub7_C;
818   VP8LPredictorsSub[8] = PredictorSub8_C;
819   VP8LPredictorsSub[9] = PredictorSub9_C;
820   VP8LPredictorsSub[10] = PredictorSub10_C;
821   VP8LPredictorsSub[11] = PredictorSub11_C;
822   VP8LPredictorsSub[12] = PredictorSub12_C;
823   VP8LPredictorsSub[13] = PredictorSub13_C;
824   VP8LPredictorsSub[14] = PredictorSub0_C;  // <- padding security sentinels
825   VP8LPredictorsSub[15] = PredictorSub0_C;
826 
827   VP8LPredictorsSub_C[0] = PredictorSub0_C;
828   VP8LPredictorsSub_C[1] = PredictorSub1_C;
829   VP8LPredictorsSub_C[2] = PredictorSub2_C;
830   VP8LPredictorsSub_C[3] = PredictorSub3_C;
831   VP8LPredictorsSub_C[4] = PredictorSub4_C;
832   VP8LPredictorsSub_C[5] = PredictorSub5_C;
833   VP8LPredictorsSub_C[6] = PredictorSub6_C;
834   VP8LPredictorsSub_C[7] = PredictorSub7_C;
835   VP8LPredictorsSub_C[8] = PredictorSub8_C;
836   VP8LPredictorsSub_C[9] = PredictorSub9_C;
837   VP8LPredictorsSub_C[10] = PredictorSub10_C;
838   VP8LPredictorsSub_C[11] = PredictorSub11_C;
839   VP8LPredictorsSub_C[12] = PredictorSub12_C;
840   VP8LPredictorsSub_C[13] = PredictorSub13_C;
841   VP8LPredictorsSub_C[14] = PredictorSub0_C;  // <- padding security sentinels
842   VP8LPredictorsSub_C[15] = PredictorSub0_C;
843 
844   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
845   if (VP8GetCPUInfo != NULL) {
846 #if defined(WEBP_USE_SSE2)
847     if (VP8GetCPUInfo(kSSE2)) {
848       VP8LEncDspInitSSE2();
849 #if defined(WEBP_USE_SSE41)
850       if (VP8GetCPUInfo(kSSE4_1)) {
851         VP8LEncDspInitSSE41();
852       }
853 #endif
854     }
855 #endif
856 #if defined(WEBP_USE_MIPS32)
857     if (VP8GetCPUInfo(kMIPS32)) {
858       VP8LEncDspInitMIPS32();
859     }
860 #endif
861 #if defined(WEBP_USE_MIPS_DSP_R2)
862     if (VP8GetCPUInfo(kMIPSdspR2)) {
863       VP8LEncDspInitMIPSdspR2();
864     }
865 #endif
866 #if defined(WEBP_USE_MSA)
867     if (VP8GetCPUInfo(kMSA)) {
868       VP8LEncDspInitMSA();
869     }
870 #endif
871   }
872 
873 #if defined(WEBP_USE_NEON)
874   if (WEBP_NEON_OMIT_C_CODE ||
875       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
876     VP8LEncDspInitNEON();
877   }
878 #endif
879 
880   assert(VP8LSubtractGreenFromBlueAndRed != NULL);
881   assert(VP8LTransformColor != NULL);
882   assert(VP8LCollectColorBlueTransforms != NULL);
883   assert(VP8LCollectColorRedTransforms != NULL);
884   assert(VP8LFastLog2Slow != NULL);
885   assert(VP8LFastSLog2Slow != NULL);
886   assert(VP8LExtraCost != NULL);
887   assert(VP8LExtraCostCombined != NULL);
888   assert(VP8LCombinedShannonEntropy != NULL);
889   assert(VP8LGetEntropyUnrefined != NULL);
890   assert(VP8LGetCombinedEntropyUnrefined != NULL);
891   assert(VP8LAddVector != NULL);
892   assert(VP8LAddVectorEq != NULL);
893   assert(VP8LVectorMismatch != NULL);
894   assert(VP8LBundleColorMap != NULL);
895   assert(VP8LPredictorsSub[0] != NULL);
896   assert(VP8LPredictorsSub[1] != NULL);
897   assert(VP8LPredictorsSub[2] != NULL);
898   assert(VP8LPredictorsSub[3] != NULL);
899   assert(VP8LPredictorsSub[4] != NULL);
900   assert(VP8LPredictorsSub[5] != NULL);
901   assert(VP8LPredictorsSub[6] != NULL);
902   assert(VP8LPredictorsSub[7] != NULL);
903   assert(VP8LPredictorsSub[8] != NULL);
904   assert(VP8LPredictorsSub[9] != NULL);
905   assert(VP8LPredictorsSub[10] != NULL);
906   assert(VP8LPredictorsSub[11] != NULL);
907   assert(VP8LPredictorsSub[12] != NULL);
908   assert(VP8LPredictorsSub[13] != NULL);
909   assert(VP8LPredictorsSub[14] != NULL);
910   assert(VP8LPredictorsSub[15] != NULL);
911   assert(VP8LPredictorsSub_C[0] != NULL);
912   assert(VP8LPredictorsSub_C[1] != NULL);
913   assert(VP8LPredictorsSub_C[2] != NULL);
914   assert(VP8LPredictorsSub_C[3] != NULL);
915   assert(VP8LPredictorsSub_C[4] != NULL);
916   assert(VP8LPredictorsSub_C[5] != NULL);
917   assert(VP8LPredictorsSub_C[6] != NULL);
918   assert(VP8LPredictorsSub_C[7] != NULL);
919   assert(VP8LPredictorsSub_C[8] != NULL);
920   assert(VP8LPredictorsSub_C[9] != NULL);
921   assert(VP8LPredictorsSub_C[10] != NULL);
922   assert(VP8LPredictorsSub_C[11] != NULL);
923   assert(VP8LPredictorsSub_C[12] != NULL);
924   assert(VP8LPredictorsSub_C[13] != NULL);
925   assert(VP8LPredictorsSub_C[14] != NULL);
926   assert(VP8LPredictorsSub_C[15] != NULL);
927 }
928 
929 //------------------------------------------------------------------------------
930