Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <assert.h>
     12 #include <math.h>
     13 #include <stdio.h>
     14 #include <string.h>
     15 
     16 #include "vpx_mem/vpx_mem.h"
     17 
     18 #include "vp9/common/vp9_entropy.h"
     19 #include "vp9/common/vp9_pred_common.h"
     20 #include "vp9/common/vp9_scan.h"
     21 
     22 #include "vp9/encoder/vp9_cost.h"
     23 #include "vp9/encoder/vp9_encoder.h"
     24 #include "vp9/encoder/vp9_tokenize.h"
     25 
     26 static const TOKENVALUE dct_cat_lt_10_value_tokens[] = {
     27   { 9, 63 }, { 9, 61 }, { 9, 59 }, { 9, 57 }, { 9, 55 }, { 9, 53 }, { 9, 51 },
     28   { 9, 49 }, { 9, 47 }, { 9, 45 }, { 9, 43 }, { 9, 41 }, { 9, 39 }, { 9, 37 },
     29   { 9, 35 }, { 9, 33 }, { 9, 31 }, { 9, 29 }, { 9, 27 }, { 9, 25 }, { 9, 23 },
     30   { 9, 21 }, { 9, 19 }, { 9, 17 }, { 9, 15 }, { 9, 13 }, { 9, 11 }, { 9, 9 },
     31   { 9, 7 },  { 9, 5 },  { 9, 3 },  { 9, 1 },  { 8, 31 }, { 8, 29 }, { 8, 27 },
     32   { 8, 25 }, { 8, 23 }, { 8, 21 }, { 8, 19 }, { 8, 17 }, { 8, 15 }, { 8, 13 },
     33   { 8, 11 }, { 8, 9 },  { 8, 7 },  { 8, 5 },  { 8, 3 },  { 8, 1 },  { 7, 15 },
     34   { 7, 13 }, { 7, 11 }, { 7, 9 },  { 7, 7 },  { 7, 5 },  { 7, 3 },  { 7, 1 },
     35   { 6, 7 },  { 6, 5 },  { 6, 3 },  { 6, 1 },  { 5, 3 },  { 5, 1 },  { 4, 1 },
     36   { 3, 1 },  { 2, 1 },  { 1, 1 },  { 0, 0 },  { 1, 0 },  { 2, 0 },  { 3, 0 },
     37   { 4, 0 },  { 5, 0 },  { 5, 2 },  { 6, 0 },  { 6, 2 },  { 6, 4 },  { 6, 6 },
     38   { 7, 0 },  { 7, 2 },  { 7, 4 },  { 7, 6 },  { 7, 8 },  { 7, 10 }, { 7, 12 },
     39   { 7, 14 }, { 8, 0 },  { 8, 2 },  { 8, 4 },  { 8, 6 },  { 8, 8 },  { 8, 10 },
     40   { 8, 12 }, { 8, 14 }, { 8, 16 }, { 8, 18 }, { 8, 20 }, { 8, 22 }, { 8, 24 },
     41   { 8, 26 }, { 8, 28 }, { 8, 30 }, { 9, 0 },  { 9, 2 },  { 9, 4 },  { 9, 6 },
     42   { 9, 8 },  { 9, 10 }, { 9, 12 }, { 9, 14 }, { 9, 16 }, { 9, 18 }, { 9, 20 },
     43   { 9, 22 }, { 9, 24 }, { 9, 26 }, { 9, 28 }, { 9, 30 }, { 9, 32 }, { 9, 34 },
     44   { 9, 36 }, { 9, 38 }, { 9, 40 }, { 9, 42 }, { 9, 44 }, { 9, 46 }, { 9, 48 },
     45   { 9, 50 }, { 9, 52 }, { 9, 54 }, { 9, 56 }, { 9, 58 }, { 9, 60 }, { 9, 62 }
     46 };
     47 const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens =
     48     dct_cat_lt_10_value_tokens +
     49     (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens)) /
     50         2;
     51 // The corresponding costs of the extrabits for the tokens in the above table
     52 // are stored in the table below. The values are obtained from looking up the
     53 // entry for the specified extrabits in the table corresponding to the token
     54 // (as defined in cost element vp9_extra_bits)
     55 // e.g. {9, 63} maps to cat5_cost[63 >> 1], {1, 1} maps to sign_cost[1 >> 1]
     56 static const int dct_cat_lt_10_value_cost[] = {
     57   3773, 3750, 3704, 3681, 3623, 3600, 3554, 3531, 3432, 3409, 3363, 3340, 3282,
     58   3259, 3213, 3190, 3136, 3113, 3067, 3044, 2986, 2963, 2917, 2894, 2795, 2772,
     59   2726, 2703, 2645, 2622, 2576, 2553, 3197, 3116, 3058, 2977, 2881, 2800, 2742,
     60   2661, 2615, 2534, 2476, 2395, 2299, 2218, 2160, 2079, 2566, 2427, 2334, 2195,
     61   2023, 1884, 1791, 1652, 1893, 1696, 1453, 1256, 1229, 864,  512,  512,  512,
     62   512,  0,    512,  512,  512,  512,  864,  1229, 1256, 1453, 1696, 1893, 1652,
     63   1791, 1884, 2023, 2195, 2334, 2427, 2566, 2079, 2160, 2218, 2299, 2395, 2476,
     64   2534, 2615, 2661, 2742, 2800, 2881, 2977, 3058, 3116, 3197, 2553, 2576, 2622,
     65   2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963, 2986, 3044, 3067, 3113, 3136,
     66   3190, 3213, 3259, 3282, 3340, 3363, 3409, 3432, 3531, 3554, 3600, 3623, 3681,
     67   3704, 3750, 3773,
     68 };
     69 const int *vp9_dct_cat_lt_10_value_cost =
     70     dct_cat_lt_10_value_cost +
     71     (sizeof(dct_cat_lt_10_value_cost) / sizeof(*dct_cat_lt_10_value_cost)) / 2;
     72 
     73 // Array indices are identical to previously-existing CONTEXT_NODE indices
     74 /* clang-format off */
     75 const vpx_tree_index vp9_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
     76   -EOB_TOKEN, 2,                       // 0  = EOB
     77   -ZERO_TOKEN, 4,                      // 1  = ZERO
     78   -ONE_TOKEN, 6,                       // 2  = ONE
     79   8, 12,                               // 3  = LOW_VAL
     80   -TWO_TOKEN, 10,                      // 4  = TWO
     81   -THREE_TOKEN, -FOUR_TOKEN,           // 5  = THREE
     82   14, 16,                              // 6  = HIGH_LOW
     83   -CATEGORY1_TOKEN, -CATEGORY2_TOKEN,  // 7  = CAT_ONE
     84   18, 20,                              // 8  = CAT_THREEFOUR
     85   -CATEGORY3_TOKEN, -CATEGORY4_TOKEN,  // 9  = CAT_THREE
     86   -CATEGORY5_TOKEN, -CATEGORY6_TOKEN   // 10 = CAT_FIVE
     87 };
     88 /* clang-format on */
     89 
     90 static const int16_t zero_cost[] = { 0 };
     91 static const int16_t sign_cost[1] = { 512 };
     92 static const int16_t cat1_cost[1 << 1] = { 864, 1229 };
     93 static const int16_t cat2_cost[1 << 2] = { 1256, 1453, 1696, 1893 };
     94 static const int16_t cat3_cost[1 << 3] = { 1652, 1791, 1884, 2023,
     95                                            2195, 2334, 2427, 2566 };
     96 static const int16_t cat4_cost[1 << 4] = { 2079, 2160, 2218, 2299, 2395, 2476,
     97                                            2534, 2615, 2661, 2742, 2800, 2881,
     98                                            2977, 3058, 3116, 3197 };
     99 static const int16_t cat5_cost[1 << 5] = {
    100   2553, 2576, 2622, 2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963,
    101   2986, 3044, 3067, 3113, 3136, 3190, 3213, 3259, 3282, 3340, 3363,
    102   3409, 3432, 3531, 3554, 3600, 3623, 3681, 3704, 3750, 3773
    103 };
    104 const int16_t vp9_cat6_low_cost[256] = {
    105   3378, 3390, 3401, 3413, 3435, 3447, 3458, 3470, 3517, 3529, 3540, 3552, 3574,
    106   3586, 3597, 3609, 3671, 3683, 3694, 3706, 3728, 3740, 3751, 3763, 3810, 3822,
    107   3833, 3845, 3867, 3879, 3890, 3902, 3973, 3985, 3996, 4008, 4030, 4042, 4053,
    108   4065, 4112, 4124, 4135, 4147, 4169, 4181, 4192, 4204, 4266, 4278, 4289, 4301,
    109   4323, 4335, 4346, 4358, 4405, 4417, 4428, 4440, 4462, 4474, 4485, 4497, 4253,
    110   4265, 4276, 4288, 4310, 4322, 4333, 4345, 4392, 4404, 4415, 4427, 4449, 4461,
    111   4472, 4484, 4546, 4558, 4569, 4581, 4603, 4615, 4626, 4638, 4685, 4697, 4708,
    112   4720, 4742, 4754, 4765, 4777, 4848, 4860, 4871, 4883, 4905, 4917, 4928, 4940,
    113   4987, 4999, 5010, 5022, 5044, 5056, 5067, 5079, 5141, 5153, 5164, 5176, 5198,
    114   5210, 5221, 5233, 5280, 5292, 5303, 5315, 5337, 5349, 5360, 5372, 4988, 5000,
    115   5011, 5023, 5045, 5057, 5068, 5080, 5127, 5139, 5150, 5162, 5184, 5196, 5207,
    116   5219, 5281, 5293, 5304, 5316, 5338, 5350, 5361, 5373, 5420, 5432, 5443, 5455,
    117   5477, 5489, 5500, 5512, 5583, 5595, 5606, 5618, 5640, 5652, 5663, 5675, 5722,
    118   5734, 5745, 5757, 5779, 5791, 5802, 5814, 5876, 5888, 5899, 5911, 5933, 5945,
    119   5956, 5968, 6015, 6027, 6038, 6050, 6072, 6084, 6095, 6107, 5863, 5875, 5886,
    120   5898, 5920, 5932, 5943, 5955, 6002, 6014, 6025, 6037, 6059, 6071, 6082, 6094,
    121   6156, 6168, 6179, 6191, 6213, 6225, 6236, 6248, 6295, 6307, 6318, 6330, 6352,
    122   6364, 6375, 6387, 6458, 6470, 6481, 6493, 6515, 6527, 6538, 6550, 6597, 6609,
    123   6620, 6632, 6654, 6666, 6677, 6689, 6751, 6763, 6774, 6786, 6808, 6820, 6831,
    124   6843, 6890, 6902, 6913, 6925, 6947, 6959, 6970, 6982
    125 };
    126 const uint16_t vp9_cat6_high_cost[64] = {
    127   88,    2251,  2727,  4890,  3148,  5311,  5787,  7950,  3666,  5829,  6305,
    128   8468,  6726,  8889,  9365,  11528, 3666,  5829,  6305,  8468,  6726,  8889,
    129   9365,  11528, 7244,  9407,  9883,  12046, 10304, 12467, 12943, 15106, 3666,
    130   5829,  6305,  8468,  6726,  8889,  9365,  11528, 7244,  9407,  9883,  12046,
    131   10304, 12467, 12943, 15106, 7244,  9407,  9883,  12046, 10304, 12467, 12943,
    132   15106, 10822, 12985, 13461, 15624, 13882, 16045, 16521, 18684
    133 };
    134 
    135 #if CONFIG_VP9_HIGHBITDEPTH
    136 const uint16_t vp9_cat6_high10_high_cost[256] = {
    137   94,    2257,  2733,  4896,  3154,  5317,  5793,  7956,  3672,  5835,  6311,
    138   8474,  6732,  8895,  9371,  11534, 3672,  5835,  6311,  8474,  6732,  8895,
    139   9371,  11534, 7250,  9413,  9889,  12052, 10310, 12473, 12949, 15112, 3672,
    140   5835,  6311,  8474,  6732,  8895,  9371,  11534, 7250,  9413,  9889,  12052,
    141   10310, 12473, 12949, 15112, 7250,  9413,  9889,  12052, 10310, 12473, 12949,
    142   15112, 10828, 12991, 13467, 15630, 13888, 16051, 16527, 18690, 4187,  6350,
    143   6826,  8989,  7247,  9410,  9886,  12049, 7765,  9928,  10404, 12567, 10825,
    144   12988, 13464, 15627, 7765,  9928,  10404, 12567, 10825, 12988, 13464, 15627,
    145   11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 7765,  9928,  10404,
    146   12567, 10825, 12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566,
    147   17042, 19205, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921,
    148   17084, 17560, 19723, 17981, 20144, 20620, 22783, 4187,  6350,  6826,  8989,
    149   7247,  9410,  9886,  12049, 7765,  9928,  10404, 12567, 10825, 12988, 13464,
    150   15627, 7765,  9928,  10404, 12567, 10825, 12988, 13464, 15627, 11343, 13506,
    151   13982, 16145, 14403, 16566, 17042, 19205, 7765,  9928,  10404, 12567, 10825,
    152   12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205,
    153   11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921, 17084, 17560,
    154   19723, 17981, 20144, 20620, 22783, 8280,  10443, 10919, 13082, 11340, 13503,
    155   13979, 16142, 11858, 14021, 14497, 16660, 14918, 17081, 17557, 19720, 11858,
    156   14021, 14497, 16660, 14918, 17081, 17557, 19720, 15436, 17599, 18075, 20238,
    157   18496, 20659, 21135, 23298, 11858, 14021, 14497, 16660, 14918, 17081, 17557,
    158   19720, 15436, 17599, 18075, 20238, 18496, 20659, 21135, 23298, 15436, 17599,
    159   18075, 20238, 18496, 20659, 21135, 23298, 19014, 21177, 21653, 23816, 22074,
    160   24237, 24713, 26876
    161 };
    162 const uint16_t vp9_cat6_high12_high_cost[1024] = {
    163   100,   2263,  2739,  4902,  3160,  5323,  5799,  7962,  3678,  5841,  6317,
    164   8480,  6738,  8901,  9377,  11540, 3678,  5841,  6317,  8480,  6738,  8901,
    165   9377,  11540, 7256,  9419,  9895,  12058, 10316, 12479, 12955, 15118, 3678,
    166   5841,  6317,  8480,  6738,  8901,  9377,  11540, 7256,  9419,  9895,  12058,
    167   10316, 12479, 12955, 15118, 7256,  9419,  9895,  12058, 10316, 12479, 12955,
    168   15118, 10834, 12997, 13473, 15636, 13894, 16057, 16533, 18696, 4193,  6356,
    169   6832,  8995,  7253,  9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831,
    170   12994, 13470, 15633, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633,
    171   11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410,
    172   12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
    173   17048, 19211, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927,
    174   17090, 17566, 19729, 17987, 20150, 20626, 22789, 4193,  6356,  6832,  8995,
    175   7253,  9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831, 12994, 13470,
    176   15633, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512,
    177   13988, 16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410, 12573, 10831,
    178   12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211,
    179   11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566,
    180   19729, 17987, 20150, 20626, 22789, 8286,  10449, 10925, 13088, 11346, 13509,
    181   13985, 16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864,
    182   14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244,
    183   18502, 20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
    184   19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605,
    185   18081, 20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080,
    186   24243, 24719, 26882, 4193,  6356,  6832,  8995,  7253,  9416,  9892,  12055,
    187   7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 7771,  9934,  10410,
    188   12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
    189   17048, 19211, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349,
    190   13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349, 13512, 13988, 16151,
    191   14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729, 17987, 20150, 20626,
    192   22789, 8286,  10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027,
    193   14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924,
    194   17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
    195   11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081,
    196   20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665,
    197   21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 8286,
    198   10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666,
    199   14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
    200   19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027,
    201   14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
    202   20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
    203   19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018,
    204   17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180,
    205   21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535,
    206   21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759,
    207   19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
    208   27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276,
    209   25752, 27915, 26173, 28336, 28812, 30975, 4193,  6356,  6832,  8995,  7253,
    210   9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633,
    211   7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988,
    212   16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410, 12573, 10831, 12994,
    213   13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349,
    214   13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729,
    215   17987, 20150, 20626, 22789, 8286,  10449, 10925, 13088, 11346, 13509, 13985,
    216   16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027,
    217   14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
    218   20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
    219   15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081,
    220   20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243,
    221   24719, 26882, 8286,  10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864,
    222   14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666,
    223   14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141,
    224   23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605,
    225   18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502,
    226   20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882,
    227   12379, 14542, 15018, 17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596,
    228   20759, 19017, 21180, 21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180,
    229   21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957,
    230   18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
    231   22595, 24758, 25234, 27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
    232   27397, 23113, 25276, 25752, 27915, 26173, 28336, 28812, 30975, 8286,  10449,
    233   10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666, 14924,
    234   17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
    235   15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027, 14503,
    236   16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665,
    237   21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 19020,
    238   21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018, 17181,
    239   15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
    240   23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698,
    241   22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017,
    242   21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397,
    243   19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752,
    244   27915, 26173, 28336, 28812, 30975, 12379, 14542, 15018, 17181, 15439, 17602,
    245   18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 15957,
    246   18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
    247   22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
    248   23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 19535, 21698,
    249   22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752, 27915, 26173,
    250   28336, 28812, 30975, 16472, 18635, 19111, 21274, 19532, 21695, 22171, 24334,
    251   20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 20050, 22213, 22689,
    252   24852, 23110, 25273, 25749, 27912, 23628, 25791, 26267, 28430, 26688, 28851,
    253   29327, 31490, 20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 23628,
    254   25791, 26267, 28430, 26688, 28851, 29327, 31490, 23628, 25791, 26267, 28430,
    255   26688, 28851, 29327, 31490, 27206, 29369, 29845, 32008, 30266, 32429, 32905,
    256   35068
    257 };
    258 #endif
    259 
    260 const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS] = {
    261   { 0, 0, 0, zero_cost },                         // ZERO_TOKEN
    262   { 0, 0, 1, sign_cost },                         // ONE_TOKEN
    263   { 0, 0, 2, sign_cost },                         // TWO_TOKEN
    264   { 0, 0, 3, sign_cost },                         // THREE_TOKEN
    265   { 0, 0, 4, sign_cost },                         // FOUR_TOKEN
    266   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },  // CATEGORY1_TOKEN
    267   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },  // CATEGORY2_TOKEN
    268   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },  // CATEGORY3_TOKEN
    269   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },  // CATEGORY4_TOKEN
    270   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },  // CATEGORY5_TOKEN
    271   { vp9_cat6_prob, 14, CAT6_MIN_VAL, 0 },         // CATEGORY6_TOKEN
    272   { 0, 0, 0, zero_cost }                          // EOB_TOKEN
    273 };
    274 
    275 #if CONFIG_VP9_HIGHBITDEPTH
    276 const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS] = {
    277   { 0, 0, 0, zero_cost },                             // ZERO
    278   { 0, 0, 1, sign_cost },                             // ONE
    279   { 0, 0, 2, sign_cost },                             // TWO
    280   { 0, 0, 3, sign_cost },                             // THREE
    281   { 0, 0, 4, sign_cost },                             // FOUR
    282   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },      // CAT1
    283   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },      // CAT2
    284   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },      // CAT3
    285   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },      // CAT4
    286   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },      // CAT5
    287   { vp9_cat6_prob_high12 + 2, 16, CAT6_MIN_VAL, 0 },  // CAT6
    288   { 0, 0, 0, zero_cost }                              // EOB
    289 };
    290 const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS] = {
    291   { 0, 0, 0, zero_cost },                         // ZERO
    292   { 0, 0, 1, sign_cost },                         // ONE
    293   { 0, 0, 2, sign_cost },                         // TWO
    294   { 0, 0, 3, sign_cost },                         // THREE
    295   { 0, 0, 4, sign_cost },                         // FOUR
    296   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },  // CAT1
    297   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },  // CAT2
    298   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },  // CAT3
    299   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },  // CAT4
    300   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },  // CAT5
    301   { vp9_cat6_prob_high12, 18, CAT6_MIN_VAL, 0 },  // CAT6
    302   { 0, 0, 0, zero_cost }                          // EOB
    303 };
    304 #endif
    305 
    306 const struct vp9_token vp9_coef_encodings[ENTROPY_TOKENS] = {
    307   { 2, 2 },  { 6, 3 },   { 28, 5 },  { 58, 6 },  { 59, 6 },  { 60, 6 },
    308   { 61, 6 }, { 124, 7 }, { 125, 7 }, { 126, 7 }, { 127, 7 }, { 0, 1 }
    309 };
    310 
    311 struct tokenize_b_args {
    312   VP9_COMP *cpi;
    313   ThreadData *td;
    314   TOKENEXTRA **tp;
    315 };
    316 
    317 static void set_entropy_context_b(int plane, int block, int row, int col,
    318                                   BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
    319                                   void *arg) {
    320   struct tokenize_b_args *const args = arg;
    321   ThreadData *const td = args->td;
    322   MACROBLOCK *const x = &td->mb;
    323   MACROBLOCKD *const xd = &x->e_mbd;
    324   struct macroblock_plane *p = &x->plane[plane];
    325   struct macroblockd_plane *pd = &xd->plane[plane];
    326   vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, col, row);
    327 }
    328 
    329 static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
    330                              int16_t token, EXTRABIT extra,
    331                              unsigned int *counts) {
    332   (*t)->context_tree = context_tree;
    333   (*t)->token = token;
    334   (*t)->extra = extra;
    335   (*t)++;
    336   ++counts[token];
    337 }
    338 
    339 static INLINE void add_token_no_extra(TOKENEXTRA **t,
    340                                       const vpx_prob *context_tree,
    341                                       int16_t token, unsigned int *counts) {
    342   (*t)->context_tree = context_tree;
    343   (*t)->token = token;
    344   (*t)++;
    345   ++counts[token];
    346 }
    347 
    348 static void tokenize_b(int plane, int block, int row, int col,
    349                        BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) {
    350   struct tokenize_b_args *const args = arg;
    351   VP9_COMP *cpi = args->cpi;
    352   ThreadData *const td = args->td;
    353   MACROBLOCK *const x = &td->mb;
    354   MACROBLOCKD *const xd = &x->e_mbd;
    355   TOKENEXTRA **tp = args->tp;
    356   uint8_t token_cache[32 * 32];
    357   struct macroblock_plane *p = &x->plane[plane];
    358   struct macroblockd_plane *pd = &xd->plane[plane];
    359   MODE_INFO *mi = xd->mi[0];
    360   int pt; /* near block/prev token context index */
    361   int c;
    362   TOKENEXTRA *t = *tp; /* store tokens starting here */
    363   int eob = p->eobs[block];
    364   const PLANE_TYPE type = get_plane_type(plane);
    365   const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
    366   const int16_t *scan, *nb;
    367   const scan_order *so;
    368   const int ref = is_inter_block(mi);
    369   unsigned int(*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
    370       td->rd_counts.coef_counts[tx_size][type][ref];
    371   vpx_prob(*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
    372       cpi->common.fc->coef_probs[tx_size][type][ref];
    373   unsigned int(*const eob_branch)[COEFF_CONTEXTS] =
    374       td->counts->eob_branch[tx_size][type][ref];
    375   const uint8_t *const band = get_band_translate(tx_size);
    376   const int tx_eob = 16 << (tx_size << 1);
    377   int16_t token;
    378   EXTRABIT extra;
    379   pt = get_entropy_context(tx_size, pd->above_context + col,
    380                            pd->left_context + row);
    381   so = get_scan(xd, tx_size, type, block);
    382   scan = so->scan;
    383   nb = so->neighbors;
    384   c = 0;
    385 
    386   while (c < eob) {
    387     int v = 0;
    388     v = qcoeff[scan[c]];
    389     ++eob_branch[band[c]][pt];
    390 
    391     while (!v) {
    392       add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN,
    393                          counts[band[c]][pt]);
    394 
    395       token_cache[scan[c]] = 0;
    396       ++c;
    397       pt = get_coef_context(nb, token_cache, c);
    398       v = qcoeff[scan[c]];
    399     }
    400 
    401     vp9_get_token_extra(v, &token, &extra);
    402 
    403     add_token(&t, coef_probs[band[c]][pt], token, extra, counts[band[c]][pt]);
    404 
    405     token_cache[scan[c]] = vp9_pt_energy_class[token];
    406     ++c;
    407     pt = get_coef_context(nb, token_cache, c);
    408   }
    409   if (c < tx_eob) {
    410     ++eob_branch[band[c]][pt];
    411     add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN,
    412                        counts[band[c]][pt]);
    413   }
    414 
    415   *tp = t;
    416 
    417   vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, col, row);
    418 }
    419 
    420 struct is_skippable_args {
    421   uint16_t *eobs;
    422   int *skippable;
    423 };
    424 
    425 static void is_skippable(int plane, int block, int row, int col,
    426                          BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *argv) {
    427   struct is_skippable_args *args = argv;
    428   (void)plane;
    429   (void)plane_bsize;
    430   (void)tx_size;
    431   (void)row;
    432   (void)col;
    433   args->skippable[0] &= (!args->eobs[block]);
    434 }
    435 
    436 // TODO(yaowu): rewrite and optimize this function to remove the usage of
    437 //              vp9_foreach_transform_block() and simplify is_skippable().
    438 int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
    439   int result = 1;
    440   struct is_skippable_args args = { x->plane[plane].eobs, &result };
    441   vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
    442                                          &args);
    443   return result;
    444 }
    445 
    446 static void has_high_freq_coeff(int plane, int block, int row, int col,
    447                                 BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
    448                                 void *argv) {
    449   struct is_skippable_args *args = argv;
    450   int eobs = (tx_size == TX_4X4) ? 3 : 10;
    451   (void)plane;
    452   (void)plane_bsize;
    453   (void)row;
    454   (void)col;
    455   *(args->skippable) |= (args->eobs[block] > eobs);
    456 }
    457 
    458 int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
    459   int result = 0;
    460   struct is_skippable_args args = { x->plane[plane].eobs, &result };
    461   vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
    462                                          has_high_freq_coeff, &args);
    463   return result;
    464 }
    465 
    466 void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int dry_run,
    467                      int seg_skip, BLOCK_SIZE bsize) {
    468   MACROBLOCK *const x = &td->mb;
    469   MACROBLOCKD *const xd = &x->e_mbd;
    470   MODE_INFO *const mi = xd->mi[0];
    471   const int ctx = vp9_get_skip_context(xd);
    472   struct tokenize_b_args arg = { cpi, td, t };
    473 
    474   if (seg_skip) {
    475     assert(mi->skip);
    476   }
    477 
    478   if (mi->skip) {
    479     if (!dry_run && !seg_skip) ++td->counts->skip[ctx][1];
    480     reset_skip_context(xd, bsize);
    481     return;
    482   }
    483 
    484   if (!dry_run) {
    485     ++td->counts->skip[ctx][0];
    486     vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg);
    487   } else {
    488     vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
    489   }
    490 }
    491