You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.8KB

  1. /*
  2. * This file is part of FFmpeg.
  3. *
  4. * FFmpeg is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * FFmpeg is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with FFmpeg; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. #ifndef AVCODEC_VLC_H
  19. #define AVCODEC_VLC_H
  20. #include <stdint.h>
  21. #define VLC_TYPE int16_t
  22. typedef struct VLC {
  23. int bits;
  24. VLC_TYPE (*table)[2]; ///< code, bits
  25. int table_size, table_allocated;
  26. } VLC;
  27. typedef struct RL_VLC_ELEM {
  28. int16_t level;
  29. int8_t len;
  30. uint8_t run;
  31. } RL_VLC_ELEM;
  32. #define init_vlc(vlc, nb_bits, nb_codes, \
  33. bits, bits_wrap, bits_size, \
  34. codes, codes_wrap, codes_size, \
  35. flags) \
  36. ff_init_vlc_sparse(vlc, nb_bits, nb_codes, \
  37. bits, bits_wrap, bits_size, \
  38. codes, codes_wrap, codes_size, \
  39. NULL, 0, 0, flags)
  40. int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
  41. const void *bits, int bits_wrap, int bits_size,
  42. const void *codes, int codes_wrap, int codes_size,
  43. const void *symbols, int symbols_wrap, int symbols_size,
  44. int flags);
  45. void ff_free_vlc(VLC *vlc);
  46. /* If INIT_VLC_INPUT_LE is set, the LSB bit of the codes used to
  47. * initialize the VLC table is the first bit to be read. */
  48. #define INIT_VLC_INPUT_LE 2
  49. /* If set the VLC is intended for a little endian bitstream reader. */
  50. #define INIT_VLC_OUTPUT_LE 8
  51. #define INIT_VLC_LE (INIT_VLC_INPUT_LE | INIT_VLC_OUTPUT_LE)
  52. #define INIT_VLC_USE_NEW_STATIC 4
  53. #define INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
  54. h, i, j, flags, static_size) \
  55. do { \
  56. static VLC_TYPE table[static_size][2]; \
  57. (vlc)->table = table; \
  58. (vlc)->table_allocated = static_size; \
  59. ff_init_vlc_sparse(vlc, bits, a, b, c, d, e, f, g, h, i, j, \
  60. flags | INIT_VLC_USE_NEW_STATIC); \
  61. } while (0)
  62. #define INIT_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, h, i, j, static_size) \
  63. INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
  64. h, i, j, 0, static_size)
  65. #define INIT_LE_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, h, i, j, static_size) \
  66. INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
  67. h, i, j, INIT_VLC_LE, static_size)
  68. #define INIT_CUSTOM_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, flags, static_size) \
  69. INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
  70. NULL, 0, 0, flags, static_size)
  71. #define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size) \
  72. INIT_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, NULL, 0, 0, static_size)
  73. #define INIT_LE_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size) \
  74. INIT_LE_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, NULL, 0, 0, static_size)
  75. #endif /* AVCODEC_VLC_H */