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.

157 lines
4.8KB

  1. /*
  2. * Copyright (C) 2004-2010 Michael Niedermayer <michaelni@gmx.at>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #ifndef AVCODEC_DWT_H
  21. #define AVCODEC_DWT_H
  22. #include <stdint.h>
  23. typedef int DWTELEM;
  24. typedef short IDWTELEM;
  25. typedef struct {
  26. IDWTELEM *b0;
  27. IDWTELEM *b1;
  28. IDWTELEM *b2;
  29. IDWTELEM *b3;
  30. int y;
  31. } DWTCompose;
  32. /** Used to minimize the amount of memory used in order to optimize cache performance. **/
  33. typedef struct slice_buffer_s {
  34. IDWTELEM * * line; ///< For use by idwt and predict_slices.
  35. IDWTELEM * * data_stack; ///< Used for internal purposes.
  36. int data_stack_top;
  37. int line_count;
  38. int line_width;
  39. int data_count;
  40. IDWTELEM * base_buffer; ///< Buffer that this structure is caching.
  41. } slice_buffer;
  42. typedef struct DWTContext {
  43. void (*vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width);
  44. void (*horizontal_compose97i)(IDWTELEM *b, int width);
  45. void (*inner_add_yblock)(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8);
  46. } DWTContext;
  47. #define MAX_DECOMPOSITIONS 8
  48. #define DWT_97 0
  49. #define DWT_53 1
  50. #define liftS lift
  51. #if 1
  52. #define W_AM 3
  53. #define W_AO 0
  54. #define W_AS 1
  55. #undef liftS
  56. #define W_BM 1
  57. #define W_BO 8
  58. #define W_BS 4
  59. #define W_CM 1
  60. #define W_CO 0
  61. #define W_CS 0
  62. #define W_DM 3
  63. #define W_DO 4
  64. #define W_DS 3
  65. #elif 0
  66. #define W_AM 55
  67. #define W_AO 16
  68. #define W_AS 5
  69. #define W_BM 3
  70. #define W_BO 32
  71. #define W_BS 6
  72. #define W_CM 127
  73. #define W_CO 64
  74. #define W_CS 7
  75. #define W_DM 7
  76. #define W_DO 8
  77. #define W_DS 4
  78. #elif 0
  79. #define W_AM 97
  80. #define W_AO 32
  81. #define W_AS 6
  82. #define W_BM 63
  83. #define W_BO 512
  84. #define W_BS 10
  85. #define W_CM 13
  86. #define W_CO 8
  87. #define W_CS 4
  88. #define W_DM 15
  89. #define W_DO 16
  90. #define W_DS 5
  91. #else
  92. #define W_AM 203
  93. #define W_AO 64
  94. #define W_AS 7
  95. #define W_BM 217
  96. #define W_BO 2048
  97. #define W_BS 12
  98. #define W_CM 113
  99. #define W_CO 64
  100. #define W_CS 7
  101. #define W_DM 227
  102. #define W_DO 128
  103. #define W_DS 9
  104. #endif
  105. #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : ff_slice_buffer_load_line((slice_buf), (line_num)))
  106. //#define slice_buffer_get_line(slice_buf, line_num) (ff_slice_buffer_load_line((slice_buf), (line_num)))
  107. void ff_slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM * base_buffer);
  108. void ff_slice_buffer_release(slice_buffer * buf, int line);
  109. void ff_slice_buffer_flush(slice_buffer * buf);
  110. void ff_slice_buffer_destroy(slice_buffer * buf);
  111. IDWTELEM * ff_slice_buffer_load_line(slice_buffer * buf, int line);
  112. void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width);
  113. void ff_snow_horizontal_compose97i(IDWTELEM *b, int width);
  114. void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8);
  115. int ff_w53_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h);
  116. int ff_w97_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h);
  117. void ff_spatial_dwt(int *buffer, int width, int height, int stride, int type, int decomposition_count);
  118. void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count);
  119. void ff_spatial_idwt_buffered_slice(DWTContext *dsp, DWTCompose *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y);
  120. void ff_spatial_idwt_init(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count);
  121. void ff_spatial_idwt_slice(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y);
  122. void ff_spatial_idwt(IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count);
  123. void ff_dwt_init(DWTContext *c);
  124. void ff_dwt_init_x86(DWTContext *c);
  125. #endif /* AVCODEC_DWT_H */