2
0

vp9_tokenize.c 25 KB

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