Mercurial > libavcodec.hg
annotate dwt.h @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 1bf7af4db35a |
children |
rev | line source |
---|---|
3198 | 1 /* |
11485 | 2 * Copyright (C) 2004-2010 Michael Niedermayer <michaelni@gmx.at> |
3198 | 3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
3198 | 7 * modify it under the terms of the GNU Lesser General Public |
8 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
3198 | 10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
3198 | 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3198 | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 */ | |
20 | |
11485 | 21 #ifndef AVCODEC_DWT_H |
22 #define AVCODEC_DWT_H | |
3198 | 23 |
11485 | 24 #include <stdint.h> |
3198 | 25 |
11485 | 26 typedef int DWTELEM; |
27 typedef short IDWTELEM; | |
3198 | 28 |
11485 | 29 typedef struct { |
30 IDWTELEM *b0; | |
31 IDWTELEM *b1; | |
32 IDWTELEM *b2; | |
33 IDWTELEM *b3; | |
34 int y; | |
35 } DWTCompose; | |
3326 | 36 |
3198 | 37 /** Used to minimize the amount of memory used in order to optimize cache performance. **/ |
11485 | 38 typedef struct slice_buffer_s { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
39 IDWTELEM * * line; ///< For use by idwt and predict_slices. |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
40 IDWTELEM * * data_stack; ///< Used for internal purposes. |
3198 | 41 int data_stack_top; |
42 int line_count; | |
43 int line_width; | |
44 int data_count; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
45 IDWTELEM * base_buffer; ///< Buffer that this structure is caching. |
11485 | 46 } slice_buffer; |
47 | |
48 typedef struct DWTContext { | |
49 void (*vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width); | |
50 void (*horizontal_compose97i)(IDWTELEM *b, int width); | |
51 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); | |
52 } DWTContext; | |
53 | |
54 #define MAX_DECOMPOSITIONS 8 | |
55 | |
56 #define DWT_97 0 | |
57 #define DWT_53 1 | |
3198 | 58 |
59 #define liftS lift | |
60 #if 1 | |
61 #define W_AM 3 | |
62 #define W_AO 0 | |
63 #define W_AS 1 | |
64 | |
65 #undef liftS | |
66 #define W_BM 1 | |
67 #define W_BO 8 | |
68 #define W_BS 4 | |
69 | |
70 #define W_CM 1 | |
71 #define W_CO 0 | |
72 #define W_CS 0 | |
73 | |
74 #define W_DM 3 | |
75 #define W_DO 4 | |
76 #define W_DS 3 | |
77 #elif 0 | |
78 #define W_AM 55 | |
79 #define W_AO 16 | |
80 #define W_AS 5 | |
81 | |
82 #define W_BM 3 | |
83 #define W_BO 32 | |
84 #define W_BS 6 | |
85 | |
86 #define W_CM 127 | |
87 #define W_CO 64 | |
88 #define W_CS 7 | |
89 | |
90 #define W_DM 7 | |
91 #define W_DO 8 | |
92 #define W_DS 4 | |
93 #elif 0 | |
94 #define W_AM 97 | |
95 #define W_AO 32 | |
96 #define W_AS 6 | |
97 | |
98 #define W_BM 63 | |
99 #define W_BO 512 | |
100 #define W_BS 10 | |
101 | |
102 #define W_CM 13 | |
103 #define W_CO 8 | |
104 #define W_CS 4 | |
105 | |
106 #define W_DM 15 | |
107 #define W_DO 16 | |
108 #define W_DS 5 | |
109 | |
110 #else | |
111 | |
112 #define W_AM 203 | |
113 #define W_AO 64 | |
114 #define W_AS 7 | |
115 | |
116 #define W_BM 217 | |
117 #define W_BO 2048 | |
118 #define W_BS 12 | |
119 | |
120 #define W_CM 113 | |
121 #define W_CO 64 | |
122 #define W_CS 7 | |
123 | |
124 #define W_DM 227 | |
125 #define W_DO 128 | |
126 #define W_DS 9 | |
127 #endif | |
128 | |
11486 | 129 #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))) |
130 //#define slice_buffer_get_line(slice_buf, line_num) (ff_slice_buffer_load_line((slice_buf), (line_num))) | |
11485 | 131 |
11486 | 132 void ff_slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM * base_buffer); |
133 void ff_slice_buffer_release(slice_buffer * buf, int line); | |
134 void ff_slice_buffer_flush(slice_buffer * buf); | |
135 void ff_slice_buffer_destroy(slice_buffer * buf); | |
136 IDWTELEM * ff_slice_buffer_load_line(slice_buffer * buf, int line); | |
11485 | 137 |
8250 | 138 void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width); |
139 void ff_snow_horizontal_compose97i(IDWTELEM *b, int width); | |
140 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); | |
3198 | 141 |
11486 | 142 int ff_w53_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h); |
143 int ff_w97_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h); | |
3223 | 144 |
11380 | 145 void ff_spatial_dwt(int *buffer, int width, int height, int stride, int type, int decomposition_count); |
146 | |
11485 | 147 void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count); |
148 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); | |
149 void ff_spatial_idwt_init(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count); | |
150 void ff_spatial_idwt_slice(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y); | |
151 void ff_spatial_idwt(IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count); | |
3223 | 152 |
11485 | 153 void ff_dwt_init(DWTContext *c); |
154 void ff_dwt_init_x86(DWTContext *c); | |
3223 | 155 |
11485 | 156 #endif /* AVCODEC_DWT_H */ |