libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

dct_scales.h (12557B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #ifndef LIB_JXL_DCT_SCALES_H_
      7 #define LIB_JXL_DCT_SCALES_H_
      8 
      9 // Scaling factors.
     10 
     11 #include <stddef.h>
     12 
     13 namespace jxl {
     14 
     15 static constexpr float kSqrt2 = 1.41421356237f;
     16 static constexpr float kSqrt0_5 = 0.70710678118f;
     17 
     18 // For n != 0, the n-th basis function of a N-DCT, evaluated in pixel k, has a
     19 // value of cos((k+1/2) n/(2N) pi). When downsampling by 2x, we average
     20 // the values for pixel k and k+1 to get the value for pixel (k/2), thus we get
     21 //
     22 // [cos((k+1/2) n/N pi) + cos((k+3/2) n/N pi)]/2 =
     23 // cos(n/(2N) pi) cos((k+1) n/N pi) =
     24 // cos(n/(2N) pi) cos(((k/2)+1/2) n/(N/2) pi)
     25 //
     26 // which is exactly the same as the value of pixel k/2 of a N/2-sized DCT,
     27 // except for the cos(n/(2N) pi) scaling factor (which does *not*
     28 // depend on the pixel). Thus, when using the lower-frequency coefficients of a
     29 // DCT-N to compute a DCT-(N/2), they should be scaled by this constant. Scaling
     30 // factors for a DCT-(N/4) etc can then be obtained by successive
     31 // multiplications. The structs below contain the above-mentioned scaling
     32 // factors.
     33 //
     34 // Python code for the tables below:
     35 //
     36 // for i in range(N // 8):
     37 //    v = math.cos(i / (2 * N) * math.pi)
     38 //    v *= math.cos(i / (N) * math.pi)
     39 //    v *= math.cos(i / (N / 2) * math.pi)
     40 //    print(v, end=", ")
     41 
     42 template <size_t FROM, size_t TO>
     43 struct DCTResampleScales;
     44 
     45 template <>
     46 struct DCTResampleScales<8, 1> {
     47   static constexpr float kScales[] = {
     48       1.000000000000000000,
     49   };
     50 };
     51 
     52 template <>
     53 struct DCTResampleScales<16, 2> {
     54   static constexpr float kScales[] = {
     55       1.000000000000000000,
     56       0.901764195028874394,
     57   };
     58 };
     59 
     60 template <>
     61 struct DCTResampleScales<32, 4> {
     62   static constexpr float kScales[] = {
     63       1.000000000000000000,
     64       0.974886821136879522,
     65       0.901764195028874394,
     66       0.787054918159101335,
     67   };
     68 };
     69 
     70 template <>
     71 struct DCTResampleScales<64, 8> {
     72   static constexpr float kScales[] = {
     73       1.0000000000000000, 0.9936866130906366, 0.9748868211368796,
     74       0.9440180941651672, 0.9017641950288744, 0.8490574973847023,
     75       0.7870549181591013, 0.7171081282466044,
     76   };
     77 };
     78 
     79 template <>
     80 struct DCTResampleScales<128, 16> {
     81   static constexpr float kScales[] = {
     82       1.0,
     83       0.9984194528776054,
     84       0.9936866130906366,
     85       0.9858278282666936,
     86       0.9748868211368796,
     87       0.9609244059440204,
     88       0.9440180941651672,
     89       0.9242615922757944,
     90       0.9017641950288744,
     91       0.8766500784429904,
     92       0.8490574973847023,
     93       0.8191378932865928,
     94       0.7870549181591013,
     95       0.7529833816270532,
     96       0.7171081282466044,
     97       0.6796228528314651,
     98   };
     99 };
    100 
    101 template <>
    102 struct DCTResampleScales<256, 32> {
    103   static constexpr float kScales[] = {
    104       1.0,
    105       0.9996047255830407,
    106       0.9984194528776054,
    107       0.9964458326264695,
    108       0.9936866130906366,
    109       0.9901456355893141,
    110       0.9858278282666936,
    111       0.9807391980963174,
    112       0.9748868211368796,
    113       0.9682788310563117,
    114       0.9609244059440204,
    115       0.9528337534340876,
    116       0.9440180941651672,
    117       0.9344896436056892,
    118       0.9242615922757944,
    119       0.913348084400198,
    120       0.9017641950288744,
    121       0.8895259056651056,
    122       0.8766500784429904,
    123       0.8631544288990163,
    124       0.8490574973847023,
    125       0.8343786191696513,
    126       0.8191378932865928,
    127       0.8033561501721485,
    128       0.7870549181591013,
    129       0.7702563888779096,
    130       0.7529833816270532,
    131       0.7352593067735488,
    132       0.7171081282466044,
    133       0.6985543251889097,
    134       0.6796228528314651,
    135       0.6603391026591464,
    136   };
    137 };
    138 
    139 // Inverses of the above.
    140 template <>
    141 struct DCTResampleScales<1, 8> {
    142   static constexpr float kScales[] = {
    143       1.000000000000000000,
    144   };
    145 };
    146 
    147 template <>
    148 struct DCTResampleScales<2, 16> {
    149   static constexpr float kScales[] = {
    150       1.000000000000000000,
    151       1.108937353592731823,
    152   };
    153 };
    154 
    155 template <>
    156 struct DCTResampleScales<4, 32> {
    157   static constexpr float kScales[] = {
    158       1.000000000000000000,
    159       1.025760096781116015,
    160       1.108937353592731823,
    161       1.270559368765487251,
    162   };
    163 };
    164 
    165 template <>
    166 struct DCTResampleScales<8, 64> {
    167   static constexpr float kScales[] = {
    168       1.0000000000000000, 1.0063534990068217, 1.0257600967811158,
    169       1.0593017296817173, 1.1089373535927318, 1.1777765381970435,
    170       1.2705593687654873, 1.3944898413647777,
    171   };
    172 };
    173 
    174 template <>
    175 struct DCTResampleScales<16, 128> {
    176   static constexpr float kScales[] = {
    177       1.0,
    178       1.0015830492062623,
    179       1.0063534990068217,
    180       1.0143759095928793,
    181       1.0257600967811158,
    182       1.0406645869480142,
    183       1.0593017296817173,
    184       1.0819447744633812,
    185       1.1089373535927318,
    186       1.1407059950032632,
    187       1.1777765381970435,
    188       1.2207956782315876,
    189       1.2705593687654873,
    190       1.3280505578213306,
    191       1.3944898413647777,
    192       1.4714043176061107,
    193   };
    194 };
    195 
    196 template <>
    197 struct DCTResampleScales<32, 256> {
    198   static constexpr float kScales[] = {
    199       1.0,
    200       1.0003954307206069,
    201       1.0015830492062623,
    202       1.0035668445360069,
    203       1.0063534990068217,
    204       1.009952439375063,
    205       1.0143759095928793,
    206       1.0196390660647288,
    207       1.0257600967811158,
    208       1.0327603660498115,
    209       1.0406645869480142,
    210       1.049501024072585,
    211       1.0593017296817173,
    212       1.0701028169146336,
    213       1.0819447744633812,
    214       1.0948728278734026,
    215       1.1089373535927318,
    216       1.124194353004584,
    217       1.1407059950032632,
    218       1.158541237256391,
    219       1.1777765381970435,
    220       1.1984966740820495,
    221       1.2207956782315876,
    222       1.244777922949508,
    223       1.2705593687654873,
    224       1.2982690107339132,
    225       1.3280505578213306,
    226       1.3600643892400104,
    227       1.3944898413647777,
    228       1.4315278911623237,
    229       1.4714043176061107,
    230       1.5143734423314616,
    231   };
    232 };
    233 
    234 // Constants for DCT implementation. Generated by the following snippet:
    235 // for i in range(N // 2):
    236 //    print(1.0 / (2 * math.cos((i + 0.5) * math.pi / N)), end=", ")
    237 template <size_t N>
    238 struct WcMultipliers;
    239 
    240 template <>
    241 struct WcMultipliers<4> {
    242   static constexpr float kMultipliers[] = {
    243       0.541196100146197,
    244       1.3065629648763764,
    245   };
    246 };
    247 
    248 template <>
    249 struct WcMultipliers<8> {
    250   static constexpr float kMultipliers[] = {
    251       0.5097955791041592,
    252       0.6013448869350453,
    253       0.8999762231364156,
    254       2.5629154477415055,
    255   };
    256 };
    257 
    258 template <>
    259 struct WcMultipliers<16> {
    260   static constexpr float kMultipliers[] = {
    261       0.5024192861881557, 0.5224986149396889, 0.5669440348163577,
    262       0.6468217833599901, 0.7881546234512502, 1.060677685990347,
    263       1.7224470982383342, 5.101148618689155,
    264   };
    265 };
    266 
    267 template <>
    268 struct WcMultipliers<32> {
    269   static constexpr float kMultipliers[] = {
    270       0.5006029982351963, 0.5054709598975436, 0.5154473099226246,
    271       0.5310425910897841, 0.5531038960344445, 0.5829349682061339,
    272       0.6225041230356648, 0.6748083414550057, 0.7445362710022986,
    273       0.8393496454155268, 0.9725682378619608, 1.1694399334328847,
    274       1.4841646163141662, 2.057781009953411,  3.407608418468719,
    275       10.190008123548033,
    276   };
    277 };
    278 template <>
    279 struct WcMultipliers<64> {
    280   static constexpr float kMultipliers[] = {
    281       0.500150636020651,  0.5013584524464084, 0.5037887256810443,
    282       0.5074711720725553, 0.5124514794082247, 0.5187927131053328,
    283       0.52657731515427,   0.535909816907992,  0.5469204379855088,
    284       0.5597698129470802, 0.57465518403266,   0.5918185358574165,
    285       0.6115573478825099, 0.6342389366884031, 0.6603198078137061,
    286       0.6903721282002123, 0.7251205223771985, 0.7654941649730891,
    287       0.8127020908144905, 0.8683447152233481, 0.9345835970364075,
    288       1.0144082649970547, 1.1120716205797176, 1.233832737976571,
    289       1.3892939586328277, 1.5939722833856311, 1.8746759800084078,
    290       2.282050068005162,  2.924628428158216,  4.084611078129248,
    291       6.796750711673633,  20.373878167231453,
    292   };
    293 };
    294 template <>
    295 struct WcMultipliers<128> {
    296   static constexpr float kMultipliers[] = {
    297       0.5000376519155477, 0.5003390374428216, 0.5009427176380873,
    298       0.5018505174842379, 0.5030651913013697, 0.5045904432216454,
    299       0.5064309549285542, 0.5085924210498143, 0.5110815927066812,
    300       0.5139063298475396, 0.5170756631334912, 0.5205998663018917,
    301       0.524490540114724,  0.5287607092074876, 0.5334249333971333,
    302       0.538499435291984,  0.5440022463817783, 0.549953374183236,
    303       0.5563749934898856, 0.5632916653417023, 0.5707305880121454,
    304       0.5787218851348208, 0.5872989370937893, 0.5964987630244563,
    305       0.606362462272146,  0.6169357260050706, 0.6282694319707711,
    306       0.6404203382416639, 0.6534518953751283, 0.6674352009263413,
    307       0.6824501259764195, 0.6985866506472291, 0.7159464549705746,
    308       0.7346448236478627, 0.7548129391165311, 0.776600658233963,
    309       0.8001798956216941, 0.8257487738627852, 0.8535367510066064,
    310       0.8838110045596234, 0.9168844461846523, 0.9531258743921193,
    311       0.9929729612675466, 1.036949040910389,  1.0856850642580145,
    312       1.1399486751015042, 1.2006832557294167, 1.2690611716991191,
    313       1.346557628206286,  1.4350550884414341, 1.5369941008524954,
    314       1.6555965242641195, 1.7952052190778898, 1.961817848571166,
    315       2.163957818751979,  2.4141600002500763, 2.7316450287739396,
    316       3.147462191781909,  3.7152427383269746, 4.5362909369693565,
    317       5.827688377844654,  8.153848602466814,  13.58429025728446,
    318       40.744688103351834,
    319   };
    320 };
    321 
    322 template <>
    323 struct WcMultipliers<256> {
    324   static constexpr float kMultipliers[128] = {
    325       0.5000094125358878, 0.500084723455784,  0.5002354020255269,
    326       0.5004615618093246, 0.5007633734146156, 0.5011410648064231,
    327       0.5015949217281668, 0.502125288230386,  0.5027325673091954,
    328       0.5034172216566842, 0.5041797745258774, 0.5050208107132756,
    329       0.5059409776624396, 0.5069409866925212, 0.5080216143561264,
    330       0.509183703931388,  0.5104281670536573, 0.5117559854927805,
    331       0.5131682130825206, 0.5146659778093218, 0.516250484068288,
    332       0.5179230150949777, 0.5196849355823947, 0.5215376944933958,
    333       0.5234828280796439, 0.52552196311921,   0.5276568203859896,
    334       0.5298892183652453, 0.5322210772308335, 0.5346544231010253,
    335       0.537191392591309,  0.5398342376841637, 0.5425853309375497,
    336       0.545447171055775,  0.5484223888484947, 0.551513753605893,
    337       0.554724179920619,  0.5580567349898085, 0.5615146464335654,
    338       0.5651013106696203, 0.5688203018875696, 0.5726753816701664,
    339       0.5766705093136241, 0.5808098529038624, 0.5850978012111273,
    340       0.58953897647151,   0.5941382481306648, 0.5989007476325463,
    341       0.6038318843443582, 0.6089373627182432, 0.614223200800649,
    342       0.6196957502119484, 0.6253617177319102, 0.6312281886412079,
    343       0.6373026519855411, 0.6435930279473415, 0.6501076975307724,
    344       0.6568555347890955, 0.6638459418498757, 0.6710888870233562,
    345       0.6785949463131795, 0.6863753486870501, 0.6944420255086364,
    346       0.7028076645818034, 0.7114857693151208, 0.7204907235796304,
    347       0.7298378629074134, 0.7395435527641373, 0.749625274727372,
    348       0.7601017215162176, 0.7709929019493761, 0.7823202570613161,
    349       0.7941067887834509, 0.8063772028037925, 0.8191580674598145,
    350       0.83247799080191,   0.8463678182968619, 0.860860854031955,
    351       0.8759931087426972, 0.8918035785352535, 0.9083345588266809,
    352       0.9256319988042384, 0.9437459026371479, 0.962730784794803,
    353       0.9826461881778968, 1.0035572754078206, 1.0255355056139732,
    354       1.048659411496106,  1.0730154944316674, 1.0986992590905857,
    355       1.1258164135986009, 1.1544842669978943, 1.184833362908442,
    356       1.217009397314603,  1.2511754798461228, 1.287514812536712,
    357       1.326233878832723,  1.3675662599582539, 1.411777227500661,
    358       1.459169302866857,  1.5100890297227016, 1.5649352798258847,
    359       1.6241695131835794, 1.6883285509131505, 1.7580406092704062,
    360       1.8340456094306077, 1.9172211551275689, 2.0086161135167564,
    361       2.1094945286246385, 2.22139377701127,   2.346202662531156,
    362       2.486267909203593,  2.644541877144861,  2.824791402350551,
    363       3.0318994541759925, 3.2723115884254845, 3.5547153325075804,
    364       3.891107790700307,  4.298537526449054,  4.802076008665048,
    365       5.440166215091329,  6.274908408039339,  7.413566756422303,
    366       9.058751453879703,  11.644627325175037, 16.300023088031555,
    367       27.163977662448232, 81.48784219222516,
    368   };
    369 };
    370 
    371 // Apply the DCT algorithm-intrinsic constants to DCTResampleScale.
    372 template <size_t FROM, size_t TO>
    373 constexpr float DCTTotalResampleScale(size_t x) {
    374   return DCTResampleScales<FROM, TO>::kScales[x];
    375 }
    376 
    377 }  // namespace jxl
    378 
    379 #endif  // LIB_JXL_DCT_SCALES_H_