Blame src/dsp/lossless_enc.c

Packit 9c6abc
// Copyright 2015 Google Inc. All Rights Reserved.
Packit 9c6abc
//
Packit 9c6abc
// Use of this source code is governed by a BSD-style license
Packit 9c6abc
// that can be found in the COPYING file in the root of the source
Packit 9c6abc
// tree. An additional intellectual property rights grant can be found
Packit 9c6abc
// in the file PATENTS. All contributing project authors may
Packit 9c6abc
// be found in the AUTHORS file in the root of the source tree.
Packit 9c6abc
// -----------------------------------------------------------------------------
Packit 9c6abc
//
Packit 9c6abc
// Image transform methods for lossless encoder.
Packit 9c6abc
//
Packit 9c6abc
// Authors: Vikas Arora (vikaas.arora@gmail.com)
Packit 9c6abc
//          Jyrki Alakuijala (jyrki@google.com)
Packit 9c6abc
//          Urvang Joshi (urvang@google.com)
Packit 9c6abc
Packit 9c6abc
#include "src/dsp/dsp.h"
Packit 9c6abc
Packit 9c6abc
#include <assert.h>
Packit 9c6abc
#include <math.h>
Packit 9c6abc
#include <stdlib.h>
Packit 9c6abc
#include "src/dec/vp8li_dec.h"
Packit 9c6abc
#include "src/utils/endian_inl_utils.h"
Packit 9c6abc
#include "src/dsp/lossless.h"
Packit 9c6abc
#include "src/dsp/lossless_common.h"
Packit 9c6abc
#include "src/dsp/yuv.h"
Packit 9c6abc
Packit 9c6abc
// lookup table for small values of log2(int)
Packit 9c6abc
const float kLog2Table[LOG_LOOKUP_IDX_MAX] = {
Packit 9c6abc
  0.0000000000000000f, 0.0000000000000000f,
Packit 9c6abc
  1.0000000000000000f, 1.5849625007211560f,
Packit 9c6abc
  2.0000000000000000f, 2.3219280948873621f,
Packit 9c6abc
  2.5849625007211560f, 2.8073549220576041f,
Packit 9c6abc
  3.0000000000000000f, 3.1699250014423121f,
Packit 9c6abc
  3.3219280948873621f, 3.4594316186372973f,
Packit 9c6abc
  3.5849625007211560f, 3.7004397181410921f,
Packit 9c6abc
  3.8073549220576041f, 3.9068905956085187f,
Packit 9c6abc
  4.0000000000000000f, 4.0874628412503390f,
Packit 9c6abc
  4.1699250014423121f, 4.2479275134435852f,
Packit 9c6abc
  4.3219280948873626f, 4.3923174227787606f,
Packit 9c6abc
  4.4594316186372973f, 4.5235619560570130f,
Packit 9c6abc
  4.5849625007211560f, 4.6438561897747243f,
Packit 9c6abc
  4.7004397181410917f, 4.7548875021634682f,
Packit 9c6abc
  4.8073549220576037f, 4.8579809951275718f,
Packit 9c6abc
  4.9068905956085187f, 4.9541963103868749f,
Packit 9c6abc
  5.0000000000000000f, 5.0443941193584533f,
Packit 9c6abc
  5.0874628412503390f, 5.1292830169449663f,
Packit 9c6abc
  5.1699250014423121f, 5.2094533656289501f,
Packit 9c6abc
  5.2479275134435852f, 5.2854022188622487f,
Packit 9c6abc
  5.3219280948873626f, 5.3575520046180837f,
Packit 9c6abc
  5.3923174227787606f, 5.4262647547020979f,
Packit 9c6abc
  5.4594316186372973f, 5.4918530963296747f,
Packit 9c6abc
  5.5235619560570130f, 5.5545888516776376f,
Packit 9c6abc
  5.5849625007211560f, 5.6147098441152083f,
Packit 9c6abc
  5.6438561897747243f, 5.6724253419714951f,
Packit 9c6abc
  5.7004397181410917f, 5.7279204545631987f,
Packit 9c6abc
  5.7548875021634682f, 5.7813597135246599f,
Packit 9c6abc
  5.8073549220576037f, 5.8328900141647412f,
Packit 9c6abc
  5.8579809951275718f, 5.8826430493618415f,
Packit 9c6abc
  5.9068905956085187f, 5.9307373375628866f,
Packit 9c6abc
  5.9541963103868749f, 5.9772799234999167f,
Packit 9c6abc
  6.0000000000000000f, 6.0223678130284543f,
Packit 9c6abc
  6.0443941193584533f, 6.0660891904577720f,
Packit 9c6abc
  6.0874628412503390f, 6.1085244567781691f,
Packit 9c6abc
  6.1292830169449663f, 6.1497471195046822f,
Packit 9c6abc
  6.1699250014423121f, 6.1898245588800175f,
Packit 9c6abc
  6.2094533656289501f, 6.2288186904958804f,
Packit 9c6abc
  6.2479275134435852f, 6.2667865406949010f,
Packit 9c6abc
  6.2854022188622487f, 6.3037807481771030f,
Packit 9c6abc
  6.3219280948873626f, 6.3398500028846243f,
Packit 9c6abc
  6.3575520046180837f, 6.3750394313469245f,
Packit 9c6abc
  6.3923174227787606f, 6.4093909361377017f,
Packit 9c6abc
  6.4262647547020979f, 6.4429434958487279f,
Packit 9c6abc
  6.4594316186372973f, 6.4757334309663976f,
Packit 9c6abc
  6.4918530963296747f, 6.5077946401986963f,
Packit 9c6abc
  6.5235619560570130f, 6.5391588111080309f,
Packit 9c6abc
  6.5545888516776376f, 6.5698556083309478f,
Packit 9c6abc
  6.5849625007211560f, 6.5999128421871278f,
Packit 9c6abc
  6.6147098441152083f, 6.6293566200796094f,
Packit 9c6abc
  6.6438561897747243f, 6.6582114827517946f,
Packit 9c6abc
  6.6724253419714951f, 6.6865005271832185f,
Packit 9c6abc
  6.7004397181410917f, 6.7142455176661224f,
Packit 9c6abc
  6.7279204545631987f, 6.7414669864011464f,
Packit 9c6abc
  6.7548875021634682f, 6.7681843247769259f,
Packit 9c6abc
  6.7813597135246599f, 6.7944158663501061f,
Packit 9c6abc
  6.8073549220576037f, 6.8201789624151878f,
Packit 9c6abc
  6.8328900141647412f, 6.8454900509443747f,
Packit 9c6abc
  6.8579809951275718f, 6.8703647195834047f,
Packit 9c6abc
  6.8826430493618415f, 6.8948177633079437f,
Packit 9c6abc
  6.9068905956085187f, 6.9188632372745946f,
Packit 9c6abc
  6.9307373375628866f, 6.9425145053392398f,
Packit 9c6abc
  6.9541963103868749f, 6.9657842846620869f,
Packit 9c6abc
  6.9772799234999167f, 6.9886846867721654f,
Packit 9c6abc
  7.0000000000000000f, 7.0112272554232539f,
Packit 9c6abc
  7.0223678130284543f, 7.0334230015374501f,
Packit 9c6abc
  7.0443941193584533f, 7.0552824355011898f,
Packit 9c6abc
  7.0660891904577720f, 7.0768155970508308f,
Packit 9c6abc
  7.0874628412503390f, 7.0980320829605263f,
Packit 9c6abc
  7.1085244567781691f, 7.1189410727235076f,
Packit 9c6abc
  7.1292830169449663f, 7.1395513523987936f,
Packit 9c6abc
  7.1497471195046822f, 7.1598713367783890f,
Packit 9c6abc
  7.1699250014423121f, 7.1799090900149344f,
Packit 9c6abc
  7.1898245588800175f, 7.1996723448363644f,
Packit 9c6abc
  7.2094533656289501f, 7.2191685204621611f,
Packit 9c6abc
  7.2288186904958804f, 7.2384047393250785f,
Packit 9c6abc
  7.2479275134435852f, 7.2573878426926521f,
Packit 9c6abc
  7.2667865406949010f, 7.2761244052742375f,
Packit 9c6abc
  7.2854022188622487f, 7.2946207488916270f,
Packit 9c6abc
  7.3037807481771030f, 7.3128829552843557f,
Packit 9c6abc
  7.3219280948873626f, 7.3309168781146167f,
Packit 9c6abc
  7.3398500028846243f, 7.3487281542310771f,
Packit 9c6abc
  7.3575520046180837f, 7.3663222142458160f,
Packit 9c6abc
  7.3750394313469245f, 7.3837042924740519f,
Packit 9c6abc
  7.3923174227787606f, 7.4008794362821843f,
Packit 9c6abc
  7.4093909361377017f, 7.4178525148858982f,
Packit 9c6abc
  7.4262647547020979f, 7.4346282276367245f,
Packit 9c6abc
  7.4429434958487279f, 7.4512111118323289f,
Packit 9c6abc
  7.4594316186372973f, 7.4676055500829976f,
Packit 9c6abc
  7.4757334309663976f, 7.4838157772642563f,
Packit 9c6abc
  7.4918530963296747f, 7.4998458870832056f,
Packit 9c6abc
  7.5077946401986963f, 7.5156998382840427f,
Packit 9c6abc
  7.5235619560570130f, 7.5313814605163118f,
Packit 9c6abc
  7.5391588111080309f, 7.5468944598876364f,
Packit 9c6abc
  7.5545888516776376f, 7.5622424242210728f,
Packit 9c6abc
  7.5698556083309478f, 7.5774288280357486f,
Packit 9c6abc
  7.5849625007211560f, 7.5924570372680806f,
Packit 9c6abc
  7.5999128421871278f, 7.6073303137496104f,
Packit 9c6abc
  7.6147098441152083f, 7.6220518194563764f,
Packit 9c6abc
  7.6293566200796094f, 7.6366246205436487f,
Packit 9c6abc
  7.6438561897747243f, 7.6510516911789281f,
Packit 9c6abc
  7.6582114827517946f, 7.6653359171851764f,
Packit 9c6abc
  7.6724253419714951f, 7.6794800995054464f,
Packit 9c6abc
  7.6865005271832185f, 7.6934869574993252f,
Packit 9c6abc
  7.7004397181410917f, 7.7073591320808825f,
Packit 9c6abc
  7.7142455176661224f, 7.7210991887071855f,
Packit 9c6abc
  7.7279204545631987f, 7.7347096202258383f,
Packit 9c6abc
  7.7414669864011464f, 7.7481928495894605f,
Packit 9c6abc
  7.7548875021634682f, 7.7615512324444795f,
Packit 9c6abc
  7.7681843247769259f, 7.7747870596011736f,
Packit 9c6abc
  7.7813597135246599f, 7.7879025593914317f,
Packit 9c6abc
  7.7944158663501061f, 7.8008998999203047f,
Packit 9c6abc
  7.8073549220576037f, 7.8137811912170374f,
Packit 9c6abc
  7.8201789624151878f, 7.8265484872909150f,
Packit 9c6abc
  7.8328900141647412f, 7.8392037880969436f,
Packit 9c6abc
  7.8454900509443747f, 7.8517490414160571f,
Packit 9c6abc
  7.8579809951275718f, 7.8641861446542797f,
Packit 9c6abc
  7.8703647195834047f, 7.8765169465649993f,
Packit 9c6abc
  7.8826430493618415f, 7.8887432488982591f,
Packit 9c6abc
  7.8948177633079437f, 7.9008668079807486f,
Packit 9c6abc
  7.9068905956085187f, 7.9128893362299619f,
Packit 9c6abc
  7.9188632372745946f, 7.9248125036057812f,
Packit 9c6abc
  7.9307373375628866f, 7.9366379390025709f,
Packit 9c6abc
  7.9425145053392398f, 7.9483672315846778f,
Packit 9c6abc
  7.9541963103868749f, 7.9600019320680805f,
Packit 9c6abc
  7.9657842846620869f, 7.9715435539507719f,
Packit 9c6abc
  7.9772799234999167f, 7.9829935746943103f,
Packit 9c6abc
  7.9886846867721654f, 7.9943534368588577f
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
const float kSLog2Table[LOG_LOOKUP_IDX_MAX] = {
Packit 9c6abc
  0.00000000f,    0.00000000f,  2.00000000f,   4.75488750f,
Packit 9c6abc
  8.00000000f,   11.60964047f,  15.50977500f,  19.65148445f,
Packit 9c6abc
  24.00000000f,  28.52932501f,  33.21928095f,  38.05374781f,
Packit 9c6abc
  43.01955001f,  48.10571634f,  53.30296891f,  58.60335893f,
Packit 9c6abc
  64.00000000f,  69.48686830f,  75.05865003f,  80.71062276f,
Packit 9c6abc
  86.43856190f,  92.23866588f,  98.10749561f,  104.04192499f,
Packit 9c6abc
  110.03910002f, 116.09640474f, 122.21143267f, 128.38196256f,
Packit 9c6abc
  134.60593782f, 140.88144886f, 147.20671787f, 153.58008562f,
Packit 9c6abc
  160.00000000f, 166.46500594f, 172.97373660f, 179.52490559f,
Packit 9c6abc
  186.11730005f, 192.74977453f, 199.42124551f, 206.13068654f,
Packit 9c6abc
  212.87712380f, 219.65963219f, 226.47733176f, 233.32938445f,
Packit 9c6abc
  240.21499122f, 247.13338933f, 254.08384998f, 261.06567603f,
Packit 9c6abc
  268.07820003f, 275.12078236f, 282.19280949f, 289.29369244f,
Packit 9c6abc
  296.42286534f, 303.57978409f, 310.76392512f, 317.97478424f,
Packit 9c6abc
  325.21187564f, 332.47473081f, 339.76289772f, 347.07593991f,
Packit 9c6abc
  354.41343574f, 361.77497759f, 369.16017124f, 376.56863518f,
Packit 9c6abc
  384.00000000f, 391.45390785f, 398.93001188f, 406.42797576f,
Packit 9c6abc
  413.94747321f, 421.48818752f, 429.04981119f, 436.63204548f,
Packit 9c6abc
  444.23460010f, 451.85719280f, 459.49954906f, 467.16140179f,
Packit 9c6abc
  474.84249102f, 482.54256363f, 490.26137307f, 497.99867911f,
Packit 9c6abc
  505.75424759f, 513.52785023f, 521.31926438f, 529.12827280f,
Packit 9c6abc
  536.95466351f, 544.79822957f, 552.65876890f, 560.53608414f,
Packit 9c6abc
  568.42998244f, 576.34027536f, 584.26677867f, 592.20931226f,
Packit 9c6abc
  600.16769996f, 608.14176943f, 616.13135206f, 624.13628279f,
Packit 9c6abc
  632.15640007f, 640.19154569f, 648.24156472f, 656.30630539f,
Packit 9c6abc
  664.38561898f, 672.47935976f, 680.58738488f, 688.70955430f,
Packit 9c6abc
  696.84573069f, 704.99577935f, 713.15956818f, 721.33696754f,
Packit 9c6abc
  729.52785023f, 737.73209140f, 745.94956849f, 754.18016116f,
Packit 9c6abc
  762.42375127f, 770.68022275f, 778.94946161f, 787.23135586f,
Packit 9c6abc
  795.52579543f, 803.83267219f, 812.15187982f, 820.48331383f,
Packit 9c6abc
  828.82687147f, 837.18245171f, 845.54995518f, 853.92928416f,
Packit 9c6abc
  862.32034249f, 870.72303558f, 879.13727036f, 887.56295522f,
Packit 9c6abc
  896.00000000f, 904.44831595f, 912.90781569f, 921.37841320f,
Packit 9c6abc
  929.86002376f, 938.35256392f, 946.85595152f, 955.37010560f,
Packit 9c6abc
  963.89494641f, 972.43039537f, 980.97637504f, 989.53280911f,
Packit 9c6abc
  998.09962237f, 1006.67674069f, 1015.26409097f, 1023.86160116f,
Packit 9c6abc
  1032.46920021f, 1041.08681805f, 1049.71438560f, 1058.35183469f,
Packit 9c6abc
  1066.99909811f, 1075.65610955f, 1084.32280357f, 1092.99911564f,
Packit 9c6abc
  1101.68498204f, 1110.38033993f, 1119.08512727f, 1127.79928282f,
Packit 9c6abc
  1136.52274614f, 1145.25545758f, 1153.99735821f, 1162.74838989f,
Packit 9c6abc
  1171.50849518f, 1180.27761738f, 1189.05570047f, 1197.84268914f,
Packit 9c6abc
  1206.63852876f, 1215.44316535f, 1224.25654560f, 1233.07861684f,
Packit 9c6abc
  1241.90932703f, 1250.74862473f, 1259.59645914f, 1268.45278005f,
Packit 9c6abc
  1277.31753781f, 1286.19068338f, 1295.07216828f, 1303.96194457f,
Packit 9c6abc
  1312.85996488f, 1321.76618236f, 1330.68055071f, 1339.60302413f,
Packit 9c6abc
  1348.53355734f, 1357.47210556f, 1366.41862452f, 1375.37307041f,
Packit 9c6abc
  1384.33539991f, 1393.30557020f, 1402.28353887f, 1411.26926400f,
Packit 9c6abc
  1420.26270412f, 1429.26381818f, 1438.27256558f, 1447.28890615f,
Packit 9c6abc
  1456.31280014f, 1465.34420819f, 1474.38309138f, 1483.42941118f,
Packit 9c6abc
  1492.48312945f, 1501.54420843f, 1510.61261078f, 1519.68829949f,
Packit 9c6abc
  1528.77123795f, 1537.86138993f, 1546.95871952f, 1556.06319119f,
Packit 9c6abc
  1565.17476976f, 1574.29342040f, 1583.41910860f, 1592.55180020f,
Packit 9c6abc
  1601.69146137f, 1610.83805860f, 1619.99155871f, 1629.15192882f,
Packit 9c6abc
  1638.31913637f, 1647.49314911f, 1656.67393509f, 1665.86146266f,
Packit 9c6abc
  1675.05570047f, 1684.25661744f, 1693.46418280f, 1702.67836605f,
Packit 9c6abc
  1711.89913698f, 1721.12646563f, 1730.36032233f, 1739.60067768f,
Packit 9c6abc
  1748.84750254f, 1758.10076802f, 1767.36044551f, 1776.62650662f,
Packit 9c6abc
  1785.89892323f, 1795.17766747f, 1804.46271172f, 1813.75402857f,
Packit 9c6abc
  1823.05159087f, 1832.35537170f, 1841.66534438f, 1850.98148244f,
Packit 9c6abc
  1860.30375965f, 1869.63214999f, 1878.96662767f, 1888.30716711f,
Packit 9c6abc
  1897.65374295f, 1907.00633003f, 1916.36490342f, 1925.72943838f,
Packit 9c6abc
  1935.09991037f, 1944.47629506f, 1953.85856831f, 1963.24670620f,
Packit 9c6abc
  1972.64068498f, 1982.04048108f, 1991.44607117f, 2000.85743204f,
Packit 9c6abc
  2010.27454072f, 2019.69737440f, 2029.12591044f, 2038.56012640f
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX] = {
Packit 9c6abc
  { 0, 0}, { 0, 0}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 1}, { 4, 1}, { 5, 1},
Packit 9c6abc
  { 5, 1}, { 6, 2}, { 6, 2}, { 6, 2}, { 6, 2}, { 7, 2}, { 7, 2}, { 7, 2},
Packit 9c6abc
  { 7, 2}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3},
Packit 9c6abc
  { 8, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3},
Packit 9c6abc
  { 9, 3}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
Packit 9c6abc
  {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
Packit 9c6abc
  {10, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
Packit 9c6abc
  {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
Packit 9c6abc
  {11, 4}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
Packit 9c6abc
  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
Packit 9c6abc
  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
Packit 9c6abc
  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
Packit 9c6abc
  {12, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
Packit 9c6abc
  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
Packit 9c6abc
  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
Packit 9c6abc
  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
Packit 9c6abc
  {13, 5}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
Packit 9c6abc
  {14, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
Packit 9c6abc
  {15, 6}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
Packit 9c6abc
  {16, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = {
Packit 9c6abc
   0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  0,  1,  2,  3,  4,  5,  6,  7,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
Packit 9c6abc
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
Packit 9c6abc
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
Packit 9c6abc
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
Packit 9c6abc
  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
Packit 9c6abc
  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
Packit 9c6abc
  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
Packit 9c6abc
  112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
Packit 9c6abc
  127,
Packit 9c6abc
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
Packit 9c6abc
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
Packit 9c6abc
  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
Packit 9c6abc
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
Packit 9c6abc
  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
Packit 9c6abc
  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
Packit 9c6abc
  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
Packit 9c6abc
  112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
static float FastSLog2Slow_C(uint32_t v) {
Packit 9c6abc
  assert(v >= LOG_LOOKUP_IDX_MAX);
Packit 9c6abc
  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
Packit 9c6abc
    int log_cnt = 0;
Packit 9c6abc
    uint32_t y = 1;
Packit 9c6abc
    int correction = 0;
Packit 9c6abc
    const float v_f = (float)v;
Packit 9c6abc
    const uint32_t orig_v = v;
Packit 9c6abc
    do {
Packit 9c6abc
      ++log_cnt;
Packit 9c6abc
      v = v >> 1;
Packit 9c6abc
      y = y << 1;
Packit 9c6abc
    } while (v >= LOG_LOOKUP_IDX_MAX);
Packit 9c6abc
    // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
Packit 9c6abc
    // Xf = floor(Xf) * (1 + (v % y) / v)
Packit 9c6abc
    // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
Packit 9c6abc
    // The correction factor: log(1 + d) ~ d; for very small d values, so
Packit 9c6abc
    // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v
Packit 9c6abc
    // LOG_2_RECIPROCAL ~ 23/16
Packit 9c6abc
    correction = (23 * (orig_v & (y - 1))) >> 4;
Packit 9c6abc
    return v_f * (kLog2Table[v] + log_cnt) + correction;
Packit 9c6abc
  } else {
Packit 9c6abc
    return (float)(LOG_2_RECIPROCAL * v * log((double)v));
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static float FastLog2Slow_C(uint32_t v) {
Packit 9c6abc
  assert(v >= LOG_LOOKUP_IDX_MAX);
Packit 9c6abc
  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
Packit 9c6abc
    int log_cnt = 0;
Packit 9c6abc
    uint32_t y = 1;
Packit 9c6abc
    const uint32_t orig_v = v;
Packit 9c6abc
    double log_2;
Packit 9c6abc
    do {
Packit 9c6abc
      ++log_cnt;
Packit 9c6abc
      v = v >> 1;
Packit 9c6abc
      y = y << 1;
Packit 9c6abc
    } while (v >= LOG_LOOKUP_IDX_MAX);
Packit 9c6abc
    log_2 = kLog2Table[v] + log_cnt;
Packit 9c6abc
    if (orig_v >= APPROX_LOG_MAX) {
Packit 9c6abc
      // Since the division is still expensive, add this correction factor only
Packit 9c6abc
      // for large values of 'v'.
Packit 9c6abc
      const int correction = (23 * (orig_v & (y - 1))) >> 4;
Packit 9c6abc
      log_2 += (double)correction / orig_v;
Packit 9c6abc
    }
Packit 9c6abc
    return (float)log_2;
Packit 9c6abc
  } else {
Packit 9c6abc
    return (float)(LOG_2_RECIPROCAL * log((double)v));
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
// Methods to calculate Entropy (Shannon).
Packit 9c6abc
Packit 9c6abc
// Compute the combined Shanon's entropy for distribution {X} and {X+Y}
Packit 9c6abc
static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
Packit 9c6abc
  int i;
Packit 9c6abc
  double retval = 0.;
Packit 9c6abc
  int sumX = 0, sumXY = 0;
Packit 9c6abc
  for (i = 0; i < 256; ++i) {
Packit 9c6abc
    const int x = X[i];
Packit 9c6abc
    if (x != 0) {
Packit 9c6abc
      const int xy = x + Y[i];
Packit 9c6abc
      sumX += x;
Packit 9c6abc
      retval -= VP8LFastSLog2(x);
Packit 9c6abc
      sumXY += xy;
Packit 9c6abc
      retval -= VP8LFastSLog2(xy);
Packit 9c6abc
    } else if (Y[i] != 0) {
Packit 9c6abc
      sumXY += Y[i];
Packit 9c6abc
      retval -= VP8LFastSLog2(Y[i]);
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
  retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
Packit 9c6abc
  return (float)retval;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
Packit 9c6abc
  entropy->entropy = 0.;
Packit 9c6abc
  entropy->sum = 0;
Packit 9c6abc
  entropy->nonzeros = 0;
Packit 9c6abc
  entropy->max_val = 0;
Packit 9c6abc
  entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
Packit 9c6abc
                              VP8LBitEntropy* const entropy) {
Packit 9c6abc
  int i;
Packit 9c6abc
Packit 9c6abc
  VP8LBitEntropyInit(entropy);
Packit 9c6abc
Packit 9c6abc
  for (i = 0; i < n; ++i) {
Packit 9c6abc
    if (array[i] != 0) {
Packit 9c6abc
      entropy->sum += array[i];
Packit 9c6abc
      entropy->nonzero_code = i;
Packit 9c6abc
      ++entropy->nonzeros;
Packit 9c6abc
      entropy->entropy -= VP8LFastSLog2(array[i]);
Packit 9c6abc
      if (entropy->max_val < array[i]) {
Packit 9c6abc
        entropy->max_val = array[i];
Packit 9c6abc
      }
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
  entropy->entropy += VP8LFastSLog2(entropy->sum);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE void GetEntropyUnrefinedHelper(
Packit 9c6abc
    uint32_t val, int i, uint32_t* const val_prev, int* const i_prev,
Packit 9c6abc
    VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) {
Packit 9c6abc
  const int streak = i - *i_prev;
Packit 9c6abc
Packit 9c6abc
  // Gather info for the bit entropy.
Packit 9c6abc
  if (*val_prev != 0) {
Packit 9c6abc
    bit_entropy->sum += (*val_prev) * streak;
Packit 9c6abc
    bit_entropy->nonzeros += streak;
Packit 9c6abc
    bit_entropy->nonzero_code = *i_prev;
Packit 9c6abc
    bit_entropy->entropy -= VP8LFastSLog2(*val_prev) * streak;
Packit 9c6abc
    if (bit_entropy->max_val < *val_prev) {
Packit 9c6abc
      bit_entropy->max_val = *val_prev;
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
Packit 9c6abc
  // Gather info for the Huffman cost.
Packit 9c6abc
  stats->counts[*val_prev != 0] += (streak > 3);
Packit 9c6abc
  stats->streaks[*val_prev != 0][(streak > 3)] += streak;
Packit 9c6abc
Packit 9c6abc
  *val_prev = val;
Packit 9c6abc
  *i_prev = i;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static void GetEntropyUnrefined_C(const uint32_t X[], int length,
Packit 9c6abc
                                  VP8LBitEntropy* const bit_entropy,
Packit 9c6abc
                                  VP8LStreaks* const stats) {
Packit 9c6abc
  int i;
Packit 9c6abc
  int i_prev = 0;
Packit 9c6abc
  uint32_t x_prev = X[0];
Packit 9c6abc
Packit 9c6abc
  memset(stats, 0, sizeof(*stats));
Packit 9c6abc
  VP8LBitEntropyInit(bit_entropy);
Packit 9c6abc
Packit 9c6abc
  for (i = 1; i < length; ++i) {
Packit 9c6abc
    const uint32_t x = X[i];
Packit 9c6abc
    if (x != x_prev) {
Packit 9c6abc
      GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats);
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
  GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats);
Packit 9c6abc
Packit 9c6abc
  bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static void GetCombinedEntropyUnrefined_C(const uint32_t X[],
Packit 9c6abc
                                          const uint32_t Y[],
Packit 9c6abc
                                          int length,
Packit 9c6abc
                                          VP8LBitEntropy* const bit_entropy,
Packit 9c6abc
                                          VP8LStreaks* const stats) {
Packit 9c6abc
  int i = 1;
Packit 9c6abc
  int i_prev = 0;
Packit 9c6abc
  uint32_t xy_prev = X[0] + Y[0];
Packit 9c6abc
Packit 9c6abc
  memset(stats, 0, sizeof(*stats));
Packit 9c6abc
  VP8LBitEntropyInit(bit_entropy);
Packit 9c6abc
Packit 9c6abc
  for (i = 1; i < length; ++i) {
Packit 9c6abc
    const uint32_t xy = X[i] + Y[i];
Packit 9c6abc
    if (xy != xy_prev) {
Packit 9c6abc
      GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats);
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
  GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats);
Packit 9c6abc
Packit 9c6abc
  bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
Packit 9c6abc
  int i;
Packit 9c6abc
  for (i = 0; i < num_pixels; ++i) {
Packit 9c6abc
    const int argb = argb_data[i];
Packit 9c6abc
    const int green = (argb >> 8) & 0xff;
Packit 9c6abc
    const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
Packit 9c6abc
    const uint32_t new_b = (((argb >>  0) & 0xff) - green) & 0xff;
Packit 9c6abc
    argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) {
Packit 9c6abc
  return ((int)color_pred * color) >> 5;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
Packit 9c6abc
                          int num_pixels) {
Packit 9c6abc
  int i;
Packit 9c6abc
  for (i = 0; i < num_pixels; ++i) {
Packit 9c6abc
    const uint32_t argb = data[i];
Packit 9c6abc
    const uint32_t green = argb >> 8;
Packit 9c6abc
    const uint32_t red = argb >> 16;
Packit 9c6abc
    int new_red = red & 0xff;
Packit 9c6abc
    int new_blue = argb & 0xff;
Packit 9c6abc
    new_red -= ColorTransformDelta(m->green_to_red_, green);
Packit 9c6abc
    new_red &= 0xff;
Packit 9c6abc
    new_blue -= ColorTransformDelta(m->green_to_blue_, green);
Packit 9c6abc
    new_blue -= ColorTransformDelta(m->red_to_blue_, red);
Packit 9c6abc
    new_blue &= 0xff;
Packit 9c6abc
    data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
Packit 9c6abc
                                             uint32_t argb) {
Packit 9c6abc
  const uint32_t green = argb >> 8;
Packit 9c6abc
  int new_red = argb >> 16;
Packit 9c6abc
  new_red -= ColorTransformDelta(green_to_red, green);
Packit 9c6abc
  return (new_red & 0xff);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
Packit 9c6abc
                                              uint8_t red_to_blue,
Packit 9c6abc
                                              uint32_t argb) {
Packit 9c6abc
  const uint32_t green = argb >> 8;
Packit 9c6abc
  const uint32_t red = argb >> 16;
Packit 9c6abc
  uint8_t new_blue = argb;
Packit 9c6abc
  new_blue -= ColorTransformDelta(green_to_blue, green);
Packit 9c6abc
  new_blue -= ColorTransformDelta(red_to_blue, red);
Packit 9c6abc
  return (new_blue & 0xff);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride,
Packit 9c6abc
                                     int tile_width, int tile_height,
Packit 9c6abc
                                     int green_to_red, int histo[]) {
Packit 9c6abc
  while (tile_height-- > 0) {
Packit 9c6abc
    int x;
Packit 9c6abc
    for (x = 0; x < tile_width; ++x) {
Packit 9c6abc
      ++histo[TransformColorRed(green_to_red, argb[x])];
Packit 9c6abc
    }
Packit 9c6abc
    argb += stride;
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride,
Packit 9c6abc
                                      int tile_width, int tile_height,
Packit 9c6abc
                                      int green_to_blue, int red_to_blue,
Packit 9c6abc
                                      int histo[]) {
Packit 9c6abc
  while (tile_height-- > 0) {
Packit 9c6abc
    int x;
Packit 9c6abc
    for (x = 0; x < tile_width; ++x) {
Packit 9c6abc
      ++histo[TransformColorBlue(green_to_blue, red_to_blue, argb[x])];
Packit 9c6abc
    }
Packit 9c6abc
    argb += stride;
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
static int VectorMismatch_C(const uint32_t* const array1,
Packit 9c6abc
                            const uint32_t* const array2, int length) {
Packit 9c6abc
  int match_len = 0;
Packit 9c6abc
Packit 9c6abc
  while (match_len < length && array1[match_len] == array2[match_len]) {
Packit 9c6abc
    ++match_len;
Packit 9c6abc
  }
Packit 9c6abc
  return match_len;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
// Bundles multiple (1, 2, 4 or 8) pixels into a single pixel.
Packit 9c6abc
void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
Packit 9c6abc
                          uint32_t* dst) {
Packit 9c6abc
  int x;
Packit 9c6abc
  if (xbits > 0) {
Packit 9c6abc
    const int bit_depth = 1 << (3 - xbits);
Packit 9c6abc
    const int mask = (1 << xbits) - 1;
Packit 9c6abc
    uint32_t code = 0xff000000;
Packit 9c6abc
    for (x = 0; x < width; ++x) {
Packit 9c6abc
      const int xsub = x & mask;
Packit 9c6abc
      if (xsub == 0) {
Packit 9c6abc
        code = 0xff000000;
Packit 9c6abc
      }
Packit 9c6abc
      code |= row[x] << (8 + bit_depth * xsub);
Packit 9c6abc
      dst[x >> xbits] = code;
Packit 9c6abc
    }
Packit 9c6abc
  } else {
Packit 9c6abc
    for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8);
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
static double ExtraCost_C(const uint32_t* population, int length) {
Packit 9c6abc
  int i;
Packit 9c6abc
  double cost = 0.;
Packit 9c6abc
  for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
Packit 9c6abc
  return cost;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
Packit 9c6abc
                                  int length) {
Packit 9c6abc
  int i;
Packit 9c6abc
  double cost = 0.;
Packit 9c6abc
  for (i = 2; i < length - 2; ++i) {
Packit 9c6abc
    const int xy = X[i + 2] + Y[i + 2];
Packit 9c6abc
    cost += (i >> 1) * xy;
Packit 9c6abc
  }
Packit 9c6abc
  return cost;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
static void HistogramAdd_C(const VP8LHistogram* const a,
Packit 9c6abc
                           const VP8LHistogram* const b,
Packit 9c6abc
                           VP8LHistogram* const out) {
Packit 9c6abc
  int i;
Packit 9c6abc
  const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
Packit 9c6abc
  assert(a->palette_code_bits_ == b->palette_code_bits_);
Packit 9c6abc
  if (b != out) {
Packit 9c6abc
    for (i = 0; i < literal_size; ++i) {
Packit 9c6abc
      out->literal_[i] = a->literal_[i] + b->literal_[i];
Packit 9c6abc
    }
Packit 9c6abc
    for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
Packit 9c6abc
      out->distance_[i] = a->distance_[i] + b->distance_[i];
Packit 9c6abc
    }
Packit 9c6abc
    for (i = 0; i < NUM_LITERAL_CODES; ++i) {
Packit 9c6abc
      out->red_[i] = a->red_[i] + b->red_[i];
Packit 9c6abc
      out->blue_[i] = a->blue_[i] + b->blue_[i];
Packit 9c6abc
      out->alpha_[i] = a->alpha_[i] + b->alpha_[i];
Packit 9c6abc
    }
Packit 9c6abc
  } else {
Packit 9c6abc
    for (i = 0; i < literal_size; ++i) {
Packit 9c6abc
      out->literal_[i] += a->literal_[i];
Packit 9c6abc
    }
Packit 9c6abc
    for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
Packit 9c6abc
      out->distance_[i] += a->distance_[i];
Packit 9c6abc
    }
Packit 9c6abc
    for (i = 0; i < NUM_LITERAL_CODES; ++i) {
Packit 9c6abc
      out->red_[i] += a->red_[i];
Packit 9c6abc
      out->blue_[i] += a->blue_[i];
Packit 9c6abc
      out->alpha_[i] += a->alpha_[i];
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
// Image transforms.
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) {
Packit 9c6abc
  return (((a0 ^ a1) & 0xfefefefeu) >> 1) + (a0 & a1);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) {
Packit 9c6abc
  return Average2(Average2(a0, a2), a1);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1,
Packit 9c6abc
                                     uint32_t a2, uint32_t a3) {
Packit 9c6abc
  return Average2(Average2(a0, a1), Average2(a2, a3));
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t Clip255(uint32_t a) {
Packit 9c6abc
  if (a < 256) {
Packit 9c6abc
    return a;
Packit 9c6abc
  }
Packit 9c6abc
  // return 0, when a is a negative integer.
Packit 9c6abc
  // return 255, when a is positive.
Packit 9c6abc
  return ~a >> 24;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
Packit 9c6abc
  return Clip255(a + b - c);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
Packit 9c6abc
                                                   uint32_t c2) {
Packit 9c6abc
  const int a = AddSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24);
Packit 9c6abc
  const int r = AddSubtractComponentFull((c0 >> 16) & 0xff,
Packit 9c6abc
                                         (c1 >> 16) & 0xff,
Packit 9c6abc
                                         (c2 >> 16) & 0xff);
Packit 9c6abc
  const int g = AddSubtractComponentFull((c0 >> 8) & 0xff,
Packit 9c6abc
                                         (c1 >> 8) & 0xff,
Packit 9c6abc
                                         (c2 >> 8) & 0xff);
Packit 9c6abc
  const int b = AddSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff);
Packit 9c6abc
  return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
Packit 9c6abc
  return Clip255(a + (a - b) / 2);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
Packit 9c6abc
                                                   uint32_t c2) {
Packit 9c6abc
  const uint32_t ave = Average2(c0, c1);
Packit 9c6abc
  const int a = AddSubtractComponentHalf(ave >> 24, c2 >> 24);
Packit 9c6abc
  const int r = AddSubtractComponentHalf((ave >> 16) & 0xff, (c2 >> 16) & 0xff);
Packit 9c6abc
  const int g = AddSubtractComponentHalf((ave >> 8) & 0xff, (c2 >> 8) & 0xff);
Packit 9c6abc
  const int b = AddSubtractComponentHalf((ave >> 0) & 0xff, (c2 >> 0) & 0xff);
Packit 9c6abc
  return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
// gcc-4.9 on ARM generates incorrect code in Select() when Sub3() is inlined.
Packit 9c6abc
#if defined(__arm__) && \
Packit 9c6abc
    (LOCAL_GCC_VERSION == 0x409 || LOCAL_GCC_VERSION == 0x408)
Packit 9c6abc
# define LOCAL_INLINE __attribute__ ((noinline))
Packit 9c6abc
#else
Packit 9c6abc
# define LOCAL_INLINE WEBP_INLINE
Packit 9c6abc
#endif
Packit 9c6abc
Packit 9c6abc
static LOCAL_INLINE int Sub3(int a, int b, int c) {
Packit 9c6abc
  const int pb = b - c;
Packit 9c6abc
  const int pa = a - c;
Packit 9c6abc
  return abs(pb) - abs(pa);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
#undef LOCAL_INLINE
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) {
Packit 9c6abc
  const int pa_minus_pb =
Packit 9c6abc
      Sub3((a >> 24)       , (b >> 24)       , (c >> 24)       ) +
Packit 9c6abc
      Sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) +
Packit 9c6abc
      Sub3((a >>  8) & 0xff, (b >>  8) & 0xff, (c >>  8) & 0xff) +
Packit 9c6abc
      Sub3((a      ) & 0xff, (b      ) & 0xff, (c      ) & 0xff);
Packit 9c6abc
  return (pa_minus_pb <= 0) ? a : b;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
// Predictors
Packit 9c6abc
Packit 9c6abc
static uint32_t Predictor2(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  (void)left;
Packit 9c6abc
  return top[0];
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor3(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  (void)left;
Packit 9c6abc
  return top[1];
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor4(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  (void)left;
Packit 9c6abc
  return top[-1];
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor5(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average3(left, top[0], top[1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor6(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average2(left, top[-1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor7(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average2(left, top[0]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor8(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average2(top[-1], top[0]);
Packit 9c6abc
  (void)left;
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor9(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average2(top[0], top[1]);
Packit 9c6abc
  (void)left;
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor10(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor11(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = Select(top[0], left, top[-1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor12(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
static uint32_t Predictor13(uint32_t left, const uint32_t* const top) {
Packit 9c6abc
  const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
Packit 9c6abc
  return pred;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
Packit 9c6abc
                            int num_pixels, uint32_t* out) {
Packit 9c6abc
  int i;
Packit 9c6abc
  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK);
Packit 9c6abc
  (void)upper;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
Packit 9c6abc
                            int num_pixels, uint32_t* out) {
Packit 9c6abc
  int i;
Packit 9c6abc
  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]);
Packit 9c6abc
  (void)upper;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor2, PredictorSub2_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor3, PredictorSub3_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor4, PredictorSub4_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor5, PredictorSub5_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor6, PredictorSub6_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor7, PredictorSub7_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor8, PredictorSub8_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor9, PredictorSub9_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor10, PredictorSub10_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor11, PredictorSub11_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor12, PredictorSub12_C)
Packit 9c6abc
GENERATE_PREDICTOR_SUB(Predictor13, PredictorSub13_C)
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
Packit 9c6abc
VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed;
Packit 9c6abc
Packit 9c6abc
VP8LTransformColorFunc VP8LTransformColor;
Packit 9c6abc
Packit 9c6abc
VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms;
Packit 9c6abc
VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms;
Packit 9c6abc
Packit 9c6abc
VP8LFastLog2SlowFunc VP8LFastLog2Slow;
Packit 9c6abc
VP8LFastLog2SlowFunc VP8LFastSLog2Slow;
Packit 9c6abc
Packit 9c6abc
VP8LCostFunc VP8LExtraCost;
Packit 9c6abc
VP8LCostCombinedFunc VP8LExtraCostCombined;
Packit 9c6abc
VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
Packit 9c6abc
Packit 9c6abc
VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
Packit 9c6abc
VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
Packit 9c6abc
Packit 9c6abc
VP8LHistogramAddFunc VP8LHistogramAdd;
Packit 9c6abc
Packit 9c6abc
VP8LVectorMismatchFunc VP8LVectorMismatch;
Packit 9c6abc
VP8LBundleColorMapFunc VP8LBundleColorMap;
Packit 9c6abc
Packit 9c6abc
VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
Packit 9c6abc
VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
Packit 9c6abc
Packit 9c6abc
extern void VP8LEncDspInitSSE2(void);
Packit 9c6abc
extern void VP8LEncDspInitSSE41(void);
Packit 9c6abc
extern void VP8LEncDspInitNEON(void);
Packit 9c6abc
extern void VP8LEncDspInitMIPS32(void);
Packit 9c6abc
extern void VP8LEncDspInitMIPSdspR2(void);
Packit 9c6abc
extern void VP8LEncDspInitMSA(void);
Packit 9c6abc
Packit 9c6abc
WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
Packit 9c6abc
  VP8LDspInit();
Packit 9c6abc
Packit 9c6abc
#if !WEBP_NEON_OMIT_C_CODE
Packit 9c6abc
  VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
Packit 9c6abc
Packit 9c6abc
  VP8LTransformColor = VP8LTransformColor_C;
Packit 9c6abc
#endif
Packit 9c6abc
Packit 9c6abc
  VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C;
Packit 9c6abc
  VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C;
Packit 9c6abc
Packit 9c6abc
  VP8LFastLog2Slow = FastLog2Slow_C;
Packit 9c6abc
  VP8LFastSLog2Slow = FastSLog2Slow_C;
Packit 9c6abc
Packit 9c6abc
  VP8LExtraCost = ExtraCost_C;
Packit 9c6abc
  VP8LExtraCostCombined = ExtraCostCombined_C;
Packit 9c6abc
  VP8LCombinedShannonEntropy = CombinedShannonEntropy_C;
Packit 9c6abc
Packit 9c6abc
  VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
Packit 9c6abc
  VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
Packit 9c6abc
Packit 9c6abc
  VP8LHistogramAdd = HistogramAdd_C;
Packit 9c6abc
Packit 9c6abc
  VP8LVectorMismatch = VectorMismatch_C;
Packit 9c6abc
  VP8LBundleColorMap = VP8LBundleColorMap_C;
Packit 9c6abc
Packit 9c6abc
  VP8LPredictorsSub[0] = PredictorSub0_C;
Packit 9c6abc
  VP8LPredictorsSub[1] = PredictorSub1_C;
Packit 9c6abc
  VP8LPredictorsSub[2] = PredictorSub2_C;
Packit 9c6abc
  VP8LPredictorsSub[3] = PredictorSub3_C;
Packit 9c6abc
  VP8LPredictorsSub[4] = PredictorSub4_C;
Packit 9c6abc
  VP8LPredictorsSub[5] = PredictorSub5_C;
Packit 9c6abc
  VP8LPredictorsSub[6] = PredictorSub6_C;
Packit 9c6abc
  VP8LPredictorsSub[7] = PredictorSub7_C;
Packit 9c6abc
  VP8LPredictorsSub[8] = PredictorSub8_C;
Packit 9c6abc
  VP8LPredictorsSub[9] = PredictorSub9_C;
Packit 9c6abc
  VP8LPredictorsSub[10] = PredictorSub10_C;
Packit 9c6abc
  VP8LPredictorsSub[11] = PredictorSub11_C;
Packit 9c6abc
  VP8LPredictorsSub[12] = PredictorSub12_C;
Packit 9c6abc
  VP8LPredictorsSub[13] = PredictorSub13_C;
Packit 9c6abc
  VP8LPredictorsSub[14] = PredictorSub0_C;  // <- padding security sentinels
Packit 9c6abc
  VP8LPredictorsSub[15] = PredictorSub0_C;
Packit 9c6abc
Packit 9c6abc
  VP8LPredictorsSub_C[0] = PredictorSub0_C;
Packit 9c6abc
  VP8LPredictorsSub_C[1] = PredictorSub1_C;
Packit 9c6abc
  VP8LPredictorsSub_C[2] = PredictorSub2_C;
Packit 9c6abc
  VP8LPredictorsSub_C[3] = PredictorSub3_C;
Packit 9c6abc
  VP8LPredictorsSub_C[4] = PredictorSub4_C;
Packit 9c6abc
  VP8LPredictorsSub_C[5] = PredictorSub5_C;
Packit 9c6abc
  VP8LPredictorsSub_C[6] = PredictorSub6_C;
Packit 9c6abc
  VP8LPredictorsSub_C[7] = PredictorSub7_C;
Packit 9c6abc
  VP8LPredictorsSub_C[8] = PredictorSub8_C;
Packit 9c6abc
  VP8LPredictorsSub_C[9] = PredictorSub9_C;
Packit 9c6abc
  VP8LPredictorsSub_C[10] = PredictorSub10_C;
Packit 9c6abc
  VP8LPredictorsSub_C[11] = PredictorSub11_C;
Packit 9c6abc
  VP8LPredictorsSub_C[12] = PredictorSub12_C;
Packit 9c6abc
  VP8LPredictorsSub_C[13] = PredictorSub13_C;
Packit 9c6abc
  VP8LPredictorsSub_C[14] = PredictorSub0_C;  // <- padding security sentinels
Packit 9c6abc
  VP8LPredictorsSub_C[15] = PredictorSub0_C;
Packit 9c6abc
Packit 9c6abc
  // If defined, use CPUInfo() to overwrite some pointers with faster versions.
Packit 9c6abc
  if (VP8GetCPUInfo != NULL) {
Packit 9c6abc
#if defined(WEBP_USE_SSE2)
Packit 9c6abc
    if (VP8GetCPUInfo(kSSE2)) {
Packit 9c6abc
      VP8LEncDspInitSSE2();
Packit 9c6abc
#if defined(WEBP_USE_SSE41)
Packit 9c6abc
      if (VP8GetCPUInfo(kSSE4_1)) {
Packit 9c6abc
        VP8LEncDspInitSSE41();
Packit 9c6abc
      }
Packit 9c6abc
#endif
Packit 9c6abc
    }
Packit 9c6abc
#endif
Packit 9c6abc
#if defined(WEBP_USE_MIPS32)
Packit 9c6abc
    if (VP8GetCPUInfo(kMIPS32)) {
Packit 9c6abc
      VP8LEncDspInitMIPS32();
Packit 9c6abc
    }
Packit 9c6abc
#endif
Packit 9c6abc
#if defined(WEBP_USE_MIPS_DSP_R2)
Packit 9c6abc
    if (VP8GetCPUInfo(kMIPSdspR2)) {
Packit 9c6abc
      VP8LEncDspInitMIPSdspR2();
Packit 9c6abc
    }
Packit 9c6abc
#endif
Packit 9c6abc
#if defined(WEBP_USE_MSA)
Packit 9c6abc
    if (VP8GetCPUInfo(kMSA)) {
Packit 9c6abc
      VP8LEncDspInitMSA();
Packit 9c6abc
    }
Packit 9c6abc
#endif
Packit 9c6abc
  }
Packit 9c6abc
Packit 9c6abc
#if defined(WEBP_USE_NEON)
Packit 9c6abc
  if (WEBP_NEON_OMIT_C_CODE ||
Packit 9c6abc
      (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
Packit 9c6abc
    VP8LEncDspInitNEON();
Packit 9c6abc
  }
Packit 9c6abc
#endif
Packit 9c6abc
Packit 9c6abc
  assert(VP8LSubtractGreenFromBlueAndRed != NULL);
Packit 9c6abc
  assert(VP8LTransformColor != NULL);
Packit 9c6abc
  assert(VP8LCollectColorBlueTransforms != NULL);
Packit 9c6abc
  assert(VP8LCollectColorRedTransforms != NULL);
Packit 9c6abc
  assert(VP8LFastLog2Slow != NULL);
Packit 9c6abc
  assert(VP8LFastSLog2Slow != NULL);
Packit 9c6abc
  assert(VP8LExtraCost != NULL);
Packit 9c6abc
  assert(VP8LExtraCostCombined != NULL);
Packit 9c6abc
  assert(VP8LCombinedShannonEntropy != NULL);
Packit 9c6abc
  assert(VP8LGetEntropyUnrefined != NULL);
Packit 9c6abc
  assert(VP8LGetCombinedEntropyUnrefined != NULL);
Packit 9c6abc
  assert(VP8LHistogramAdd != NULL);
Packit 9c6abc
  assert(VP8LVectorMismatch != NULL);
Packit 9c6abc
  assert(VP8LBundleColorMap != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[0] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[1] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[2] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[3] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[4] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[5] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[6] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[7] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[8] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[9] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[10] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[11] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[12] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[13] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[14] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub[15] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[0] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[1] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[2] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[3] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[4] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[5] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[6] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[7] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[8] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[9] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[10] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[11] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[12] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[13] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[14] != NULL);
Packit 9c6abc
  assert(VP8LPredictorsSub_C[15] != NULL);
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------