vp9_common_data.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 "vp9/common/vp9_common_data.h"
  11. #include "vpx_dsp/vpx_dsp_common.h"
  12. // Log 2 conversion lookup tables for block width and height
  13. const uint8_t b_width_log2_lookup[BLOCK_SIZES] =
  14. {0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4};
  15. const uint8_t b_height_log2_lookup[BLOCK_SIZES] =
  16. {0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4};
  17. const uint8_t num_4x4_blocks_wide_lookup[BLOCK_SIZES] =
  18. {1, 1, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16};
  19. const uint8_t num_4x4_blocks_high_lookup[BLOCK_SIZES] =
  20. {1, 2, 1, 2, 4, 2, 4, 8, 4, 8, 16, 8, 16};
  21. // Log 2 conversion lookup tables for modeinfo width and height
  22. const uint8_t mi_width_log2_lookup[BLOCK_SIZES] =
  23. {0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3};
  24. const uint8_t num_8x8_blocks_wide_lookup[BLOCK_SIZES] =
  25. {1, 1, 1, 1, 1, 2, 2, 2, 4, 4, 4, 8, 8};
  26. const uint8_t num_8x8_blocks_high_lookup[BLOCK_SIZES] =
  27. {1, 1, 1, 1, 2, 1, 2, 4, 2, 4, 8, 4, 8};
  28. // VPXMIN(3, VPXMIN(b_width_log2(bsize), b_height_log2(bsize)))
  29. const uint8_t size_group_lookup[BLOCK_SIZES] =
  30. {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3};
  31. const uint8_t num_pels_log2_lookup[BLOCK_SIZES] =
  32. {4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12};
  33. const PARTITION_TYPE partition_lookup[][BLOCK_SIZES] = {
  34. { // 4X4
  35. // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
  36. PARTITION_NONE, PARTITION_INVALID, PARTITION_INVALID,
  37. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  38. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  39. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  40. PARTITION_INVALID
  41. }, { // 8X8
  42. // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
  43. PARTITION_SPLIT, PARTITION_VERT, PARTITION_HORZ, PARTITION_NONE,
  44. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  45. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  46. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID
  47. }, { // 16X16
  48. // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
  49. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
  50. PARTITION_VERT, PARTITION_HORZ, PARTITION_NONE, PARTITION_INVALID,
  51. PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
  52. PARTITION_INVALID, PARTITION_INVALID
  53. }, { // 32X32
  54. // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
  55. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
  56. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_VERT,
  57. PARTITION_HORZ, PARTITION_NONE, PARTITION_INVALID,
  58. PARTITION_INVALID, PARTITION_INVALID
  59. }, { // 64X64
  60. // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
  61. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
  62. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
  63. PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_VERT, PARTITION_HORZ,
  64. PARTITION_NONE
  65. }
  66. };
  67. const BLOCK_SIZE subsize_lookup[PARTITION_TYPES][BLOCK_SIZES] = {
  68. { // PARTITION_NONE
  69. BLOCK_4X4, BLOCK_4X8, BLOCK_8X4,
  70. BLOCK_8X8, BLOCK_8X16, BLOCK_16X8,
  71. BLOCK_16X16, BLOCK_16X32, BLOCK_32X16,
  72. BLOCK_32X32, BLOCK_32X64, BLOCK_64X32,
  73. BLOCK_64X64,
  74. }, { // PARTITION_HORZ
  75. BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
  76. BLOCK_8X4, BLOCK_INVALID, BLOCK_INVALID,
  77. BLOCK_16X8, BLOCK_INVALID, BLOCK_INVALID,
  78. BLOCK_32X16, BLOCK_INVALID, BLOCK_INVALID,
  79. BLOCK_64X32,
  80. }, { // PARTITION_VERT
  81. BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
  82. BLOCK_4X8, BLOCK_INVALID, BLOCK_INVALID,
  83. BLOCK_8X16, BLOCK_INVALID, BLOCK_INVALID,
  84. BLOCK_16X32, BLOCK_INVALID, BLOCK_INVALID,
  85. BLOCK_32X64,
  86. }, { // PARTITION_SPLIT
  87. BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID,
  88. BLOCK_4X4, BLOCK_INVALID, BLOCK_INVALID,
  89. BLOCK_8X8, BLOCK_INVALID, BLOCK_INVALID,
  90. BLOCK_16X16, BLOCK_INVALID, BLOCK_INVALID,
  91. BLOCK_32X32,
  92. }
  93. };
  94. const TX_SIZE max_txsize_lookup[BLOCK_SIZES] = {
  95. TX_4X4, TX_4X4, TX_4X4,
  96. TX_8X8, TX_8X8, TX_8X8,
  97. TX_16X16, TX_16X16, TX_16X16,
  98. TX_32X32, TX_32X32, TX_32X32, TX_32X32
  99. };
  100. const BLOCK_SIZE txsize_to_bsize[TX_SIZES] = {
  101. BLOCK_4X4, // TX_4X4
  102. BLOCK_8X8, // TX_8X8
  103. BLOCK_16X16, // TX_16X16
  104. BLOCK_32X32, // TX_32X32
  105. };
  106. const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES] = {
  107. TX_4X4, // ONLY_4X4
  108. TX_8X8, // ALLOW_8X8
  109. TX_16X16, // ALLOW_16X16
  110. TX_32X32, // ALLOW_32X32
  111. TX_32X32, // TX_MODE_SELECT
  112. };
  113. const BLOCK_SIZE ss_size_lookup[BLOCK_SIZES][2][2] = {
  114. // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1
  115. // ss_y == 0 ss_y == 1 ss_y == 0 ss_y == 1
  116. {{BLOCK_4X4, BLOCK_INVALID}, {BLOCK_INVALID, BLOCK_INVALID}},
  117. {{BLOCK_4X8, BLOCK_4X4}, {BLOCK_INVALID, BLOCK_INVALID}},
  118. {{BLOCK_8X4, BLOCK_INVALID}, {BLOCK_4X4, BLOCK_INVALID}},
  119. {{BLOCK_8X8, BLOCK_8X4}, {BLOCK_4X8, BLOCK_4X4}},
  120. {{BLOCK_8X16, BLOCK_8X8}, {BLOCK_INVALID, BLOCK_4X8}},
  121. {{BLOCK_16X8, BLOCK_INVALID}, {BLOCK_8X8, BLOCK_8X4}},
  122. {{BLOCK_16X16, BLOCK_16X8}, {BLOCK_8X16, BLOCK_8X8}},
  123. {{BLOCK_16X32, BLOCK_16X16}, {BLOCK_INVALID, BLOCK_8X16}},
  124. {{BLOCK_32X16, BLOCK_INVALID}, {BLOCK_16X16, BLOCK_16X8}},
  125. {{BLOCK_32X32, BLOCK_32X16}, {BLOCK_16X32, BLOCK_16X16}},
  126. {{BLOCK_32X64, BLOCK_32X32}, {BLOCK_INVALID, BLOCK_16X32}},
  127. {{BLOCK_64X32, BLOCK_INVALID}, {BLOCK_32X32, BLOCK_32X16}},
  128. {{BLOCK_64X64, BLOCK_64X32}, {BLOCK_32X64, BLOCK_32X32}},
  129. };
  130. // Generates 4 bit field in which each bit set to 1 represents
  131. // a blocksize partition 1111 means we split 64x64, 32x32, 16x16
  132. // and 8x8. 1000 means we just split the 64x64 to 32x32
  133. const struct {
  134. PARTITION_CONTEXT above;
  135. PARTITION_CONTEXT left;
  136. } partition_context_lookup[BLOCK_SIZES]= {
  137. {15, 15}, // 4X4 - {0b1111, 0b1111}
  138. {15, 14}, // 4X8 - {0b1111, 0b1110}
  139. {14, 15}, // 8X4 - {0b1110, 0b1111}
  140. {14, 14}, // 8X8 - {0b1110, 0b1110}
  141. {14, 12}, // 8X16 - {0b1110, 0b1100}
  142. {12, 14}, // 16X8 - {0b1100, 0b1110}
  143. {12, 12}, // 16X16 - {0b1100, 0b1100}
  144. {12, 8 }, // 16X32 - {0b1100, 0b1000}
  145. {8, 12}, // 32X16 - {0b1000, 0b1100}
  146. {8, 8 }, // 32X32 - {0b1000, 0b1000}
  147. {8, 0 }, // 32X64 - {0b1000, 0b0000}
  148. {0, 8 }, // 64X32 - {0b0000, 0b1000}
  149. {0, 0 }, // 64X64 - {0b0000, 0b0000}
  150. };
  151. #if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
  152. const uint8_t need_top_left[INTRA_MODES] = {
  153. 0, // DC_PRED
  154. 0, // V_PRED
  155. 0, // H_PRED
  156. 0, // D45_PRED
  157. 1, // D135_PRED
  158. 1, // D117_PRED
  159. 1, // D153_PRED
  160. 0, // D207_PRED
  161. 0, // D63_PRED
  162. 1, // TM_PRED
  163. };
  164. #endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH