rv34data.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * RealVideo 4 decoder
  3. * copyright (c) 2007 Konstantin Shishkov
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file libavcodec/rv34data.h
  23. * miscellaneous RV30/40 tables
  24. */
  25. #ifndef AVCODEC_RV34DATA_H
  26. #define AVCODEC_RV34DATA_H
  27. #include <stdint.h>
  28. /**
  29. * number of ones in nibble minus one
  30. */
  31. static const uint8_t rv34_count_ones[16] = {
  32. 0, 0, 0, 1, 0, 1, 1, 2, 0, 1, 1, 2, 1, 2, 2, 3
  33. };
  34. /**
  35. * values used to reconstruct coded block pattern
  36. */
  37. static const uint8_t rv34_cbp_code[16] = {
  38. 0x00, 0x20, 0x10, 0x30, 0x02, 0x22, 0x12, 0x32,
  39. 0x01, 0x21, 0x11, 0x31, 0x03, 0x23, 0x13, 0x33
  40. };
  41. /**
  42. * precalculated results of division by three and modulo three for values 0-107
  43. *
  44. * A lot of four-tuples in RV40 are represented as c0*27+c1*9+c2*3+c3.
  45. * This table allows conversion from a value back to a vector.
  46. */
  47. static const uint8_t modulo_three_table[108][4] = {
  48. { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 2 }, { 0, 0, 1, 0 },
  49. { 0, 0, 1, 1 }, { 0, 0, 1, 2 }, { 0, 0, 2, 0 }, { 0, 0, 2, 1 },
  50. { 0, 0, 2, 2 }, { 0, 1, 0, 0 }, { 0, 1, 0, 1 }, { 0, 1, 0, 2 },
  51. { 0, 1, 1, 0 }, { 0, 1, 1, 1 }, { 0, 1, 1, 2 }, { 0, 1, 2, 0 },
  52. { 0, 1, 2, 1 }, { 0, 1, 2, 2 }, { 0, 2, 0, 0 }, { 0, 2, 0, 1 },
  53. { 0, 2, 0, 2 }, { 0, 2, 1, 0 }, { 0, 2, 1, 1 }, { 0, 2, 1, 2 },
  54. { 0, 2, 2, 0 }, { 0, 2, 2, 1 }, { 0, 2, 2, 2 }, { 1, 0, 0, 0 },
  55. { 1, 0, 0, 1 }, { 1, 0, 0, 2 }, { 1, 0, 1, 0 }, { 1, 0, 1, 1 },
  56. { 1, 0, 1, 2 }, { 1, 0, 2, 0 }, { 1, 0, 2, 1 }, { 1, 0, 2, 2 },
  57. { 1, 1, 0, 0 }, { 1, 1, 0, 1 }, { 1, 1, 0, 2 }, { 1, 1, 1, 0 },
  58. { 1, 1, 1, 1 }, { 1, 1, 1, 2 }, { 1, 1, 2, 0 }, { 1, 1, 2, 1 },
  59. { 1, 1, 2, 2 }, { 1, 2, 0, 0 }, { 1, 2, 0, 1 }, { 1, 2, 0, 2 },
  60. { 1, 2, 1, 0 }, { 1, 2, 1, 1 }, { 1, 2, 1, 2 }, { 1, 2, 2, 0 },
  61. { 1, 2, 2, 1 }, { 1, 2, 2, 2 }, { 2, 0, 0, 0 }, { 2, 0, 0, 1 },
  62. { 2, 0, 0, 2 }, { 2, 0, 1, 0 }, { 2, 0, 1, 1 }, { 2, 0, 1, 2 },
  63. { 2, 0, 2, 0 }, { 2, 0, 2, 1 }, { 2, 0, 2, 2 }, { 2, 1, 0, 0 },
  64. { 2, 1, 0, 1 }, { 2, 1, 0, 2 }, { 2, 1, 1, 0 }, { 2, 1, 1, 1 },
  65. { 2, 1, 1, 2 }, { 2, 1, 2, 0 }, { 2, 1, 2, 1 }, { 2, 1, 2, 2 },
  66. { 2, 2, 0, 0 }, { 2, 2, 0, 1 }, { 2, 2, 0, 2 }, { 2, 2, 1, 0 },
  67. { 2, 2, 1, 1 }, { 2, 2, 1, 2 }, { 2, 2, 2, 0 }, { 2, 2, 2, 1 },
  68. { 2, 2, 2, 2 }, { 3, 0, 0, 0 }, { 3, 0, 0, 1 }, { 3, 0, 0, 2 },
  69. { 3, 0, 1, 0 }, { 3, 0, 1, 1 }, { 3, 0, 1, 2 }, { 3, 0, 2, 0 },
  70. { 3, 0, 2, 1 }, { 3, 0, 2, 2 }, { 3, 1, 0, 0 }, { 3, 1, 0, 1 },
  71. { 3, 1, 0, 2 }, { 3, 1, 1, 0 }, { 3, 1, 1, 1 }, { 3, 1, 1, 2 },
  72. { 3, 1, 2, 0 }, { 3, 1, 2, 1 }, { 3, 1, 2, 2 }, { 3, 2, 0, 0 },
  73. { 3, 2, 0, 1 }, { 3, 2, 0, 2 }, { 3, 2, 1, 0 }, { 3, 2, 1, 1 },
  74. { 3, 2, 1, 2 }, { 3, 2, 2, 0 }, { 3, 2, 2, 1 }, { 3, 2, 2, 2 },
  75. };
  76. /**
  77. * quantizer values used for AC and DC coefficients in chroma blocks
  78. */
  79. static const uint8_t rv34_chroma_quant[2][32] = {
  80. { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  81. 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25 },
  82. { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
  83. 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23 }
  84. };
  85. /**
  86. * This table is used for dequantizing.
  87. */
  88. static const uint16_t rv34_qscale_tab[32] = {
  89. 60, 67, 76, 85, 96, 108, 121, 136,
  90. 152, 171, 192, 216, 242, 272, 305, 341,
  91. 383, 432, 481, 544, 606, 683, 767, 854,
  92. 963, 1074, 1212, 1392, 1566, 1708, 1978, 2211
  93. };
  94. /**
  95. * 4x4 dezigzag pattern
  96. */
  97. static const uint8_t rv34_dezigzag[16] = {
  98. 0, 1, 8, 16,
  99. 9, 2, 3, 10,
  100. 17, 24, 25, 18,
  101. 11, 19, 26, 27
  102. };
  103. /**
  104. * tables used to translate a quantizer value into a VLC set for decoding
  105. * The first table is used for intraframes.
  106. */
  107. static const uint8_t rv34_quant_to_vlc_set[2][31] = {
  108. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  109. 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0 },
  110. { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3,
  111. 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6 },
  112. };
  113. /**
  114. * table for obtaining the quantizer difference
  115. * @todo Use with modified_quant_tab from h263data.h.
  116. */
  117. static const uint8_t rv34_dquant_tab[2][32]={
  118. // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
  119. {
  120. 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9,10,11,12,13,14,15,16,17,18,18,19,20,21,22,23,24,25,26,27,28
  121. },{
  122. 0, 2, 3, 4, 5, 6, 7, 8, 9,10,11,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,31,31,26
  123. }
  124. };
  125. /**
  126. * maximum number of macroblocks for each of the possible slice offset sizes
  127. * @todo This is the same as ff_mba_max, maybe use it instead.
  128. */
  129. static const uint16_t rv34_mb_max_sizes[6] = { 0x2F, 0x62, 0x18B, 0x62F, 0x18BF, 0x23FF };
  130. /**
  131. * bits needed to code the slice offset for the given size
  132. * @todo This is the same as ff_mba_length, maybe use it instead.
  133. */
  134. static const uint8_t rv34_mb_bits_sizes[6] = { 6, 7, 9, 11, 13, 14 };
  135. #endif /* AVCODEC_RV34DATA_H */