Mercurial > libavcodec.hg
annotate snow.h @ 7351:1502ba3beb72 libavcodec
The codebook generator algorithm involves picking three
different codebook centroids ("high utility", "low
utility" and "closest to the low utility one"). This
change avoid the corner case of choosing two times the
same centroid.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:54:31 +0000 |
parents | 1d83e9c34641 |
children | c4a4495715dd |
rev | line source |
---|---|
3198 | 1 /* |
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
3 * Copyright (C) 2006 Robert Edele <yartrebo@earthlink.net> | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3198 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * 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
|
10 * version 2.1 of the License, or (at your option) any later version. |
3198 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3198 | 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3582
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3198 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 */ | |
21 | |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5589
diff
changeset
|
22 #ifndef FFMPEG_SNOW_H |
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5589
diff
changeset
|
23 #define FFMPEG_SNOW_H |
3198 | 24 |
25 #include "dsputil.h" | |
26 | |
27 #define MID_STATE 128 | |
28 | |
29 #define MAX_DECOMPOSITIONS 8 | |
30 #define MAX_PLANES 4 | |
31 #define QSHIFT 5 | |
32 #define QROOT (1<<QSHIFT) | |
33 #define LOSSLESS_QLOG -128 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
34 #define FRAC_BITS 4 |
3314 | 35 #define MAX_REF_FRAMES 8 |
3198 | 36 |
3206 | 37 #define LOG2_OBMC_MAX 8 |
3198 | 38 #define OBMC_MAX (1<<(LOG2_OBMC_MAX)) |
39 | |
3326 | 40 #define DWT_97 0 |
41 #define DWT_53 1 | |
42 | |
3198 | 43 /** Used to minimize the amount of memory used in order to optimize cache performance. **/ |
44 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
|
45 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
|
46 IDWTELEM * * data_stack; ///< Used for internal purposes. |
3198 | 47 int data_stack_top; |
48 int line_count; | |
49 int line_width; | |
50 int data_count; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
51 IDWTELEM * base_buffer; ///< Buffer that this structure is caching. |
3198 | 52 }; |
53 | |
54 #define liftS lift | |
55 #if 1 | |
56 #define W_AM 3 | |
57 #define W_AO 0 | |
58 #define W_AS 1 | |
59 | |
60 #undef liftS | |
61 #define W_BM 1 | |
62 #define W_BO 8 | |
63 #define W_BS 4 | |
64 | |
65 #define W_CM 1 | |
66 #define W_CO 0 | |
67 #define W_CS 0 | |
68 | |
69 #define W_DM 3 | |
70 #define W_DO 4 | |
71 #define W_DS 3 | |
72 #elif 0 | |
73 #define W_AM 55 | |
74 #define W_AO 16 | |
75 #define W_AS 5 | |
76 | |
77 #define W_BM 3 | |
78 #define W_BO 32 | |
79 #define W_BS 6 | |
80 | |
81 #define W_CM 127 | |
82 #define W_CO 64 | |
83 #define W_CS 7 | |
84 | |
85 #define W_DM 7 | |
86 #define W_DO 8 | |
87 #define W_DS 4 | |
88 #elif 0 | |
89 #define W_AM 97 | |
90 #define W_AO 32 | |
91 #define W_AS 6 | |
92 | |
93 #define W_BM 63 | |
94 #define W_BO 512 | |
95 #define W_BS 10 | |
96 | |
97 #define W_CM 13 | |
98 #define W_CO 8 | |
99 #define W_CS 4 | |
100 | |
101 #define W_DM 15 | |
102 #define W_DO 16 | |
103 #define W_DS 5 | |
104 | |
105 #else | |
106 | |
107 #define W_AM 203 | |
108 #define W_AO 64 | |
109 #define W_AS 7 | |
110 | |
111 #define W_BM 217 | |
112 #define W_BO 2048 | |
113 #define W_BS 12 | |
114 | |
115 #define W_CM 113 | |
116 #define W_CO 64 | |
117 #define W_CS 7 | |
118 | |
119 #define W_DM 227 | |
120 #define W_DO 128 | |
121 #define W_DS 9 | |
122 #endif | |
123 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
124 extern void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
125 extern void ff_snow_horizontal_compose97i(IDWTELEM *b, int width); |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4283
diff
changeset
|
126 extern 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 | 127 |
3582
6310389a9688
Compile fix (for GCC<3.3) when encoders are disabled
gpoirier
parents:
3326
diff
changeset
|
128 #ifdef CONFIG_SNOW_ENCODER |
4197 | 129 int w53_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h); |
130 int w97_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h); | |
3582
6310389a9688
Compile fix (for GCC<3.3) when encoders are disabled
gpoirier
parents:
3326
diff
changeset
|
131 #else |
6310389a9688
Compile fix (for GCC<3.3) when encoders are disabled
gpoirier
parents:
3326
diff
changeset
|
132 static int w53_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h) {assert (0);} |
6310389a9688
Compile fix (for GCC<3.3) when encoders are disabled
gpoirier
parents:
3326
diff
changeset
|
133 static int w97_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h) {assert (0);} |
6310389a9688
Compile fix (for GCC<3.3) when encoders are disabled
gpoirier
parents:
3326
diff
changeset
|
134 #endif |
3223 | 135 |
136 /* C bits used by mmx/sse2/altivec */ | |
137 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
138 static av_always_inline void snow_interleave_line_header(int * i, int width, IDWTELEM * low, IDWTELEM * high){ |
3223 | 139 (*i) = (width) - 2; |
140 | |
141 if (width & 1){ | |
142 low[(*i)+1] = low[((*i)+1)>>1]; | |
143 (*i)--; | |
144 } | |
145 } | |
146 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
147 static av_always_inline void snow_interleave_line_footer(int * i, IDWTELEM * low, IDWTELEM * high){ |
3223 | 148 for (; (*i)>=0; (*i)-=2){ |
149 low[(*i)+1] = high[(*i)>>1]; | |
150 low[*i] = low[(*i)>>1]; | |
151 } | |
152 } | |
153 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
154 static av_always_inline void snow_horizontal_compose_lift_lead_out(int i, IDWTELEM * dst, IDWTELEM * src, IDWTELEM * ref, int width, int w, int lift_high, int mul, int add, int shift){ |
3223 | 155 for(; i<w; i++){ |
156 dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >> shift); | |
157 } | |
158 | |
159 if((width^lift_high)&1){ | |
160 dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift); | |
161 } | |
162 } | |
163 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5565
diff
changeset
|
164 static av_always_inline void snow_horizontal_compose_liftS_lead_out(int i, IDWTELEM * dst, IDWTELEM * src, IDWTELEM * ref, int width, int w){ |
3223 | 165 for(; i<w; i++){ |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5552
diff
changeset
|
166 dst[i] = src[i] + ((ref[i] + ref[(i+1)]+W_BO + 4 * src[i]) >> W_BS); |
3223 | 167 } |
168 | |
169 if(width&1){ | |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5552
diff
changeset
|
170 dst[w] = src[w] + ((2 * ref[w] + W_BO + 4 * src[w]) >> W_BS); |
3223 | 171 } |
172 } | |
173 | |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5589
diff
changeset
|
174 #endif /* FFMPEG_SNOW_H */ |