Mercurial > libavcodec.hg
annotate snow.c @ 10840:c76bc0410301 libavcodec
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
resulting code slightly. ~30% faster C 5/3 wavelet at the decoder side.
author | michael |
---|---|
date | Mon, 11 Jan 2010 00:54:48 +0000 |
parents | 2b0c54f9f9c2 |
children | 8f370ebde166 |
rev | line source |
---|---|
2138 | 1 /* |
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
3 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
2138 | 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:
3920
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
2138 | 10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
2138 | 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:
3920
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3035
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2138 | 19 */ |
20 | |
21 #include "avcodec.h" | |
22 #include "dsputil.h" | |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
23 #include "snow.h" |
2335 | 24 |
25 #include "rangecoder.h" | |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8611
diff
changeset
|
26 #include "mathops.h" |
2138 | 27 |
28 #include "mpegvideo.h" | |
29 | |
30 #undef NDEBUG | |
31 #include <assert.h> | |
32 | |
33 static const int8_t quant3[256]={ | |
34 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
42 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
43 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, | |
50 }; | |
51 static const int8_t quant3b[256]={ | |
52 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
53 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
54 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
55 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
63 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
64 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
68 }; | |
2596 | 69 static const int8_t quant3bA[256]={ |
70 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
71 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
72 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
73 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
74 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
75 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
76 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
84 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
85 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
86 }; | |
2138 | 87 static const int8_t quant5[256]={ |
88 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
89 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
96 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
97 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
98 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
99 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
100 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
101 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
102 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
104 }; | |
105 static const int8_t quant7[256]={ | |
106 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
107 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
108 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, | |
109 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
110 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
111 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
112 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
113 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
114 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
115 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
116 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
117 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
118 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
119 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, | |
120 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
121 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, | |
122 }; | |
123 static const int8_t quant9[256]={ | |
124 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
125 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
126 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
127 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
128 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
129 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
130 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
131 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
132 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
133 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
134 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
135 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
136 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
137 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
138 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
139 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
140 }; | |
141 static const int8_t quant11[256]={ | |
142 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, | |
143 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
144 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
145 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
146 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
147 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
148 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
149 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
150 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
151 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
152 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
153 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
154 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
155 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
156 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
157 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
158 }; | |
159 static const int8_t quant13[256]={ | |
160 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
161 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
162 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
163 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
164 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
165 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
166 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
167 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
168 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
169 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
170 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
171 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
172 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
173 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
174 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
175 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
176 }; | |
177 | |
178 #if 0 //64*cubic | |
179 static const uint8_t obmc32[1024]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
180 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
181 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
182 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
183 0, 0, 4, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 28, 32, 32, 32, 32, 28, 28, 24, 24, 20, 16, 16, 12, 8, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
184 0, 0, 4, 8, 8, 12, 16, 24, 28, 32, 36, 40, 44, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 24, 16, 12, 8, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
185 0, 4, 4, 8, 12, 20, 24, 32, 40, 44, 52, 56, 60, 64, 68, 72, 72, 68, 64, 60, 56, 52, 44, 40, 32, 24, 20, 12, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
186 0, 4, 4, 12, 16, 24, 32, 40, 52, 60, 68, 76, 80, 88, 88, 92, 92, 88, 88, 80, 76, 68, 60, 52, 40, 32, 24, 16, 12, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
187 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, 84, 92,100,108,112,116,116,112,108,100, 92, 84, 76, 64, 52, 40, 32, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
188 0, 4, 8, 16, 28, 40, 52, 64, 76, 88,100,112,124,132,136,140,140,136,132,124,112,100, 88, 76, 64, 52, 40, 28, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
189 0, 4, 12, 20, 32, 44, 60, 76, 88,104,120,132,144,152,160,164,164,160,152,144,132,120,104, 88, 76, 60, 44, 32, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
190 0, 4, 12, 24, 36, 48, 68, 84,100,120,136,152,164,176,180,184,184,180,176,164,152,136,120,100, 84, 68, 48, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
191 0, 4, 12, 24, 40, 56, 76, 92,112,132,152,168,180,192,204,208,208,204,192,180,168,152,132,112, 92, 76, 56, 40, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
192 0, 4, 16, 28, 44, 60, 80,100,124,144,164,180,196,208,220,224,224,220,208,196,180,164,144,124,100, 80, 60, 44, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
193 0, 8, 16, 28, 48, 64, 88,108,132,152,176,192,208,224,232,240,240,232,224,208,192,176,152,132,108, 88, 64, 48, 28, 16, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
194 0, 4, 16, 32, 48, 68, 88,112,136,160,180,204,220,232,244,248,248,244,232,220,204,180,160,136,112, 88, 68, 48, 32, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
195 1, 8, 16, 32, 48, 72, 92,116,140,164,184,208,224,240,248,255,255,248,240,224,208,184,164,140,116, 92, 72, 48, 32, 16, 8, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
196 1, 8, 16, 32, 48, 72, 92,116,140,164,184,208,224,240,248,255,255,248,240,224,208,184,164,140,116, 92, 72, 48, 32, 16, 8, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
197 0, 4, 16, 32, 48, 68, 88,112,136,160,180,204,220,232,244,248,248,244,232,220,204,180,160,136,112, 88, 68, 48, 32, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
198 0, 8, 16, 28, 48, 64, 88,108,132,152,176,192,208,224,232,240,240,232,224,208,192,176,152,132,108, 88, 64, 48, 28, 16, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
199 0, 4, 16, 28, 44, 60, 80,100,124,144,164,180,196,208,220,224,224,220,208,196,180,164,144,124,100, 80, 60, 44, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
200 0, 4, 12, 24, 40, 56, 76, 92,112,132,152,168,180,192,204,208,208,204,192,180,168,152,132,112, 92, 76, 56, 40, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
201 0, 4, 12, 24, 36, 48, 68, 84,100,120,136,152,164,176,180,184,184,180,176,164,152,136,120,100, 84, 68, 48, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
202 0, 4, 12, 20, 32, 44, 60, 76, 88,104,120,132,144,152,160,164,164,160,152,144,132,120,104, 88, 76, 60, 44, 32, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
203 0, 4, 8, 16, 28, 40, 52, 64, 76, 88,100,112,124,132,136,140,140,136,132,124,112,100, 88, 76, 64, 52, 40, 28, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
204 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, 84, 92,100,108,112,116,116,112,108,100, 92, 84, 76, 64, 52, 40, 32, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
205 0, 4, 4, 12, 16, 24, 32, 40, 52, 60, 68, 76, 80, 88, 88, 92, 92, 88, 88, 80, 76, 68, 60, 52, 40, 32, 24, 16, 12, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
206 0, 4, 4, 8, 12, 20, 24, 32, 40, 44, 52, 56, 60, 64, 68, 72, 72, 68, 64, 60, 56, 52, 44, 40, 32, 24, 20, 12, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
207 0, 0, 4, 8, 8, 12, 16, 24, 28, 32, 36, 40, 44, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 24, 16, 12, 8, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
208 0, 0, 4, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 28, 32, 32, 32, 32, 28, 28, 24, 24, 20, 16, 16, 12, 8, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
209 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
210 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
2138 | 212 //error:0.000022 |
213 }; | |
214 static const uint8_t obmc16[256]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
215 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
216 0, 4, 4, 8, 16, 20, 20, 24, 24, 20, 20, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
217 0, 4, 16, 24, 36, 44, 52, 60, 60, 52, 44, 36, 24, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
218 0, 8, 24, 44, 60, 80, 96,104,104, 96, 80, 60, 44, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
219 0, 16, 36, 60, 92,116,136,152,152,136,116, 92, 60, 36, 16, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
220 0, 20, 44, 80,116,152,180,196,196,180,152,116, 80, 44, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
221 4, 20, 52, 96,136,180,212,228,228,212,180,136, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
222 4, 24, 60,104,152,196,228,248,248,228,196,152,104, 60, 24, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
223 4, 24, 60,104,152,196,228,248,248,228,196,152,104, 60, 24, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
224 4, 20, 52, 96,136,180,212,228,228,212,180,136, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
225 0, 20, 44, 80,116,152,180,196,196,180,152,116, 80, 44, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
226 0, 16, 36, 60, 92,116,136,152,152,136,116, 92, 60, 36, 16, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
227 0, 8, 24, 44, 60, 80, 96,104,104, 96, 80, 60, 44, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
228 0, 4, 16, 24, 36, 44, 52, 60, 60, 52, 44, 36, 24, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
229 0, 4, 4, 8, 16, 20, 20, 24, 24, 20, 20, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
230 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
2138 | 231 //error:0.000033 |
232 }; | |
233 #elif 1 // 64*linear | |
234 static const uint8_t obmc32[1024]={ | |
3206 | 235 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, |
236 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0, | |
237 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0, | |
238 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0, | |
239 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4, | |
240 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4, | |
241 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4, | |
242 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4, | |
243 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4, | |
244 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4, | |
245 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4, | |
246 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4, | |
247 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8, | |
248 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8, | |
249 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8, | |
250 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8, | |
251 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8, | |
252 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8, | |
253 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8, | |
254 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8, | |
255 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4, | |
256 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4, | |
257 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4, | |
258 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4, | |
259 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4, | |
260 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4, | |
261 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4, | |
262 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4, | |
263 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0, | |
264 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0, | |
265 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0, | |
266 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, | |
2138 | 267 //error:0.000020 |
268 }; | |
269 static const uint8_t obmc16[256]={ | |
3206 | 270 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, |
271 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
272 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
273 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
274 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
275 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
276 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
277 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
278 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
279 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
280 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
281 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
282 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
283 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
284 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
285 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, | |
2138 | 286 //error:0.000015 |
287 }; | |
288 #else //64*cos | |
289 static const uint8_t obmc32[1024]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
290 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
291 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
292 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
293 0, 0, 4, 4, 4, 8, 8, 12, 16, 20, 20, 24, 28, 28, 28, 28, 28, 28, 28, 28, 24, 20, 20, 16, 12, 8, 8, 4, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
294 0, 0, 4, 4, 8, 12, 16, 20, 24, 28, 36, 40, 44, 44, 48, 48, 48, 48, 44, 44, 40, 36, 28, 24, 20, 16, 12, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
295 0, 0, 4, 8, 12, 20, 24, 32, 36, 44, 48, 56, 60, 64, 68, 68, 68, 68, 64, 60, 56, 48, 44, 36, 32, 24, 20, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
296 0, 4, 4, 8, 16, 24, 32, 40, 48, 60, 68, 76, 80, 84, 88, 92, 92, 88, 84, 80, 76, 68, 60, 48, 40, 32, 24, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
297 0, 4, 8, 12, 20, 32, 40, 52, 64, 76, 84, 96,104,108,112,116,116,112,108,104, 96, 84, 76, 64, 52, 40, 32, 20, 12, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
298 0, 4, 8, 16, 24, 36, 48, 64, 76, 92,104,116,124,132,136,140,140,136,132,124,116,104, 92, 76, 64, 48, 36, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
299 0, 4, 12, 20, 28, 44, 60, 76, 92,104,120,136,148,156,160,164,164,160,156,148,136,120,104, 92, 76, 60, 44, 28, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
300 0, 4, 12, 20, 36, 48, 68, 84,104,120,140,152,168,176,184,188,188,184,176,168,152,140,120,104, 84, 68, 48, 36, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
301 0, 4, 12, 24, 36, 56, 76, 96,116,136,152,172,184,196,204,208,208,204,196,184,172,152,136,116, 96, 76, 56, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
302 0, 4, 12, 24, 44, 60, 80,104,124,148,168,184,200,212,224,228,228,224,212,200,184,168,148,124,104, 80, 60, 44, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
303 0, 4, 12, 28, 44, 64, 84,108,132,156,176,196,212,228,236,240,240,236,228,212,196,176,156,132,108, 84, 64, 44, 28, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
304 0, 4, 16, 28, 48, 68, 88,112,136,160,184,204,224,236,244,252,252,244,236,224,204,184,160,136,112, 88, 68, 48, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
305 1, 4, 16, 28, 48, 68, 92,116,140,164,188,208,228,240,252,255,255,252,240,228,208,188,164,140,116, 92, 68, 48, 28, 16, 4, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
306 1, 4, 16, 28, 48, 68, 92,116,140,164,188,208,228,240,252,255,255,252,240,228,208,188,164,140,116, 92, 68, 48, 28, 16, 4, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
307 0, 4, 16, 28, 48, 68, 88,112,136,160,184,204,224,236,244,252,252,244,236,224,204,184,160,136,112, 88, 68, 48, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
308 0, 4, 12, 28, 44, 64, 84,108,132,156,176,196,212,228,236,240,240,236,228,212,196,176,156,132,108, 84, 64, 44, 28, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
309 0, 4, 12, 24, 44, 60, 80,104,124,148,168,184,200,212,224,228,228,224,212,200,184,168,148,124,104, 80, 60, 44, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
310 0, 4, 12, 24, 36, 56, 76, 96,116,136,152,172,184,196,204,208,208,204,196,184,172,152,136,116, 96, 76, 56, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
311 0, 4, 12, 20, 36, 48, 68, 84,104,120,140,152,168,176,184,188,188,184,176,168,152,140,120,104, 84, 68, 48, 36, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
312 0, 4, 12, 20, 28, 44, 60, 76, 92,104,120,136,148,156,160,164,164,160,156,148,136,120,104, 92, 76, 60, 44, 28, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
313 0, 4, 8, 16, 24, 36, 48, 64, 76, 92,104,116,124,132,136,140,140,136,132,124,116,104, 92, 76, 64, 48, 36, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
314 0, 4, 8, 12, 20, 32, 40, 52, 64, 76, 84, 96,104,108,112,116,116,112,108,104, 96, 84, 76, 64, 52, 40, 32, 20, 12, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
315 0, 4, 4, 8, 16, 24, 32, 40, 48, 60, 68, 76, 80, 84, 88, 92, 92, 88, 84, 80, 76, 68, 60, 48, 40, 32, 24, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
316 0, 0, 4, 8, 12, 20, 24, 32, 36, 44, 48, 56, 60, 64, 68, 68, 68, 68, 64, 60, 56, 48, 44, 36, 32, 24, 20, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
317 0, 0, 4, 4, 8, 12, 16, 20, 24, 28, 36, 40, 44, 44, 48, 48, 48, 48, 44, 44, 40, 36, 28, 24, 20, 16, 12, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
318 0, 0, 4, 4, 4, 8, 8, 12, 16, 20, 20, 24, 28, 28, 28, 28, 28, 28, 28, 28, 24, 20, 20, 16, 12, 8, 8, 4, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
319 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
320 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
2138 | 322 //error:0.000022 |
323 }; | |
324 static const uint8_t obmc16[256]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
325 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
326 0, 0, 4, 8, 12, 16, 20, 20, 20, 20, 16, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
327 0, 4, 12, 24, 32, 44, 52, 56, 56, 52, 44, 32, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
328 0, 8, 24, 40, 60, 80, 96,104,104, 96, 80, 60, 40, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
329 0, 12, 32, 64, 92,120,140,152,152,140,120, 92, 64, 32, 12, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
330 4, 16, 44, 80,120,156,184,196,196,184,156,120, 80, 44, 16, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
331 4, 20, 52, 96,140,184,216,232,232,216,184,140, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
332 0, 20, 56,104,152,196,232,252,252,232,196,152,104, 56, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
333 0, 20, 56,104,152,196,232,252,252,232,196,152,104, 56, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
334 4, 20, 52, 96,140,184,216,232,232,216,184,140, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
335 4, 16, 44, 80,120,156,184,196,196,184,156,120, 80, 44, 16, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
336 0, 12, 32, 64, 92,120,140,152,152,140,120, 92, 64, 32, 12, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
337 0, 8, 24, 40, 60, 80, 96,104,104, 96, 80, 60, 40, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
338 0, 4, 12, 24, 32, 44, 52, 56, 56, 52, 44, 32, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
339 0, 0, 4, 8, 12, 16, 20, 20, 20, 20, 16, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
340 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
2138 | 341 //error:0.000022 |
342 }; | |
5910 | 343 #endif /* 0 */ |
2138 | 344 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
345 //linear *64 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
346 static const uint8_t obmc8[64]={ |
3206 | 347 4, 12, 20, 28, 28, 20, 12, 4, |
348 12, 36, 60, 84, 84, 60, 36, 12, | |
349 20, 60,100,140,140,100, 60, 20, | |
350 28, 84,140,196,196,140, 84, 28, | |
351 28, 84,140,196,196,140, 84, 28, | |
352 20, 60,100,140,140,100, 60, 20, | |
353 12, 36, 60, 84, 84, 60, 36, 12, | |
354 4, 12, 20, 28, 28, 20, 12, 4, | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
355 //error:0.000000 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
356 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
357 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
358 //linear *64 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
359 static const uint8_t obmc4[16]={ |
3206 | 360 16, 48, 48, 16, |
361 48,144,144, 48, | |
362 48,144,144, 48, | |
363 16, 48, 48, 16, | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
364 //error:0.000000 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
365 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
366 |
7129 | 367 static const uint8_t * const obmc_tab[4]={ |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
368 obmc32, obmc16, obmc8, obmc4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
369 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
370 |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
371 static int scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES]; |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
372 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
373 typedef struct BlockNode{ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
374 int16_t mx; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
375 int16_t my; |
3314 | 376 uint8_t ref; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
377 uint8_t color[3]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
378 uint8_t type; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
379 //#define TYPE_SPLIT 1 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
380 #define BLOCK_INTRA 1 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
381 #define BLOCK_OPT 2 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
382 //#define TYPE_NOCOLOR 4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
383 uint8_t level; //FIXME merge into type? |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
384 }BlockNode; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
385 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
386 static const BlockNode null_block= { //FIXME add border maybe |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
387 .color= {128,128,128}, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
388 .mx= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
389 .my= 0, |
3314 | 390 .ref= 0, |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
391 .type= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
392 .level= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
393 }; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
394 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
395 #define LOG2_MB_SIZE 4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
396 #define MB_SIZE (1<<LOG2_MB_SIZE) |
5575 | 397 #define ENCODER_EXTRA_BITS 4 |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
398 #define HTAPS_MAX 8 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
399 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
400 typedef struct x_and_coeff{ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
401 int16_t x; |
2596 | 402 uint16_t coeff; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
403 } x_and_coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
404 |
2138 | 405 typedef struct SubBand{ |
406 int level; | |
407 int stride; | |
408 int width; | |
409 int height; | |
6412 | 410 int qlog; ///< log(qscale)/log[2^(1/6)] |
2138 | 411 DWTELEM *buf; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
412 IDWTELEM *ibuf; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
413 int buf_x_offset; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
414 int buf_y_offset; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
415 int stride_line; ///< Stride measured in lines, not pixels. |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
416 x_and_coeff * x_coeff; |
2138 | 417 struct SubBand *parent; |
418 uint8_t state[/*7*2*/ 7 + 512][32]; | |
419 }SubBand; | |
420 | |
421 typedef struct Plane{ | |
422 int width; | |
423 int height; | |
424 SubBand band[MAX_DECOMPOSITIONS][4]; | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
425 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
426 int htaps; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
427 int8_t hcoeff[HTAPS_MAX/2]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
428 int diag_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
429 int fast_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
430 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
431 int last_htaps; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
432 int8_t last_hcoeff[HTAPS_MAX/2]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
433 int last_diag_mc; |
2138 | 434 }Plane; |
435 | |
436 typedef struct SnowContext{ | |
437 | |
438 AVCodecContext *avctx; | |
2335 | 439 RangeCoder c; |
2138 | 440 DSPContext dsp; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
441 AVFrame new_picture; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
442 AVFrame input_picture; ///< new_picture with the internal linesizes |
2138 | 443 AVFrame current_picture; |
3314 | 444 AVFrame last_picture[MAX_REF_FRAMES]; |
5633
873ea64637d9
code to do halfpel interpolation per frame (unfinished and under ifdef but it
michael
parents:
5627
diff
changeset
|
445 uint8_t *halfpel_plane[MAX_REF_FRAMES][4][4]; |
2138 | 446 AVFrame mconly_picture; |
447 // uint8_t q_context[16]; | |
448 uint8_t header_state[32]; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
449 uint8_t block_state[128 + 32*128]; |
2138 | 450 int keyframe; |
2199 | 451 int always_reset; |
2138 | 452 int version; |
453 int spatial_decomposition_type; | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
454 int last_spatial_decomposition_type; |
2138 | 455 int temporal_decomposition_type; |
456 int spatial_decomposition_count; | |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
457 int last_spatial_decomposition_count; |
2138 | 458 int temporal_decomposition_count; |
3314 | 459 int max_ref_frames; |
460 int ref_frames; | |
461 int16_t (*ref_mvs[MAX_REF_FRAMES])[2]; | |
462 uint32_t *ref_scores[MAX_REF_FRAMES]; | |
2138 | 463 DWTELEM *spatial_dwt_buffer; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
464 IDWTELEM *spatial_idwt_buffer; |
2138 | 465 int colorspace_type; |
466 int chroma_h_shift; | |
467 int chroma_v_shift; | |
468 int spatial_scalability; | |
469 int qlog; | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
470 int last_qlog; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
471 int lambda; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
472 int lambda2; |
3313 | 473 int pass1_rc; |
2138 | 474 int mv_scale; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
475 int last_mv_scale; |
2138 | 476 int qbias; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
477 int last_qbias; |
2138 | 478 #define QBIAS_SHIFT 3 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
479 int b_width; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
480 int b_height; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
481 int block_max_depth; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
482 int last_block_max_depth; |
2138 | 483 Plane plane[MAX_PLANES]; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
484 BlockNode *block; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
485 #define ME_CACHE_SIZE 1024 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
486 int me_cache[ME_CACHE_SIZE]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
487 int me_cache_generation; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
488 slice_buffer sb; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
489 |
6412 | 490 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to eventually make the motion estimation independent of MpegEncContext, so this will be removed then (FIXME/XXX) |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
491 |
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
492 uint8_t *scratchbuf; |
2138 | 493 }SnowContext; |
494 | |
2562 | 495 typedef struct { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
496 IDWTELEM *b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
497 IDWTELEM *b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
498 IDWTELEM *b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
499 IDWTELEM *b3; |
2562 | 500 int y; |
8308 | 501 } DWTCompose; |
2562 | 502 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
503 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num))) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
504 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num))) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
505 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
506 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM * base_buffer) |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
507 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
508 int i; |
2967 | 509 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
510 buf->base_buffer = base_buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
511 buf->line_count = line_count; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
512 buf->line_width = line_width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
513 buf->data_count = max_allocated_lines; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
514 buf->line = av_mallocz (sizeof(IDWTELEM *) * line_count); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
515 buf->data_stack = av_malloc (sizeof(IDWTELEM *) * max_allocated_lines); |
2967 | 516 |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
517 for(i = 0; i < max_allocated_lines; i++){ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
518 buf->data_stack[i] = av_malloc (sizeof(IDWTELEM) * line_width); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
519 } |
2967 | 520 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
521 buf->data_stack_top = max_allocated_lines - 1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
522 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
523 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
524 static IDWTELEM * slice_buffer_load_line(slice_buffer * buf, int line) |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
525 { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
526 IDWTELEM * buffer; |
2967 | 527 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
528 assert(buf->data_stack_top >= 0); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
529 // assert(!buf->line[line]); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
530 if (buf->line[line]) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
531 return buf->line[line]; |
2967 | 532 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
533 buffer = buf->data_stack[buf->data_stack_top]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
534 buf->data_stack_top--; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
535 buf->line[line] = buffer; |
2967 | 536 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
537 return buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
538 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
539 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
540 static void slice_buffer_release(slice_buffer * buf, int line) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
541 { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
542 IDWTELEM * buffer; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
543 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
544 assert(line >= 0 && line < buf->line_count); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
545 assert(buf->line[line]); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
546 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
547 buffer = buf->line[line]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
548 buf->data_stack_top++; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
549 buf->data_stack[buf->data_stack_top] = buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
550 buf->line[line] = NULL; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
551 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
552 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
553 static void slice_buffer_flush(slice_buffer * buf) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
554 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
555 int i; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
556 for(i = 0; i < buf->line_count; i++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
557 if (buf->line[i]) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
558 slice_buffer_release(buf, i); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
559 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
560 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
561 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
562 static void slice_buffer_destroy(slice_buffer * buf) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
563 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
564 int i; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
565 slice_buffer_flush(buf); |
2967 | 566 |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
567 for(i = buf->data_count - 1; i >= 0; i--){ |
3190 | 568 av_freep(&buf->data_stack[i]); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
569 } |
3190 | 570 av_freep(&buf->data_stack); |
571 av_freep(&buf->line); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
572 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
573 |
2979 | 574 #ifdef __sgi |
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
575 // Avoid a name clash on SGI IRIX |
2979 | 576 #undef qexp |
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
577 #endif |
2246 | 578 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0 |
2600 | 579 static uint8_t qexp[QROOT]; |
2138 | 580 |
581 static inline int mirror(int v, int m){ | |
2998 | 582 while((unsigned)v > (unsigned)m){ |
583 v=-v; | |
584 if(v<0) v+= 2*m; | |
585 } | |
586 return v; | |
2138 | 587 } |
588 | |
2335 | 589 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
2138 | 590 int i; |
591 | |
592 if(v){ | |
4001 | 593 const int a= FFABS(v); |
2138 | 594 const int e= av_log2(a); |
595 #if 1 | |
2967 | 596 const int el= FFMIN(e, 10); |
2335 | 597 put_rac(c, state+0, 0); |
2138 | 598 |
599 for(i=0; i<el; i++){ | |
2335 | 600 put_rac(c, state+1+i, 1); //1..10 |
2138 | 601 } |
602 for(; i<e; i++){ | |
2335 | 603 put_rac(c, state+1+9, 1); //1..10 |
2138 | 604 } |
2335 | 605 put_rac(c, state+1+FFMIN(i,9), 0); |
2138 | 606 |
607 for(i=e-1; i>=el; i--){ | |
2335 | 608 put_rac(c, state+22+9, (a>>i)&1); //22..31 |
2138 | 609 } |
610 for(; i>=0; i--){ | |
2335 | 611 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 612 } |
613 | |
614 if(is_signed) | |
2335 | 615 put_rac(c, state+11 + el, v < 0); //11..21 |
2138 | 616 #else |
2967 | 617 |
2335 | 618 put_rac(c, state+0, 0); |
2138 | 619 if(e<=9){ |
620 for(i=0; i<e; i++){ | |
2335 | 621 put_rac(c, state+1+i, 1); //1..10 |
2138 | 622 } |
2335 | 623 put_rac(c, state+1+i, 0); |
2138 | 624 |
625 for(i=e-1; i>=0; i--){ | |
2335 | 626 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 627 } |
628 | |
629 if(is_signed) | |
2335 | 630 put_rac(c, state+11 + e, v < 0); //11..21 |
2138 | 631 }else{ |
632 for(i=0; i<e; i++){ | |
2335 | 633 put_rac(c, state+1+FFMIN(i,9), 1); //1..10 |
2138 | 634 } |
9540 | 635 put_rac(c, state+1+9, 0); |
2138 | 636 |
637 for(i=e-1; i>=0; i--){ | |
2335 | 638 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 |
2138 | 639 } |
640 | |
641 if(is_signed) | |
9540 | 642 put_rac(c, state+11 + 10, v < 0); //11..21 |
2138 | 643 } |
5910 | 644 #endif /* 1 */ |
2138 | 645 }else{ |
2335 | 646 put_rac(c, state+0, 1); |
2138 | 647 } |
648 } | |
649 | |
2335 | 650 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
651 if(get_rac(c, state+0)) | |
2138 | 652 return 0; |
653 else{ | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
654 int i, e, a; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
655 e= 0; |
2335 | 656 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10 |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
657 e++; |
2138 | 658 } |
659 | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
660 a= 1; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
661 for(i=e-1; i>=0; i--){ |
2335 | 662 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31 |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
663 } |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
664 |
9546 | 665 e= -(is_signed && get_rac(c, state+11 + FFMIN(e,10))); //11..21 |
666 return (a^e)-e; | |
2138 | 667 } |
668 } | |
669 | |
2335 | 670 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){ |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
671 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
672 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
673 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
674 assert(v>=0); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
675 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
676 |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
677 while(v >= r){ |
2335 | 678 put_rac(c, state+4+log2, 1); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
679 v -= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
680 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
681 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
682 } |
2335 | 683 put_rac(c, state+4+log2, 0); |
2967 | 684 |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
685 for(i=log2-1; i>=0; i--){ |
2335 | 686 put_rac(c, state+31-i, (v>>i)&1); |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
687 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
688 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
689 |
2335 | 690 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){ |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
691 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
692 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
693 int v=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
694 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
695 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
696 |
2335 | 697 while(get_rac(c, state+4+log2)){ |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
698 v+= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
699 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
700 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
701 } |
2967 | 702 |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
703 for(i=log2-1; i>=0; i--){ |
2335 | 704 v+= get_rac(c, state+31-i)<<i; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
705 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
706 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
707 return v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
708 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
709 |
5627 | 710 static av_always_inline void |
711 lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, | |
712 int dst_step, int src_step, int ref_step, | |
713 int width, int mul, int add, int shift, | |
714 int highpass, int inverse){ | |
2138 | 715 const int mirror_left= !highpass; |
716 const int mirror_right= (width&1) ^ highpass; | |
717 const int w= (width>>1) - 1 + (highpass & width); | |
718 int i; | |
719 | |
720 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) | |
721 if(mirror_left){ | |
722 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); | |
723 dst += dst_step; | |
724 src += src_step; | |
725 } | |
2967 | 726 |
2138 | 727 for(i=0; i<w; i++){ |
5627 | 728 dst[i*dst_step] = |
729 LIFT(src[i*src_step], | |
730 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), | |
731 inverse); | |
2138 | 732 } |
2967 | 733 |
2138 | 734 if(mirror_right){ |
5627 | 735 dst[w*dst_step] = |
736 LIFT(src[w*src_step], | |
737 ((mul*2*ref[w*ref_step]+add)>>shift), | |
738 inverse); | |
2138 | 739 } |
740 } | |
741 | |
5627 | 742 static av_always_inline void |
743 inv_lift(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref, | |
744 int dst_step, int src_step, int ref_step, | |
745 int width, int mul, int add, int shift, | |
746 int highpass, int inverse){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
747 const int mirror_left= !highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
748 const int mirror_right= (width&1) ^ highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
749 const int w= (width>>1) - 1 + (highpass & width); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
750 int i; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
751 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
752 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
753 if(mirror_left){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
754 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
755 dst += dst_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
756 src += src_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
757 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
758 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
759 for(i=0; i<w; i++){ |
5627 | 760 dst[i*dst_step] = |
761 LIFT(src[i*src_step], | |
762 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), | |
763 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
764 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
765 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
766 if(mirror_right){ |
5627 | 767 dst[w*dst_step] = |
768 LIFT(src[w*src_step], | |
769 ((mul*2*ref[w*ref_step]+add)>>shift), | |
770 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
771 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
772 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
773 |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
774 #ifndef liftS |
5627 | 775 static av_always_inline void |
776 liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, | |
777 int dst_step, int src_step, int ref_step, | |
778 int width, int mul, int add, int shift, | |
779 int highpass, int inverse){ | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
780 const int mirror_left= !highpass; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
781 const int mirror_right= (width&1) ^ highpass; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
782 const int w= (width>>1) - 1 + (highpass & width); |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
783 int i; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
784 |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
785 assert(shift == 4); |
5627 | 786 #define LIFTS(src, ref, inv) \ |
787 ((inv) ? \ | |
788 (src) + (((ref) + 4*(src))>>shift): \ | |
789 -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23))) | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
790 if(mirror_left){ |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
791 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
792 dst += dst_step; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
793 src += src_step; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
794 } |
2967 | 795 |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
796 for(i=0; i<w; i++){ |
5627 | 797 dst[i*dst_step] = |
798 LIFTS(src[i*src_step], | |
799 mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, | |
800 inverse); | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
801 } |
2967 | 802 |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
803 if(mirror_right){ |
5627 | 804 dst[w*dst_step] = |
805 LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
806 } |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
807 } |
5627 | 808 static av_always_inline void |
809 inv_liftS(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref, | |
810 int dst_step, int src_step, int ref_step, | |
811 int width, int mul, int add, int shift, | |
812 int highpass, int inverse){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
813 const int mirror_left= !highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
814 const int mirror_right= (width&1) ^ highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
815 const int w= (width>>1) - 1 + (highpass & width); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
816 int i; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
817 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
818 assert(shift == 4); |
5627 | 819 #define LIFTS(src, ref, inv) \ |
820 ((inv) ? \ | |
821 (src) + (((ref) + 4*(src))>>shift): \ | |
822 -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23))) | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
823 if(mirror_left){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
824 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
825 dst += dst_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
826 src += src_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
827 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
828 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
829 for(i=0; i<w; i++){ |
5627 | 830 dst[i*dst_step] = |
831 LIFTS(src[i*src_step], | |
832 mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, | |
833 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
834 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
835 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
836 if(mirror_right){ |
5627 | 837 dst[w*dst_step] = |
838 LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
839 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
840 } |
6413 | 841 #endif /* ! liftS */ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
842 |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
843 static void horizontal_decompose53i(DWTELEM *b, int width){ |
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
844 DWTELEM temp[width]; |
2138 | 845 const int width2= width>>1; |
2893 | 846 int x; |
2138 | 847 const int w2= (width+1)>>1; |
848 | |
849 for(x=0; x<width2; x++){ | |
850 temp[x ]= b[2*x ]; | |
851 temp[x+w2]= b[2*x + 1]; | |
852 } | |
853 if(width&1) | |
854 temp[x ]= b[2*x ]; | |
855 #if 0 | |
2893 | 856 { |
857 int A1,A2,A3,A4; | |
2138 | 858 A2= temp[1 ]; |
859 A4= temp[0 ]; | |
860 A1= temp[0+width2]; | |
861 A1 -= (A2 + A4)>>1; | |
862 A4 += (A1 + 1)>>1; | |
863 b[0+width2] = A1; | |
864 b[0 ] = A4; | |
865 for(x=1; x+1<width2; x+=2){ | |
866 A3= temp[x+width2]; | |
867 A4= temp[x+1 ]; | |
868 A3 -= (A2 + A4)>>1; | |
869 A2 += (A1 + A3 + 2)>>2; | |
870 b[x+width2] = A3; | |
871 b[x ] = A2; | |
872 | |
873 A1= temp[x+1+width2]; | |
874 A2= temp[x+2 ]; | |
875 A1 -= (A2 + A4)>>1; | |
876 A4 += (A1 + A3 + 2)>>2; | |
877 b[x+1+width2] = A1; | |
878 b[x+1 ] = A4; | |
879 } | |
880 A3= temp[width-1]; | |
881 A3 -= A2; | |
882 A2 += (A1 + A3 + 2)>>2; | |
883 b[width -1] = A3; | |
884 b[width2-1] = A2; | |
2893 | 885 } |
2967 | 886 #else |
2138 | 887 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0); |
888 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0); | |
6413 | 889 #endif /* 0 */ |
2138 | 890 } |
891 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
892 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 893 int i; |
2967 | 894 |
2138 | 895 for(i=0; i<width; i++){ |
896 b1[i] -= (b0[i] + b2[i])>>1; | |
897 } | |
898 } | |
899 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
900 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 901 int i; |
2967 | 902 |
2138 | 903 for(i=0; i<width; i++){ |
904 b1[i] += (b0[i] + b2[i] + 2)>>2; | |
905 } | |
906 } | |
907 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
908 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 909 int y; |
2138 | 910 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride; |
911 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride; | |
2967 | 912 |
2138 | 913 for(y=-2; y<height; y+=2){ |
914 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
915 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
916 | |
2998 | 917 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width); |
918 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width); | |
6405 | 919 |
2998 | 920 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width); |
921 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width); | |
2967 | 922 |
2138 | 923 b0=b2; |
924 b1=b3; | |
925 } | |
926 } | |
927 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
928 static void horizontal_decompose97i(DWTELEM *b, int width){ |
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
929 DWTELEM temp[width]; |
2138 | 930 const int w2= (width+1)>>1; |
931 | |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
932 lift (temp+w2, b +1, b , 1, 2, 2, width, W_AM, W_AO, W_AS, 1, 1); |
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
933 liftS(temp , b , temp+w2, 1, 2, 1, width, W_BM, W_BO, W_BS, 0, 0); |
5589
946c2db0a093
cleanup (remove some old experimentation related code)
michael
parents:
5588
diff
changeset
|
934 lift (b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0); |
2138 | 935 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0); |
936 } | |
937 | |
938 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
939 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 940 int i; |
2967 | 941 |
2138 | 942 for(i=0; i<width; i++){ |
943 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
944 } | |
945 } | |
946 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
947 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 948 int i; |
2967 | 949 |
2138 | 950 for(i=0; i<width; i++){ |
951 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
952 } | |
953 } | |
954 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
955 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 956 int i; |
2967 | 957 |
2138 | 958 for(i=0; i<width; i++){ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
959 #ifdef liftS |
2138 | 960 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
961 #else |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
962 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + W_BO*5 + (5<<27)) / (5*16) - (1<<23); |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
963 #endif |
2138 | 964 } |
965 } | |
966 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
967 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 968 int i; |
2967 | 969 |
2138 | 970 for(i=0; i<width; i++){ |
971 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
972 } | |
973 } | |
974 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
975 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 976 int y; |
2138 | 977 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride; |
978 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride; | |
979 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride; | |
980 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride; | |
2967 | 981 |
2138 | 982 for(y=-4; y<height; y+=2){ |
983 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
984 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
985 | |
2998 | 986 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width); |
987 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width); | |
6405 | 988 |
2998 | 989 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width); |
990 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width); | |
991 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width); | |
992 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width); | |
2138 | 993 |
994 b0=b2; | |
995 b1=b3; | |
996 b2=b4; | |
997 b3=b5; | |
998 } | |
999 } | |
1000 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1001 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1002 int level; |
2967 | 1003 |
2164 | 1004 for(level=0; level<decomposition_count; level++){ |
1005 switch(type){ | |
3326 | 1006 case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break; |
1007 case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break; | |
2138 | 1008 } |
1009 } | |
1010 } | |
1011 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1012 static void horizontal_compose53i(IDWTELEM *b, int width){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1013 IDWTELEM temp[width]; |
2138 | 1014 const int width2= width>>1; |
1015 const int w2= (width+1)>>1; | |
2893 | 1016 int x; |
2138 | 1017 |
1018 for(x=0; x<width2; x++){ | |
10840
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1019 temp[2*x ]= b[x ]; |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1020 temp[2*x + 1]= b[x+w2]; |
2138 | 1021 } |
1022 if(width&1) | |
10840
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1023 temp[2*x ]= b[x ]; |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1024 |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1025 b[0] = temp[0] - ((temp[1]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1026 for(x=2; x<width-1; x+=2){ |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1027 b[x ] = temp[x ] - ((temp[x-1] + temp[x+1]+2)>>2); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1028 b[x-1] = temp[x-1] + ((b [x-2] + b [x ]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1029 } |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1030 if(width&1){ |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1031 b[x ] = temp[x ] - ((temp[x-1]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1032 b[x-1] = temp[x-1] + ((b [x-2] + b [x ]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1033 }else |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1034 b[x-1] = temp[x-1] + b[x-2]; |
2138 | 1035 } |
1036 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1037 static void vertical_compose53iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1038 int i; |
2967 | 1039 |
2138 | 1040 for(i=0; i<width; i++){ |
1041 b1[i] += (b0[i] + b2[i])>>1; | |
1042 } | |
1043 } | |
1044 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1045 static void vertical_compose53iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1046 int i; |
2967 | 1047 |
2138 | 1048 for(i=0; i<width; i++){ |
1049 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
1050 } | |
1051 } | |
1052 | |
8308 | 1053 static void spatial_compose53i_buffered_init(DWTCompose *cs, slice_buffer * sb, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1054 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1055 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1056 cs->y = -1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1057 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1058 |
8308 | 1059 static void spatial_compose53i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1060 cs->b0 = buffer + mirror(-1-1, height-1)*stride; |
1061 cs->b1 = buffer + mirror(-1 , height-1)*stride; | |
1062 cs->y = -1; | |
1063 } | |
1064 | |
8308 | 1065 static void spatial_compose53i_dy_buffered(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1066 int y= cs->y; |
2967 | 1067 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1068 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1069 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1070 IDWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1071 IDWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1072 |
2998 | 1073 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1074 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
6405 | 1075 |
2998 | 1076 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1077 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1078 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1079 cs->b0 = b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1080 cs->b1 = b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1081 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1082 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1083 |
8308 | 1084 static void spatial_compose53i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1085 int y= cs->y; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1086 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1087 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1088 IDWTELEM *b2= buffer + mirror(y+1, height-1)*stride; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1089 IDWTELEM *b3= buffer + mirror(y+2, height-1)*stride; |
2138 | 1090 |
2998 | 1091 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1092 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
6405 | 1093 |
2998 | 1094 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1095 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2138 | 1096 |
2562 | 1097 cs->b0 = b2; |
1098 cs->b1 = b3; | |
1099 cs->y += 2; | |
1100 } | |
1101 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1102 static void av_unused spatial_compose53i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1103 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1104 spatial_compose53i_init(&cs, buffer, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1105 while(cs.y <= height) |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1106 spatial_compose53i_dy(&cs, buffer, width, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1107 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1108 |
2967 | 1109 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1110 void ff_snow_horizontal_compose97i(IDWTELEM *b, int width){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1111 IDWTELEM temp[width]; |
2138 | 1112 const int w2= (width+1)>>1; |
1113 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1114 inv_lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1); |
5589
946c2db0a093
cleanup (remove some old experimentation related code)
michael
parents:
5588
diff
changeset
|
1115 inv_lift (temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1116 inv_liftS(b , temp , temp+w2, 2, 1, 1, width, W_BM, W_BO, W_BS, 0, 1); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1117 inv_lift (b+1 , temp+w2, b , 2, 1, 2, width, W_AM, W_AO, W_AS, 1, 0); |
2138 | 1118 } |
1119 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1120 static void vertical_compose97iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1121 int i; |
2967 | 1122 |
2138 | 1123 for(i=0; i<width; i++){ |
1124 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1125 } | |
1126 } | |
1127 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1128 static void vertical_compose97iH1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1129 int i; |
2967 | 1130 |
2138 | 1131 for(i=0; i<width; i++){ |
1132 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1133 } | |
1134 } | |
1135 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1136 static void vertical_compose97iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1137 int i; |
2967 | 1138 |
2138 | 1139 for(i=0; i<width; i++){ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1140 #ifdef liftS |
2138 | 1141 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1142 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1143 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1144 #endif |
2138 | 1145 } |
1146 } | |
1147 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1148 static void vertical_compose97iL1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1149 int i; |
2967 | 1150 |
2138 | 1151 for(i=0; i<width; i++){ |
1152 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1153 } | |
1154 } | |
1155 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1156 void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width){ |
2592 | 1157 int i; |
2967 | 1158 |
2592 | 1159 for(i=0; i<width; i++){ |
1160 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS; | |
1161 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS; | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1162 #ifdef liftS |
2592 | 1163 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1164 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1165 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1166 #endif |
2592 | 1167 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; |
1168 } | |
1169 } | |
1170 | |
8308 | 1171 static void spatial_compose97i_buffered_init(DWTCompose *cs, slice_buffer * sb, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1172 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1173 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1174 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1175 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1176 cs->y = -3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1177 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1178 |
8308 | 1179 static void spatial_compose97i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1180 cs->b0 = buffer + mirror(-3-1, height-1)*stride; |
1181 cs->b1 = buffer + mirror(-3 , height-1)*stride; | |
1182 cs->b2 = buffer + mirror(-3+1, height-1)*stride; | |
1183 cs->b3 = buffer + mirror(-3+2, height-1)*stride; | |
1184 cs->y = -3; | |
1185 } | |
2138 | 1186 |
8308 | 1187 static void spatial_compose97i_dy_buffered(DSPContext *dsp, DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1188 int y = cs->y; |
2967 | 1189 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1190 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1191 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1192 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1193 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1194 IDWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1195 IDWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line); |
2967 | 1196 |
2592 | 1197 if(y>0 && y+4<height){ |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1198 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width); |
2592 | 1199 }else{ |
2998 | 1200 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1201 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1202 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1203 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
2592 | 1204 } |
6405 | 1205 |
9495 | 1206 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width); |
1207 if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1208 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1209 cs->b0=b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1210 cs->b1=b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1211 cs->b2=b4; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1212 cs->b3=b5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1213 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1214 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1215 |
8308 | 1216 static void spatial_compose97i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1217 int y = cs->y; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1218 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1219 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1220 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1221 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1222 IDWTELEM *b4= buffer + mirror(y+3, height-1)*stride; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1223 IDWTELEM *b5= buffer + mirror(y+4, height-1)*stride; |
2138 | 1224 |
9495 | 1225 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1226 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1227 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1228 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
1229 | |
1230 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width); | |
1231 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width); | |
2562 | 1232 |
1233 cs->b0=b2; | |
1234 cs->b1=b3; | |
1235 cs->b2=b4; | |
1236 cs->b3=b5; | |
1237 cs->y += 2; | |
1238 } | |
1239 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1240 static void av_unused spatial_compose97i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1241 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1242 spatial_compose97i_init(&cs, buffer, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1243 while(cs.y <= height) |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1244 spatial_compose97i_dy(&cs, buffer, width, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1245 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1246 |
8308 | 1247 static void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1248 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1249 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1250 switch(type){ |
3326 | 1251 case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; |
1252 case DWT_53: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1253 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1254 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1255 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1256 |
8308 | 1257 static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, DWTCompose *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1258 const int support = type==1 ? 3 : 5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1259 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1260 if(type==2) return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1261 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1262 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1263 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1264 switch(type){ |
3326 | 1265 case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1266 break; |
3326 | 1267 case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1268 break; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1269 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1270 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1271 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1272 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1273 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1274 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){ |
2138 | 1275 const int w= b->width; |
1276 const int h= b->height; | |
1277 int x,y; | |
2967 | 1278 |
10815 | 1279 int run, runs; |
1280 x_and_coeff *xc= b->x_coeff; | |
1281 x_and_coeff *prev_xc= NULL; | |
1282 x_and_coeff *prev2_xc= xc; | |
1283 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; | |
1284 x_and_coeff *prev_parent_xc= parent_xc; | |
1285 | |
1286 runs= get_symbol2(&s->c, b->state[30], 0); | |
1287 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); | |
1288 else run= INT_MAX; | |
1289 | |
1290 for(y=0; y<h; y++){ | |
1291 int v=0; | |
1292 int lt=0, t=0, rt=0; | |
1293 | |
1294 if(y && prev_xc->x == 0){ | |
1295 rt= prev_xc->coeff; | |
1296 } | |
1297 for(x=0; x<w; x++){ | |
1298 int p=0; | |
1299 const int l= v; | |
1300 | |
1301 lt= t; t= rt; | |
1302 | |
1303 if(y){ | |
1304 if(prev_xc->x <= x) | |
1305 prev_xc++; | |
1306 if(prev_xc->x == x + 1) | |
1307 rt= prev_xc->coeff; | |
1308 else | |
1309 rt=0; | |
2193 | 1310 } |
10815 | 1311 if(parent_xc){ |
1312 if(x>>1 > parent_xc->x){ | |
1313 parent_xc++; | |
2194 | 1314 } |
10815 | 1315 if(x>>1 == parent_xc->x){ |
1316 p= parent_xc->coeff; | |
2138 | 1317 } |
2192 | 1318 } |
10815 | 1319 if(/*ll|*/l|lt|t|rt|p){ |
1320 int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); | |
1321 | |
1322 v=get_rac(&s->c, &b->state[0][context]); | |
1323 if(v){ | |
1324 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); | |
1325 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]); | |
1326 | |
1327 xc->x=x; | |
1328 (xc++)->coeff= v; | |
1329 } | |
1330 }else{ | |
1331 if(!run){ | |
1332 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); | |
1333 else run= INT_MAX; | |
1334 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); | |
1335 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]); | |
1336 | |
1337 xc->x=x; | |
1338 (xc++)->coeff= v; | |
2192 | 1339 }else{ |
10815 | 1340 int max_run; |
1341 run--; | |
1342 v=0; | |
1343 | |
1344 if(y) max_run= FFMIN(run, prev_xc->x - x - 2); | |
1345 else max_run= FFMIN(run, w-x-1); | |
1346 if(parent_xc) | |
1347 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1); | |
1348 x+= max_run; | |
1349 run-= max_run; | |
2138 | 1350 } |
1351 } | |
1352 } | |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1353 (xc++)->x= w+1; //end marker |
10815 | 1354 prev_xc= prev2_xc; |
1355 prev2_xc= xc; | |
1356 | |
1357 if(parent_xc){ | |
1358 if(y&1){ | |
1359 while(parent_xc->x != parent->width+1) | |
1360 parent_xc++; | |
1361 parent_xc++; | |
1362 prev_parent_xc= parent_xc; | |
1363 }else{ | |
1364 parent_xc= prev_parent_xc; | |
1365 } | |
1366 } | |
1367 } | |
1368 | |
1369 (xc++)->x= w+1; //end marker | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1370 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1371 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1372 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1373 const int w= b->width; |
2893 | 1374 int y; |
4594 | 1375 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 1376 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1377 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1378 int new_index = 0; |
2967 | 1379 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1380 if(b->ibuf == s->spatial_idwt_buffer || s->qlog == LOSSLESS_QLOG){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1381 qadd= 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1382 qmul= 1<<QEXPSHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1383 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1384 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1385 /* If we are on the second or later slice, restore our index. */ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1386 if (start_y != 0) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1387 new_index = save_state[0]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1388 |
2967 | 1389 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1390 for(y=start_y; y<h; y++){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1391 int x = 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1392 int v; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1393 IDWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1394 memset(line, 0, b->width*sizeof(IDWTELEM)); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1395 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1396 x = b->x_coeff[new_index++].x; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
1397 while(x < w){ |
2596 | 1398 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT; |
1399 register int u= -(v&1); | |
1400 line[x] = (t^u) - u; | |
1401 | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1402 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1403 x = b->x_coeff[new_index++].x; |
2138 | 1404 } |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1405 } |
2967 | 1406 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1407 /* Save our variables for the next slice. */ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1408 save_state[0] = new_index; |
2967 | 1409 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1410 return; |
2138 | 1411 } |
1412 | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
1413 static void reset_contexts(SnowContext *s){ //FIXME better initial contexts |
2138 | 1414 int plane_index, level, orientation; |
1415 | |
2199 | 1416 for(plane_index=0; plane_index<3; plane_index++){ |
5665
834f359e7257
perform init after reading the values needed for init
michael
parents:
5664
diff
changeset
|
1417 for(level=0; level<MAX_DECOMPOSITIONS; level++){ |
2138 | 1418 for(orientation=level ? 1:0; orientation<4; orientation++){ |
2335 | 1419 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state)); |
2138 | 1420 } |
1421 } | |
1422 } | |
2335 | 1423 memset(s->header_state, MID_STATE, sizeof(s->header_state)); |
1424 memset(s->block_state, MID_STATE, sizeof(s->block_state)); | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1425 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1426 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1427 static int alloc_blocks(SnowContext *s){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1428 int w= -((-s->avctx->width )>>LOG2_MB_SIZE); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1429 int h= -((-s->avctx->height)>>LOG2_MB_SIZE); |
2967 | 1430 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1431 s->b_width = w; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1432 s->b_height= h; |
2967 | 1433 |
9370 | 1434 av_free(s->block); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1435 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1436 return 0; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1437 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1438 |
2335 | 1439 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){ |
1440 uint8_t *bytestream= d->bytestream; | |
1441 uint8_t *bytestream_start= d->bytestream_start; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1442 *d= *s; |
2335 | 1443 d->bytestream= bytestream; |
1444 d->bytestream_start= bytestream_start; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1445 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1446 |
3314 | 1447 static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int ref, int type){ |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1448 const int w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1449 const int rem_depth= s->block_max_depth - level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1450 const int index= (x + y*w) << rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1451 const int block_w= 1<<rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1452 BlockNode block; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1453 int i,j; |
2967 | 1454 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1455 block.color[0]= l; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1456 block.color[1]= cb; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1457 block.color[2]= cr; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1458 block.mx= mx; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1459 block.my= my; |
3314 | 1460 block.ref= ref; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1461 block.type= type; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1462 block.level= level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1463 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1464 for(j=0; j<block_w; j++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1465 for(i=0; i<block_w; i++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1466 s->block[index + i + j*w]= block; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1467 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1468 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1469 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1470 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1471 static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1472 const int offset[3]= { |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1473 y*c-> stride + x, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1474 ((y*c->uvstride + x)>>1), |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1475 ((y*c->uvstride + x)>>1), |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1476 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1477 int i; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1478 for(i=0; i<3; i++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1479 c->src[0][i]= src [i]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1480 c->ref[0][i]= ref [i] + offset[i]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1481 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1482 assert(!ref_index); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1483 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1484 |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1485 static inline void pred_mv(SnowContext *s, int *mx, int *my, int ref, |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1486 const BlockNode *left, const BlockNode *top, const BlockNode *tr){ |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1487 if(s->ref_frames == 1){ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1488 *mx = mid_pred(left->mx, top->mx, tr->mx); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1489 *my = mid_pred(left->my, top->my, tr->my); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1490 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1491 const int *scale = scale_mv_ref[ref]; |
4407
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1492 *mx = mid_pred((left->mx * scale[left->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1493 (top ->mx * scale[top ->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1494 (tr ->mx * scale[tr ->ref] + 128) >>8); |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1495 *my = mid_pred((left->my * scale[left->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1496 (top ->my * scale[top ->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1497 (tr ->my * scale[tr ->ref] + 128) >>8); |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1498 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1499 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1500 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
1501 static av_always_inline int same_block(BlockNode *a, BlockNode *b){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1502 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1503 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2])); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1504 }else{ |
3314 | 1505 return !((a->mx - b->mx) | (a->my - b->my) | (a->ref - b->ref) | ((a->type ^ b->type)&BLOCK_INTRA)); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1506 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1507 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1508 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1509 static void decode_q_branch(SnowContext *s, int level, int x, int y){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1510 const int w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1511 const int rem_depth= s->block_max_depth - level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1512 const int index= (x + y*w) << rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1513 int trx= (x+1)<<rem_depth; |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1514 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1515 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1516 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1517 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1518 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
2967 | 1519 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1520 if(s->keyframe){ |
3314 | 1521 set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, null_block.ref, BLOCK_INTRA); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1522 return; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1523 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1524 |
2335 | 1525 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){ |
4332 | 1526 int type, mx, my; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1527 int l = left->color[0]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1528 int cb= left->color[1]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1529 int cr= left->color[2]; |
3314 | 1530 int ref = 0; |
1531 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); | |
4001 | 1532 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx)); |
1533 int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my)); | |
2967 | 1534 |
2335 | 1535 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1536 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1537 if(type){ |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1538 pred_mv(s, &mx, &my, 0, left, top, tr); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1539 l += get_symbol(&s->c, &s->block_state[32], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1540 cb+= get_symbol(&s->c, &s->block_state[64], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1541 cr+= get_symbol(&s->c, &s->block_state[96], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1542 }else{ |
3314 | 1543 if(s->ref_frames > 1) |
1544 ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0); | |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1545 pred_mv(s, &mx, &my, ref, left, top, tr); |
3314 | 1546 mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1); |
1547 my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1); | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1548 } |
3314 | 1549 set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1550 }else{ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1551 decode_q_branch(s, level+1, 2*x+0, 2*y+0); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1552 decode_q_branch(s, level+1, 2*x+1, 2*y+0); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1553 decode_q_branch(s, level+1, 2*x+0, 2*y+1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1554 decode_q_branch(s, level+1, 2*x+1, 2*y+1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1555 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1556 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1557 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1558 static void decode_blocks(SnowContext *s){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1559 int x, y; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1560 int w= s->b_width; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1561 int h= s->b_height; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1562 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1563 for(y=0; y<h; y++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1564 for(x=0; x<w; x++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1565 decode_q_branch(s, 0, x, y); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1566 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1567 } |
2138 | 1568 } |
1569 | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1570 static void mc_block(Plane *p, uint8_t *dst, const uint8_t *src, uint8_t *tmp, int stride, int b_w, int b_h, int dx, int dy){ |
7622 | 1571 static const uint8_t weight[64]={ |
5648 | 1572 8,7,6,5,4,3,2,1, |
1573 7,7,0,0,0,0,0,1, | |
1574 6,0,6,0,0,0,2,0, | |
1575 5,0,0,5,0,3,0,0, | |
1576 4,0,0,0,4,0,0,0, | |
1577 3,0,0,5,0,3,0,0, | |
1578 2,0,6,0,0,0,2,0, | |
1579 1,7,0,0,0,0,0,1, | |
1580 }; | |
1581 | |
7622 | 1582 static const uint8_t brane[256]={ |
5648 | 1583 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12, |
1584 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52, | |
1585 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc, | |
1586 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc, | |
1587 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc, | |
1588 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc, | |
1589 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc, | |
1590 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16, | |
1591 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56, | |
1592 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96, | |
1593 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc, | |
1594 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc, | |
1595 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc, | |
1596 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc, | |
1597 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc, | |
1598 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A, | |
1599 }; | |
1600 | |
7622 | 1601 static const uint8_t needs[16]={ |
5648 | 1602 0,1,0,0, |
1603 2,4,2,0, | |
1604 0,1,0,0, | |
1605 15 | |
1606 }; | |
1607 | |
1608 int x, y, b, r, l; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1609 int16_t tmpIt [64*(32+HTAPS_MAX)]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1610 uint8_t tmp2t[3][stride*(32+HTAPS_MAX)]; |
5648 | 1611 int16_t *tmpI= tmpIt; |
1612 uint8_t *tmp2= tmp2t[0]; | |
6205 | 1613 const uint8_t *hpel[11]; |
5648 | 1614 assert(dx<16 && dy<16); |
1615 r= brane[dx + 16*dy]&15; | |
1616 l= brane[dx + 16*dy]>>4; | |
1617 | |
1618 b= needs[l] | needs[r]; | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1619 if(p && !p->diag_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1620 b= 15; |
5648 | 1621 |
1622 if(b&5){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1623 for(y=0; y < b_h+HTAPS_MAX-1; y++){ |
5649 | 1624 for(x=0; x < b_w; x++){ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1625 int a_1=src[x + HTAPS_MAX/2-4]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1626 int a0= src[x + HTAPS_MAX/2-3]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1627 int a1= src[x + HTAPS_MAX/2-2]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1628 int a2= src[x + HTAPS_MAX/2-1]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1629 int a3= src[x + HTAPS_MAX/2+0]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1630 int a4= src[x + HTAPS_MAX/2+1]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1631 int a5= src[x + HTAPS_MAX/2+2]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1632 int a6= src[x + HTAPS_MAX/2+3]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1633 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1634 if(!p || p->fast_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1635 am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1636 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1637 am= (am+16)>>5; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1638 }else{ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1639 am= p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1640 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1641 am= (am+32)>>6; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1642 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1643 |
5649 | 1644 if(am&(~255)) am= ~(am>>31); |
1645 tmp2[x]= am; | |
1646 } | |
1647 tmpI+= 64; | |
1648 tmp2+= stride; | |
1649 src += stride; | |
2138 | 1650 } |
5649 | 1651 src -= stride*y; |
5648 | 1652 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1653 src += HTAPS_MAX/2 - 1; |
5648 | 1654 tmp2= tmp2t[1]; |
1655 | |
1656 if(b&2){ | |
5649 | 1657 for(y=0; y < b_h; y++){ |
1658 for(x=0; x < b_w+1; x++){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1659 int a_1=src[x + (HTAPS_MAX/2-4)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1660 int a0= src[x + (HTAPS_MAX/2-3)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1661 int a1= src[x + (HTAPS_MAX/2-2)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1662 int a2= src[x + (HTAPS_MAX/2-1)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1663 int a3= src[x + (HTAPS_MAX/2+0)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1664 int a4= src[x + (HTAPS_MAX/2+1)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1665 int a5= src[x + (HTAPS_MAX/2+2)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1666 int a6= src[x + (HTAPS_MAX/2+3)*stride]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1667 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1668 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1669 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 16)>>5; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1670 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1671 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 32)>>6; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1672 |
5649 | 1673 if(am&(~255)) am= ~(am>>31); |
1674 tmp2[x]= am; | |
1675 } | |
1676 src += stride; | |
1677 tmp2+= stride; | |
5648 | 1678 } |
5649 | 1679 src -= stride*y; |
5648 | 1680 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1681 src += stride*(HTAPS_MAX/2 - 1); |
5648 | 1682 tmp2= tmp2t[2]; |
1683 tmpI= tmpIt; | |
1684 if(b&4){ | |
1685 for(y=0; y < b_h; y++){ | |
1686 for(x=0; x < b_w; x++){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1687 int a_1=tmpI[x + (HTAPS_MAX/2-4)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1688 int a0= tmpI[x + (HTAPS_MAX/2-3)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1689 int a1= tmpI[x + (HTAPS_MAX/2-2)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1690 int a2= tmpI[x + (HTAPS_MAX/2-1)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1691 int a3= tmpI[x + (HTAPS_MAX/2+0)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1692 int a4= tmpI[x + (HTAPS_MAX/2+1)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1693 int a5= tmpI[x + (HTAPS_MAX/2+2)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1694 int a6= tmpI[x + (HTAPS_MAX/2+3)*64]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1695 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1696 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1697 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 512)>>10; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1698 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1699 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 2048)>>12; |
5648 | 1700 if(am&(~255)) am= ~(am>>31); |
1701 tmp2[x]= am; | |
1702 } | |
1703 tmpI+= 64; | |
1704 tmp2+= stride; | |
2138 | 1705 } |
5648 | 1706 } |
1707 | |
1708 hpel[ 0]= src; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1709 hpel[ 1]= tmp2t[0] + stride*(HTAPS_MAX/2-1); |
5648 | 1710 hpel[ 2]= src + 1; |
1711 | |
1712 hpel[ 4]= tmp2t[1]; | |
1713 hpel[ 5]= tmp2t[2]; | |
1714 hpel[ 6]= tmp2t[1] + 1; | |
1715 | |
1716 hpel[ 8]= src + stride; | |
1717 hpel[ 9]= hpel[1] + stride; | |
1718 hpel[10]= hpel[8] + 1; | |
1719 | |
1720 if(b==15){ | |
6205 | 1721 const uint8_t *src1= hpel[dx/8 + dy/8*4 ]; |
1722 const uint8_t *src2= hpel[dx/8 + dy/8*4+1]; | |
1723 const uint8_t *src3= hpel[dx/8 + dy/8*4+4]; | |
1724 const uint8_t *src4= hpel[dx/8 + dy/8*4+5]; | |
5648 | 1725 dx&=7; |
1726 dy&=7; | |
1727 for(y=0; y < b_h; y++){ | |
1728 for(x=0; x < b_w; x++){ | |
1729 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+ | |
1730 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6; | |
1731 } | |
1732 src1+=stride; | |
1733 src2+=stride; | |
1734 src3+=stride; | |
1735 src4+=stride; | |
1736 dst +=stride; | |
1737 } | |
1738 }else{ | |
6205 | 1739 const uint8_t *src1= hpel[l]; |
1740 const uint8_t *src2= hpel[r]; | |
5648 | 1741 int a= weight[((dx&7) + (8*(dy&7)))]; |
1742 int b= 8-a; | |
1743 for(y=0; y < b_h; y++){ | |
1744 for(x=0; x < b_w; x++){ | |
1745 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3; | |
1746 } | |
1747 src1+=stride; | |
1748 src2+=stride; | |
1749 dst +=stride; | |
1750 } | |
2138 | 1751 } |
1752 } | |
1753 | |
1754 #define mca(dx,dy,b_w)\ | |
5254 | 1755 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, const uint8_t *src, int stride, int h){\ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1756 uint8_t tmp[stride*(b_w+HTAPS_MAX-1)];\ |
2138 | 1757 assert(h==b_w);\ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1758 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, tmp, stride, b_w, b_w, dx, dy);\ |
2138 | 1759 } |
1760 | |
1761 mca( 0, 0,16) | |
1762 mca( 8, 0,16) | |
1763 mca( 0, 8,16) | |
1764 mca( 8, 8,16) | |
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1765 mca( 0, 0,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1766 mca( 8, 0,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1767 mca( 0, 8,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1768 mca( 8, 8,8) |
2138 | 1769 |
3314 | 1770 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1771 if(block->type & BLOCK_INTRA){ |
2206 | 1772 int x, y; |
3018 | 1773 const int color = block->color[plane_index]; |
1774 const int color4= color*0x01010101; | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1775 if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1776 for(y=0; y < b_h; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1777 *(uint32_t*)&dst[0 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1778 *(uint32_t*)&dst[4 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1779 *(uint32_t*)&dst[8 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1780 *(uint32_t*)&dst[12+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1781 *(uint32_t*)&dst[16+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1782 *(uint32_t*)&dst[20+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1783 *(uint32_t*)&dst[24+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1784 *(uint32_t*)&dst[28+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1785 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1786 }else if(b_w==16){ |
3018 | 1787 for(y=0; y < b_h; y++){ |
1788 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1789 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1790 *(uint32_t*)&dst[8 + y*stride]= color4; | |
1791 *(uint32_t*)&dst[12+ y*stride]= color4; | |
1792 } | |
1793 }else if(b_w==8){ | |
1794 for(y=0; y < b_h; y++){ | |
1795 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1796 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1797 } | |
1798 }else if(b_w==4){ | |
1799 for(y=0; y < b_h; y++){ | |
1800 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1801 } | |
1802 }else{ | |
1803 for(y=0; y < b_h; y++){ | |
1804 for(x=0; x < b_w; x++){ | |
1805 dst[x + y*stride]= color; | |
1806 } | |
2138 | 1807 } |
1808 } | |
1809 }else{ | |
3314 | 1810 uint8_t *src= s->last_picture[block->ref].data[plane_index]; |
2206 | 1811 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale; |
1812 int mx= block->mx*scale; | |
1813 int my= block->my*scale; | |
2223 | 1814 const int dx= mx&15; |
1815 const int dy= my&15; | |
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
1816 const int tab_index= 3 - (b_w>>2) + (b_w>>4); |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1817 sx += (mx>>4) - (HTAPS_MAX/2-1); |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1818 sy += (my>>4) - (HTAPS_MAX/2-1); |
2206 | 1819 src += sx + sy*stride; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1820 if( (unsigned)sx >= w - b_w - (HTAPS_MAX-2) |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1821 || (unsigned)sy >= h - b_h - (HTAPS_MAX-2)){ |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1822 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+HTAPS_MAX-1, b_h+HTAPS_MAX-1, sx, sy, w, h); |
2206 | 1823 src= tmp + MB_SIZE; |
2138 | 1824 } |
3189 | 1825 // assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h); |
1826 // assert(!(b_w&(b_w-1))); | |
3018 | 1827 assert(b_w>1 && b_h>1); |
6206
ea591bc7522a
add parenthesis, fix warning: snow.c:2413: warning: suggest parentheses around && within ||
bcoudurier
parents:
6205
diff
changeset
|
1828 assert((tab_index>=0 && tab_index<4) || b_w==32); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1829 if((dx&3) || (dy&3) || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h) || (b_w&(b_w-1)) || !s->plane[plane_index].fast_mc ) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1830 mc_block(&s->plane[plane_index], dst, src, tmp, stride, b_w, b_h, dx, dy); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1831 else if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1832 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1833 for(y=0; y<b_h; y+=16){ |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1834 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1835 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1836 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1837 }else if(b_w==b_h) |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1838 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride); |
3018 | 1839 else if(b_w==2*b_h){ |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1840 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1841 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride); |
3018 | 1842 }else{ |
1843 assert(2*b_w==b_h); | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1844 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1845 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride); |
3018 | 1846 } |
2138 | 1847 } |
1848 } | |
1849 | |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1850 void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1851 int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1852 int y, x; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1853 IDWTELEM * dst; |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1854 for(y=0; y<b_h; y++){ |
5409 | 1855 //FIXME ugly misuse of obmc_stride |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1856 const uint8_t *obmc1= obmc + y*obmc_stride; |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1857 const uint8_t *obmc2= obmc1+ (obmc_stride>>1); |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1858 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1859 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1860 dst = slice_buffer_get_line(sb, src_y + y); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1861 for(x=0; x<b_w; x++){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1862 int v= obmc1[x] * block[3][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1863 +obmc2[x] * block[2][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1864 +obmc3[x] * block[1][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1865 +obmc4[x] * block[0][x + y*src_stride]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1866 |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1867 v <<= 8 - LOG2_OBMC_MAX; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1868 if(FRAC_BITS != 8){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1869 v >>= 8 - FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1870 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1871 if(add){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1872 v += dst[x + src_x]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1873 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1874 if(v&(~255)) v= ~(v>>31); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1875 dst8[x + y*src_stride] = v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1876 }else{ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1877 dst[x + src_x] -= v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1878 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1879 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1880 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1881 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1882 |
6412 | 1883 //FIXME name cleanup (b_w, block_w, b_width stuff) |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1884 static av_always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer *sb, IDWTELEM *dst, uint8_t *dst8, const uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int offset_dst, int plane_index){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1885 const int b_width = s->b_width << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1886 const int b_height= s->b_height << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1887 const int b_stride= b_width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1888 BlockNode *lt= &s->block[b_x + b_y*b_stride]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1889 BlockNode *rt= lt+1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1890 BlockNode *lb= lt+b_stride; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1891 BlockNode *rb= lb+1; |
2967 | 1892 uint8_t *block[4]; |
2842 | 1893 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride; |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
1894 uint8_t *tmp = s->scratchbuf; |
2842 | 1895 uint8_t *ptmp; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1896 int x,y; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1897 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1898 if(b_x<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1899 lt= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1900 lb= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1901 }else if(b_x + 1 >= b_width){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1902 rt= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1903 rb= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1904 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1905 if(b_y<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1906 lt= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1907 rt= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1908 }else if(b_y + 1 >= b_height){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1909 lb= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1910 rb= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1911 } |
2967 | 1912 |
6412 | 1913 if(src_x<0){ //FIXME merge with prev & always round internal width up to *16 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1914 obmc -= src_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1915 b_w += src_x; |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1916 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1917 dst -= src_x; |
2206 | 1918 src_x=0; |
1919 }else if(src_x + b_w > w){ | |
1920 b_w = w - src_x; | |
1921 } | |
1922 if(src_y<0){ | |
1923 obmc -= src_y*obmc_stride; | |
1924 b_h += src_y; | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1925 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1926 dst -= src_y*dst_stride; |
2206 | 1927 src_y=0; |
1928 }else if(src_y + b_h> h){ | |
1929 b_h = h - src_y; | |
1930 } | |
2967 | 1931 |
2206 | 1932 if(b_w<=0 || b_h<=0) return; |
1933 | |
6414 | 1934 assert(src_stride > 2*MB_SIZE + 5); |
1935 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1936 if(!sliced && offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1937 dst += src_x + src_y*dst_stride; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
1938 dst8+= src_x + src_y*src_stride; |
2206 | 1939 // src += src_x + src_y*src_stride; |
1940 | |
2842 | 1941 ptmp= tmp + 3*tmp_step; |
1942 block[0]= ptmp; | |
1943 ptmp+=tmp_step; | |
3314 | 1944 pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h); |
2206 | 1945 |
1946 if(same_block(lt, rt)){ | |
1947 block[1]= block[0]; | |
1948 }else{ | |
2842 | 1949 block[1]= ptmp; |
1950 ptmp+=tmp_step; | |
3314 | 1951 pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h); |
2206 | 1952 } |
2967 | 1953 |
2206 | 1954 if(same_block(lt, lb)){ |
1955 block[2]= block[0]; | |
1956 }else if(same_block(rt, lb)){ | |
1957 block[2]= block[1]; | |
1958 }else{ | |
2842 | 1959 block[2]= ptmp; |
1960 ptmp+=tmp_step; | |
3314 | 1961 pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h); |
2206 | 1962 } |
1963 | |
1964 if(same_block(lt, rb) ){ | |
1965 block[3]= block[0]; | |
1966 }else if(same_block(rt, rb)){ | |
1967 block[3]= block[1]; | |
1968 }else if(same_block(lb, rb)){ | |
1969 block[3]= block[2]; | |
1970 }else{ | |
2842 | 1971 block[3]= ptmp; |
3314 | 1972 pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h); |
2206 | 1973 } |
1974 #if 0 | |
1975 for(y=0; y<b_h; y++){ | |
1976 for(x=0; x<b_w; x++){ | |
1977 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX); | |
1978 if(add) dst[x + y*dst_stride] += v; | |
1979 else dst[x + y*dst_stride] -= v; | |
1980 } | |
1981 } | |
1982 for(y=0; y<b_h; y++){ | |
1983 uint8_t *obmc2= obmc + (obmc_stride>>1); | |
1984 for(x=0; x<b_w; x++){ | |
1985 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX); | |
1986 if(add) dst[x + y*dst_stride] += v; | |
1987 else dst[x + y*dst_stride] -= v; | |
1988 } | |
1989 } | |
1990 for(y=0; y<b_h; y++){ | |
1991 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
1992 for(x=0; x<b_w; x++){ | |
1993 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX); | |
1994 if(add) dst[x + y*dst_stride] += v; | |
1995 else dst[x + y*dst_stride] -= v; | |
1996 } | |
1997 } | |
1998 for(y=0; y<b_h; y++){ | |
1999 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2000 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2001 for(x=0; x<b_w; x++){ | |
2002 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX); | |
2003 if(add) dst[x + y*dst_stride] += v; | |
2004 else dst[x + y*dst_stride] -= v; | |
2005 } | |
2006 } | |
2007 #else | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2008 if(sliced){ |
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2009 s->dsp.inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8); |
6475 | 2010 }else{ |
2011 for(y=0; y<b_h; y++){ | |
2012 //FIXME ugly misuse of obmc_stride | |
2013 const uint8_t *obmc1= obmc + y*obmc_stride; | |
2014 const uint8_t *obmc2= obmc1+ (obmc_stride>>1); | |
2015 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); | |
2016 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2017 for(x=0; x<b_w; x++){ | |
2018 int v= obmc1[x] * block[3][x + y*src_stride] | |
2019 +obmc2[x] * block[2][x + y*src_stride] | |
2020 +obmc3[x] * block[1][x + y*src_stride] | |
2021 +obmc4[x] * block[0][x + y*src_stride]; | |
2022 | |
2023 v <<= 8 - LOG2_OBMC_MAX; | |
2024 if(FRAC_BITS != 8){ | |
2025 v >>= 8 - FRAC_BITS; | |
2026 } | |
2027 if(add){ | |
2028 v += dst[x + y*dst_stride]; | |
2029 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; | |
2030 if(v&(~255)) v= ~(v>>31); | |
2031 dst8[x + y*src_stride] = v; | |
2032 }else{ | |
2033 dst[x + y*dst_stride] -= v; | |
2034 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2035 } |
2206 | 2036 } |
2037 } | |
5910 | 2038 #endif /* 0 */ |
2206 | 2039 } |
2040 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2041 static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, IDWTELEM * old_buffer, int plane_index, int add, int mb_y){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2042 Plane *p= &s->plane[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2043 const int mb_w= s->b_width << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2044 const int mb_h= s->b_height << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2045 int x, y, mb_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2046 int block_size = MB_SIZE >> s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2047 int block_w = plane_index ? block_size/2 : block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2048 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2049 int obmc_stride= plane_index ? block_size : 2*block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2050 int ref_stride= s->current_picture.linesize[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2051 uint8_t *dst8= s->current_picture.data[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2052 int w= p->width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2053 int h= p->height; |
2967 | 2054 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2055 if(s->keyframe || (s->avctx->debug&512)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2056 if(mb_y==mb_h) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2057 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2058 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2059 if(add){ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2060 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2061 // DWTELEM * line = slice_buffer_get_line(sb, y); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2062 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2063 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2064 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2065 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2066 v >>= FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2067 if(v&(~255)) v= ~(v>>31); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2068 dst8[x + y*ref_stride]= v; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2069 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2070 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2071 }else{ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2072 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2073 // DWTELEM * line = slice_buffer_get_line(sb, y); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2074 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2075 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2076 line[x] -= 128 << FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2077 // buf[x + y*w]-= 128<<FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2078 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2079 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2080 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2081 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2082 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2083 } |
2967 | 2084 |
6475 | 2085 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2086 add_yblock(s, 1, sb, old_buffer, dst8, obmc, | |
2087 block_w*mb_x - block_w/2, | |
2088 block_w*mb_y - block_w/2, | |
2089 block_w, block_w, | |
2090 w, h, | |
2091 w, ref_stride, obmc_stride, | |
2092 mb_x - 1, mb_y - 1, | |
2093 add, 0, plane_index); | |
2094 } | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2095 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2096 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2097 static av_always_inline void predict_slice(SnowContext *s, IDWTELEM *buf, int plane_index, int add, int mb_y){ |
2138 | 2098 Plane *p= &s->plane[plane_index]; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2099 const int mb_w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2100 const int mb_h= s->b_height << s->block_max_depth; |
2562 | 2101 int x, y, mb_x; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2102 int block_size = MB_SIZE >> s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2103 int block_w = plane_index ? block_size/2 : block_size; |
2206 | 2104 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2105 const int obmc_stride= plane_index ? block_size : 2*block_size; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2106 int ref_stride= s->current_picture.linesize[plane_index]; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2107 uint8_t *dst8= s->current_picture.data[plane_index]; |
2138 | 2108 int w= p->width; |
2109 int h= p->height; | |
2967 | 2110 |
2206 | 2111 if(s->keyframe || (s->avctx->debug&512)){ |
2562 | 2112 if(mb_y==mb_h) |
2113 return; | |
2114 | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2115 if(add){ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2116 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2117 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2118 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2119 v >>= FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2120 if(v&(~255)) v= ~(v>>31); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2121 dst8[x + y*ref_stride]= v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2122 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2123 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2124 }else{ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2125 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2126 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2127 buf[x + y*w]-= 128<<FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2128 } |
2206 | 2129 } |
2138 | 2130 } |
2206 | 2131 |
2132 return; | |
2138 | 2133 } |
2967 | 2134 |
6414 | 2135 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2136 add_yblock(s, 0, NULL, buf, dst8, obmc, | |
2137 block_w*mb_x - block_w/2, | |
2138 block_w*mb_y - block_w/2, | |
2139 block_w, block_w, | |
2140 w, h, | |
2141 w, ref_stride, obmc_stride, | |
2142 mb_x - 1, mb_y - 1, | |
2143 add, 1, plane_index); | |
2144 } | |
2562 | 2145 } |
2146 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2147 static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add){ |
2562 | 2148 const int mb_h= s->b_height << s->block_max_depth; |
2149 int mb_y; | |
2150 for(mb_y=0; mb_y<=mb_h; mb_y++) | |
2151 predict_slice(s, buf, plane_index, add, mb_y); | |
2138 | 2152 } |
2153 | |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2154 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int start_y, int end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2155 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2156 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2157 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2158 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2159 int x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2160 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2161 if(s->qlog == LOSSLESS_QLOG) return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2162 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2163 for(y=start_y; y<end_y; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2164 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2165 IDWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2166 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2167 int i= line[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2168 if(i<0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2169 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2170 }else if(i>0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2171 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2172 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2173 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2174 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2175 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2176 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2177 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2178 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2179 int x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2180 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2181 IDWTELEM * line=0; // silence silly "could be used without having been initialized" warning |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2182 IDWTELEM * prev; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2183 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2184 if (start_y != 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2185 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2186 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2187 for(y=start_y; y<end_y; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2188 prev = line; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2189 // line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2190 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2191 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2192 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2193 if(use_median){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2194 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2195 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2196 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2197 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2198 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2199 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2200 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2201 if(y) line[x] += prev[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2202 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2203 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2204 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2205 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2206 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2207 static void decode_qlogs(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2208 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2209 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2210 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2211 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2212 for(orientation=level ? 1:0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2213 int q; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2214 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2215 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2216 else q= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2217 s->plane[plane_index].band[level][orientation].qlog= q; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2218 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2219 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2220 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2221 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2222 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2223 #define GET_S(dst, check) \ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2224 tmp= get_symbol(&s->c, s->header_state, 0);\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2225 if(!(check)){\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2226 av_log(s->avctx, AV_LOG_ERROR, "Error " #dst " is %d\n", tmp);\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2227 return -1;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2228 }\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2229 dst= tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2230 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2231 static int decode_header(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2232 int plane_index, tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2233 uint8_t kstate[32]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2234 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2235 memset(kstate, MID_STATE, sizeof(kstate)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2236 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2237 s->keyframe= get_rac(&s->c, kstate); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2238 if(s->keyframe || s->always_reset){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2239 reset_contexts(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2240 s->spatial_decomposition_type= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2241 s->qlog= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2242 s->qbias= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2243 s->mv_scale= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2244 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2245 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2246 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2247 GET_S(s->version, tmp <= 0U) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2248 s->always_reset= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2249 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2250 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2251 GET_S(s->spatial_decomposition_count, 0 < tmp && tmp <= MAX_DECOMPOSITIONS) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2252 s->colorspace_type= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2253 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2254 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2255 s->spatial_scalability= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2256 // s->rate_scalability= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2257 GET_S(s->max_ref_frames, tmp < (unsigned)MAX_REF_FRAMES) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2258 s->max_ref_frames++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2259 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2260 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2261 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2262 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2263 if(!s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2264 if(get_rac(&s->c, s->header_state)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2265 for(plane_index=0; plane_index<2; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2266 int htaps, i, sum=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2267 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2268 p->diag_mc= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2269 htaps= get_symbol(&s->c, s->header_state, 0)*2 + 2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2270 if((unsigned)htaps > HTAPS_MAX || htaps==0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2271 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2272 p->htaps= htaps; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2273 for(i= htaps/2; i; i--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2274 p->hcoeff[i]= get_symbol(&s->c, s->header_state, 0) * (1-2*(i&1)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2275 sum += p->hcoeff[i]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2276 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2277 p->hcoeff[0]= 32-sum; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2278 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2279 s->plane[2].diag_mc= s->plane[1].diag_mc; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2280 s->plane[2].htaps = s->plane[1].htaps; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2281 memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2282 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2283 if(get_rac(&s->c, s->header_state)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2284 GET_S(s->spatial_decomposition_count, 0 < tmp && tmp <= MAX_DECOMPOSITIONS) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2285 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2286 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2287 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2288 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2289 s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2290 if(s->spatial_decomposition_type > 1U){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2291 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2292 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2293 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2294 if(FFMIN(s->avctx-> width>>s->chroma_h_shift, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2295 s->avctx->height>>s->chroma_v_shift) >> (s->spatial_decomposition_count-1) <= 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2296 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_count %d too large for size", s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2297 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2298 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2299 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2300 s->qlog += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2301 s->mv_scale += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2302 s->qbias += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2303 s->block_max_depth+= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2304 if(s->block_max_depth > 1 || s->block_max_depth < 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2305 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2306 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2307 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2308 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2309 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2310 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2311 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2312 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2313 static void init_qexp(void){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2314 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2315 double v=128; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2316 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2317 for(i=0; i<QROOT; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2318 qexp[i]= lrintf(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2319 v *= pow(2, 1.0 / QROOT); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2320 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2321 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2322 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2323 static av_cold int common_init(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2324 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2325 int width, height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2326 int i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2327 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2328 s->avctx= avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2329 s->max_ref_frames=1; //just make sure its not an invalid value in case of no initial keyframe |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2330 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2331 dsputil_init(&s->dsp, avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2332 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2333 #define mcf(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2334 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2335 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2336 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2337 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2338 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2339 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2340 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2341 mcf( 0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2342 mcf( 4, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2343 mcf( 8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2344 mcf(12, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2345 mcf( 0, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2346 mcf( 4, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2347 mcf( 8, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2348 mcf(12, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2349 mcf( 0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2350 mcf( 4, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2351 mcf( 8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2352 mcf(12, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2353 mcf( 0,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2354 mcf( 4,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2355 mcf( 8,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2356 mcf(12,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2357 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2358 #define mcfh(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2359 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2360 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2361 mc_block_hpel ## dx ## dy ## 16;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2362 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2363 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2364 mc_block_hpel ## dx ## dy ## 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2365 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2366 mcfh(0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2367 mcfh(8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2368 mcfh(0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2369 mcfh(8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2370 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2371 if(!qexp[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2372 init_qexp(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2373 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2374 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2375 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2376 width= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2377 height= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2378 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2379 s->spatial_idwt_buffer= av_mallocz(width*height*sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2380 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM)); //FIXME this does not belong here |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2381 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2382 for(i=0; i<MAX_REF_FRAMES; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2383 for(j=0; j<MAX_REF_FRAMES; j++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2384 scale_mv_ref[i][j] = 256*(i+1)/(j+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2385 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2386 s->avctx->get_buffer(s->avctx, &s->mconly_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2387 s->scratchbuf = av_malloc(s->mconly_picture.linesize[0]*7*MB_SIZE); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2388 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2389 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2390 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2391 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2392 static int common_init_after_header(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2393 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2394 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2395 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2396 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2397 int w= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2398 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2399 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2400 if(plane_index){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2401 w>>= s->chroma_h_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2402 h>>= s->chroma_v_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2403 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2404 s->plane[plane_index].width = w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2405 s->plane[plane_index].height= h; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2406 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2407 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2408 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2409 SubBand *b= &s->plane[plane_index].band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2410 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2411 b->buf= s->spatial_dwt_buffer; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2412 b->level= level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2413 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2414 b->width = (w + !(orientation&1))>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2415 b->height= (h + !(orientation>1))>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2416 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2417 b->stride_line = 1 << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2418 b->buf_x_offset = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2419 b->buf_y_offset = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2420 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2421 if(orientation&1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2422 b->buf += (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2423 b->buf_x_offset = (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2424 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2425 if(orientation>1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2426 b->buf += b->stride>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2427 b->buf_y_offset = b->stride_line >> 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2428 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2429 b->ibuf= s->spatial_idwt_buffer + (b->buf - s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2430 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2431 if(level) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2432 b->parent= &s->plane[plane_index].band[level-1][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2433 //FIXME avoid this realloc |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2434 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2435 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2436 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2437 w= (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2438 h= (h+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2439 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2440 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2441 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2442 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2443 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2444 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2445 #define QUANTIZE2 0 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2446 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2447 #if QUANTIZE2==1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2448 #define Q2_STEP 8 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2449 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2450 static void find_sse(SnowContext *s, Plane *p, int *score, int score_stride, IDWTELEM *r0, IDWTELEM *r1, int level, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2451 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2452 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2453 int xo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2454 int yo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2455 int step= 1 << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2456 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2457 if(orientation&1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2458 xo= step>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2459 if(orientation&2) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2460 yo= step>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2461 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2462 //FIXME bias for nonzero ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2463 //FIXME optimize |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2464 memset(score, 0, sizeof(*score)*score_stride*((p->height + Q2_STEP-1)/Q2_STEP)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2465 for(y=0; y<p->height; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2466 for(x=0; x<p->width; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2467 int sx= (x-xo + step/2) / step / Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2468 int sy= (y-yo + step/2) / step / Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2469 int v= r0[x + y*p->width] - r1[x + y*p->width]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2470 assert(sx>=0 && sy>=0 && sx < score_stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2471 v= ((v+8)>>4)<<4; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2472 score[sx + sy*score_stride] += v*v; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2473 assert(score[sx + sy*score_stride] >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2474 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2475 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2476 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2477 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2478 static void dequantize_all(SnowContext *s, Plane *p, IDWTELEM *buffer, int width, int height){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2479 int level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2480 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2481 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2482 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2483 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2484 IDWTELEM *dst= buffer + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2485 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2486 dequantize(s, b, dst, b->stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2487 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2488 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2489 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2490 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2491 static void dwt_quantize(SnowContext *s, Plane *p, DWTELEM *buffer, int width, int height, int stride, int type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2492 int level, orientation, ys, xs, x, y, pass; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2493 IDWTELEM best_dequant[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2494 IDWTELEM idwt2_buffer[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2495 const int score_stride= (width + 10)/Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2496 int best_score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2497 int score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2498 int threshold= (s->m.lambda * s->m.lambda) >> 6; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2499 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2500 //FIXME pass the copy cleanly ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2501 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2502 // memcpy(dwt_buffer, buffer, height * stride * sizeof(DWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2503 ff_spatial_dwt(buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2504 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2505 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2506 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2507 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2508 IDWTELEM *dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2509 DWTELEM *src= buffer + (b-> buf - s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2510 assert(src == b->buf); // code does not depend on this but it is true currently |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2511 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2512 quantize(s, b, dst, src, b->stride, s->qbias); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2513 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2514 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2515 for(pass=0; pass<1; pass++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2516 if(s->qbias == 0) //keyframe |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2517 continue; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2518 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2519 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2520 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2521 IDWTELEM *dst= idwt2_buffer + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2522 IDWTELEM *best_dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2523 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2524 for(ys= 0; ys<Q2_STEP; ys++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2525 for(xs= 0; xs<Q2_STEP; xs++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2526 memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2527 dequantize_all(s, p, idwt2_buffer, width, height); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2528 ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2529 find_sse(s, p, best_score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2530 memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2531 for(y=ys; y<b->height; y+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2532 for(x=xs; x<b->width; x+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2533 if(dst[x + y*b->stride]<0) dst[x + y*b->stride]++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2534 if(dst[x + y*b->stride]>0) dst[x + y*b->stride]--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2535 //FIXME try more than just -- |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2536 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2537 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2538 dequantize_all(s, p, idwt2_buffer, width, height); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2539 ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2540 find_sse(s, p, score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2541 for(y=ys; y<b->height; y+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2542 for(x=xs; x<b->width; x+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2543 int score_idx= x/Q2_STEP + (y/Q2_STEP)*score_stride; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2544 if(score[score_idx] <= best_score[score_idx] + threshold){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2545 best_score[score_idx]= score[score_idx]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2546 if(best_dst[x + y*b->stride]<0) best_dst[x + y*b->stride]++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2547 if(best_dst[x + y*b->stride]>0) best_dst[x + y*b->stride]--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2548 //FIXME copy instead |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2549 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2550 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2551 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2552 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2553 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2554 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2555 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2556 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2557 memcpy(s->spatial_idwt_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); //FIXME work with that directly instead of copy at the end |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2558 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2559 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2560 #endif /* QUANTIZE2==1 */ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2561 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2562 #define USE_HALFPEL_PLANE 0 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2563 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2564 static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame *frame){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2565 int p,x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2566 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2567 assert(!(s->avctx->flags & CODEC_FLAG_EMU_EDGE)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2568 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2569 for(p=0; p<3; p++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2570 int is_chroma= !!p; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2571 int w= s->avctx->width >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2572 int h= s->avctx->height >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2573 int ls= frame->linesize[p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2574 uint8_t *src= frame->data[p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2575 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2576 halfpel[1][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2577 halfpel[2][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2578 halfpel[3][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2579 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2580 halfpel[0][p]= src; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2581 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2582 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2583 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2584 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2585 halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] + src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2586 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2587 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2588 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2589 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2590 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2591 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2592 halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2593 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2594 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2595 src= halfpel[1][p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2596 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2597 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2598 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2599 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2600 halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2601 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2602 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2603 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2604 //FIXME border! |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2605 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2606 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2607 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2608 static void release_buffer(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2609 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2610 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2611 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2612 if(s->last_picture[s->max_ref_frames-1].data[0]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2613 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2614 for(i=0; i<9; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2615 if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2616 av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] - EDGE_WIDTH*(1+s->current_picture.linesize[i%3])); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2617 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2618 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2619 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2620 static int frame_start(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2621 AVFrame tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2622 int w= s->avctx->width; //FIXME round up to x16 ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2623 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2624 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2625 if(s->current_picture.data[0]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2626 s->dsp.draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH ); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2627 s->dsp.draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2628 s->dsp.draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2629 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2630 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2631 release_buffer(s->avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2632 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2633 tmp= s->last_picture[s->max_ref_frames-1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2634 memmove(s->last_picture+1, s->last_picture, (s->max_ref_frames-1)*sizeof(AVFrame)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2635 memmove(s->halfpel_plane+1, s->halfpel_plane, (s->max_ref_frames-1)*sizeof(void*)*4*4); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2636 if(USE_HALFPEL_PLANE && s->current_picture.data[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2637 halfpel_interpol(s, s->halfpel_plane[0], &s->current_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2638 s->last_picture[0]= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2639 s->current_picture= tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2640 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2641 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2642 s->ref_frames= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2643 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2644 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2645 for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2646 if(i && s->last_picture[i-1].key_frame) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2647 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2648 s->ref_frames= i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2649 if(s->ref_frames==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2650 av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2651 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2652 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2653 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2654 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2655 s->current_picture.reference= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2656 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2657 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2658 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2659 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2660 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2661 s->current_picture.key_frame= s->keyframe; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2662 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2663 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2664 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2665 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2666 static av_cold void common_end(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2667 int plane_index, level, orientation, i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2668 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2669 av_freep(&s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2670 av_freep(&s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2671 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2672 s->m.me.temp= NULL; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2673 av_freep(&s->m.me.scratchpad); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2674 av_freep(&s->m.me.map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2675 av_freep(&s->m.me.score_map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2676 av_freep(&s->m.obmc_scratchpad); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2677 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2678 av_freep(&s->block); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2679 av_freep(&s->scratchbuf); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2680 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2681 for(i=0; i<MAX_REF_FRAMES; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2682 av_freep(&s->ref_mvs[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2683 av_freep(&s->ref_scores[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2684 if(s->last_picture[i].data[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2685 s->avctx->release_buffer(s->avctx, &s->last_picture[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2686 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2687 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2688 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2689 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2690 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2691 SubBand *b= &s->plane[plane_index].band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2692 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2693 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2694 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2695 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2696 } |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2697 if (s->mconly_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2698 s->avctx->release_buffer(s->avctx, &s->mconly_picture); |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2699 if (s->current_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2700 s->avctx->release_buffer(s->avctx, &s->current_picture); |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2701 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2702 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2703 static av_cold int decode_init(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2704 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2705 avctx->pix_fmt= PIX_FMT_YUV420P; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2706 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2707 common_init(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2708 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2709 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2710 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2711 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2712 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2713 const uint8_t *buf = avpkt->data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2714 int buf_size = avpkt->size; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2715 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2716 RangeCoder * const c= &s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2717 int bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2718 AVFrame *picture = data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2719 int level, orientation, plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2720 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2721 ff_init_range_decoder(c, buf, buf_size); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2722 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2723 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2724 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2725 if(decode_header(s)<0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2726 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2727 common_init_after_header(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2728 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2729 // realloc slice buffer for the case that spatial_decomposition_count changed |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2730 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2731 slice_buffer_init(&s->sb, s->plane[0].height, (MB_SIZE >> s->block_max_depth) + s->spatial_decomposition_count * 8 + 1, s->plane[0].width, s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2732 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2733 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2734 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2735 p->fast_mc= p->diag_mc && p->htaps==6 && p->hcoeff[0]==40 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2736 && p->hcoeff[1]==-10 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2737 && p->hcoeff[2]==2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2738 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2739 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2740 alloc_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2741 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2742 if(frame_start(s) < 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2743 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2744 //keyframe flag duplication mess FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2745 if(avctx->debug&FF_DEBUG_PICT_INFO) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2746 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2747 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2748 decode_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2749 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2750 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2751 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2752 int w= p->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2753 int h= p->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2754 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2755 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2756 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2757 if(s->avctx->debug&2048){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2758 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2759 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2760 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2761 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2762 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2763 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2764 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2765 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2766 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2767 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2768 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2769 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2770 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2771 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2772 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2773 unpack_coeffs(s, b, b->parent, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2774 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2775 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2776 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2777 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2778 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2779 const int mb_h= s->b_height << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2780 const int block_size = MB_SIZE >> s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2781 const int block_w = plane_index ? block_size/2 : block_size; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2782 int mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2783 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2784 int yd=0, yq=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2785 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2786 int end_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2787 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2788 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2789 for(mb_y=0; mb_y<=mb_h; mb_y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2790 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2791 int slice_starty = block_w*mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2792 int slice_h = block_w*(mb_y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2793 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2794 slice_starty = FFMAX(0, slice_starty - (block_w >> 1)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2795 slice_h -= (block_w >> 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2796 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2797 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2798 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2799 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2800 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2801 int start_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2802 int end_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2803 int our_mb_start = mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2804 int our_mb_end = (mb_y + 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2805 const int extra= 3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2806 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra: 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2807 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2808 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2809 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2810 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2811 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2812 start_y = FFMIN(b->height, start_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2813 end_y = FFMIN(b->height, end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2814 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2815 if (start_y != end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2816 if (orientation == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2817 SubBand * correlate_band = &p->band[0][0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2818 int correlate_end_y = FFMIN(b->height, end_y + 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2819 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2820 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2821 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2822 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, start_y, end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2823 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2824 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2825 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2826 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2827 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2828 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2829 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2830 for(; yd<slice_h; yd+=4){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2831 ff_spatial_idwt_buffered_slice(&s->dsp, cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2832 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2833 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2834 if(s->qlog == LOSSLESS_QLOG){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2835 for(; yq<slice_h && yq<h; yq++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2836 IDWTELEM * line = slice_buffer_get_line(&s->sb, yq); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2837 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2838 line[x] <<= FRAC_BITS; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2839 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2840 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2841 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2842 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2843 predict_slice_buffered(s, &s->sb, s->spatial_idwt_buffer, plane_index, 1, mb_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2844 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2845 y = FFMIN(p->height, slice_starty); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2846 end_y = FFMIN(p->height, slice_h); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2847 while(y < end_y) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2848 slice_buffer_release(&s->sb, y++); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2849 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2850 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2851 slice_buffer_flush(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2852 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2853 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2854 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2855 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2856 emms_c(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2857 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2858 release_buffer(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2859 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2860 if(!(s->avctx->debug&2048)) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2861 *picture= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2862 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2863 *picture= s->mconly_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2864 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2865 *data_size = sizeof(AVFrame); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2866 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2867 bytes_read= c->bytestream - c->bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2868 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2869 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2870 return bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2871 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2872 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2873 static av_cold int decode_end(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2874 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2875 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2876 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2877 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2878 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2879 common_end(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2880 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2881 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2882 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2883 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2884 AVCodec snow_decoder = { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2885 "snow", |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2886 CODEC_TYPE_VIDEO, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2887 CODEC_ID_SNOW, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2888 sizeof(SnowContext), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2889 decode_init, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2890 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2891 decode_end, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2892 decode_frame, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2893 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2894 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2895 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2896 }; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2897 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2898 #if CONFIG_SNOW_ENCODER |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2899 static av_cold int encode_init(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2900 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2901 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2902 int plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2903 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2904 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2905 av_log(avctx, AV_LOG_ERROR, "This codec is under development, files encoded with it may not be decodable with future versions!!!\n" |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2906 "Use vstrict=-2 / -strict -2 to use it anyway.\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2907 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2908 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2909 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2910 if(avctx->prediction_method == DWT_97 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2911 && (avctx->flags & CODEC_FLAG_QSCALE) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2912 && avctx->global_quality == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2913 av_log(avctx, AV_LOG_ERROR, "The 9/7 wavelet is incompatible with lossless mode.\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2914 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2915 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2916 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2917 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2918 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2919 s->mv_scale = (avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2920 s->block_max_depth= (avctx->flags & CODEC_FLAG_4MV ) ? 1 : 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2921 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2922 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2923 s->plane[plane_index].diag_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2924 s->plane[plane_index].htaps= 6; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2925 s->plane[plane_index].hcoeff[0]= 40; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2926 s->plane[plane_index].hcoeff[1]= -10; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2927 s->plane[plane_index].hcoeff[2]= 2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2928 s->plane[plane_index].fast_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2929 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2930 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2931 common_init(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2932 alloc_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2933 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2934 s->version=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2935 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2936 s->m.avctx = avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2937 s->m.flags = avctx->flags; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2938 s->m.bit_rate= avctx->bit_rate; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2939 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2940 s->m.me.temp = |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2941 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2942 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2943 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2944 s->m.obmc_scratchpad= av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2945 h263_encode_init(&s->m); //mv_penalty |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2946 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2947 s->max_ref_frames = FFMAX(FFMIN(avctx->refs, MAX_REF_FRAMES), 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2948 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2949 if(avctx->flags&CODEC_FLAG_PASS1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2950 if(!avctx->stats_out) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2951 avctx->stats_out = av_mallocz(256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2952 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2953 if((avctx->flags&CODEC_FLAG_PASS2) || !(avctx->flags&CODEC_FLAG_QSCALE)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2954 if(ff_rate_control_init(&s->m) < 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2955 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2956 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2957 s->pass1_rc= !(avctx->flags & (CODEC_FLAG_QSCALE|CODEC_FLAG_PASS2)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2958 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2959 avctx->coded_frame= &s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2960 switch(avctx->pix_fmt){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2961 // case PIX_FMT_YUV444P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2962 // case PIX_FMT_YUV422P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2963 case PIX_FMT_YUV420P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2964 case PIX_FMT_GRAY8: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2965 // case PIX_FMT_YUV411P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2966 // case PIX_FMT_YUV410P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2967 s->colorspace_type= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2968 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2969 /* case PIX_FMT_RGB32: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2970 s->colorspace= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2971 break;*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2972 default: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2973 av_log(avctx, AV_LOG_ERROR, "pixel format not supported\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2974 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2975 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2976 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2977 s->chroma_h_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2978 s->chroma_v_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2979 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2980 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2981 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2982 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2983 s->avctx->get_buffer(s->avctx, &s->input_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2984 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2985 if(s->avctx->me_method == ME_ITER){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2986 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2987 int size= s->b_width * s->b_height << 2*s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2988 for(i=0; i<s->max_ref_frames; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2989 s->ref_mvs[i]= av_mallocz(size*sizeof(int16_t[2])); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2990 s->ref_scores[i]= av_mallocz(size*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2991 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2992 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2993 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2994 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2995 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2996 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2997 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2998 static int pix_sum(uint8_t * pix, int line_size, int w) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2999 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3000 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3001 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3002 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3003 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3004 for (j = 0; j < w; j++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3005 s += pix[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3006 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3007 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3008 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3009 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3010 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3011 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3012 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3013 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3014 static int pix_norm1(uint8_t * pix, int line_size, int w) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3015 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3016 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3017 uint32_t *sq = ff_squareTbl + 256; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3018 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3019 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3020 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3021 for (j = 0; j < w; j ++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3022 s += sq[pix[0]]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3023 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3024 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3025 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3026 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3027 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3028 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3029 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3030 //FIXME copy&paste |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3031 #define P_LEFT P[1] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3032 #define P_TOP P[2] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3033 #define P_TOPRIGHT P[3] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3034 #define P_MEDIAN P[4] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3035 #define P_MV1 P[9] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3036 #define FLAG_QPEL 1 //must be 1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3037 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3038 static int encode_q_branch(SnowContext *s, int level, int x, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3039 uint8_t p_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3040 uint8_t i_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3041 uint8_t p_state[sizeof(s->block_state)]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3042 uint8_t i_state[sizeof(s->block_state)]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3043 RangeCoder pc, ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3044 uint8_t *pbbak= s->c.bytestream; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3045 uint8_t *pbbak_start= s->c.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3046 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3047 const int w= s->b_width << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3048 const int h= s->b_height << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3049 const int rem_depth= s->block_max_depth - level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3050 const int index= (x + y*w) << rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3051 const int block_w= 1<<(LOG2_MB_SIZE - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3052 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3053 int try= (y+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3054 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3055 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3056 const BlockNode *right = trx<w ? &s->block[index+1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3057 const BlockNode *bottom= try<h ? &s->block[index+w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3058 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3059 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3060 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3061 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3062 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3063 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3064 int mx=0, my=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3065 int l,cr,cb; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3066 const int stride= s->current_picture.linesize[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3067 const int uvstride= s->current_picture.linesize[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3068 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3069 s->input_picture.data[1] + (x + y*uvstride)*block_w/2, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3070 s->input_picture.data[2] + (x + y*uvstride)*block_w/2}; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3071 int P[10][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3072 int16_t last_mv[3][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3073 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3074 const int shift= 1+qpel; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3075 MotionEstContext *c= &s->m.me; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3076 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3077 int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3078 int my_context= av_log2(2*FFABS(left->my - top->my)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3079 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3080 int ref, best_ref, ref_score, ref_mx, ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3081 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3082 assert(sizeof(s->block_state) >= 256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3083 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3084 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3085 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3086 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3087 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3088 // clip predictors / edge ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3089 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3090 P_LEFT[0]= left->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3091 P_LEFT[1]= left->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3092 P_TOP [0]= top->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3093 P_TOP [1]= top->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3094 P_TOPRIGHT[0]= tr->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3095 P_TOPRIGHT[1]= tr->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3096 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3097 last_mv[0][0]= s->block[index].mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3098 last_mv[0][1]= s->block[index].my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3099 last_mv[1][0]= right->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3100 last_mv[1][1]= right->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3101 last_mv[2][0]= bottom->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3102 last_mv[2][1]= bottom->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3103 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3104 s->m.mb_stride=2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3105 s->m.mb_x= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3106 s->m.mb_y= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3107 c->skip= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3108 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3109 assert(c-> stride == stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3110 assert(c->uvstride == uvstride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3111 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3112 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3113 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3114 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3115 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3116 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3117 c->xmin = - x*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3118 c->ymin = - y*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3119 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3120 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3121 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3122 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3123 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3124 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3125 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3126 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3127 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3128 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3129 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3130 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3131 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3132 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3133 if (!y) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3134 c->pred_x= P_LEFT[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3135 c->pred_y= P_LEFT[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3136 } else { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3137 c->pred_x = P_MEDIAN[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3138 c->pred_y = P_MEDIAN[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3139 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3140 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3141 score= INT_MAX; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3142 best_ref= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3143 for(ref=0; ref<s->ref_frames; ref++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3144 init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3145 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3146 ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3147 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3148 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3149 assert(ref_mx >= c->xmin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3150 assert(ref_mx <= c->xmax); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3151 assert(ref_my >= c->ymin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3152 assert(ref_my <= c->ymax); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3153 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3154 ref_score= c->sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3155 ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3156 ref_score+= 2*av_log2(2*ref)*c->penalty_factor; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3157 if(s->ref_mvs[ref]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3158 s->ref_mvs[ref][index][0]= ref_mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3159 s->ref_mvs[ref][index][1]= ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3160 s->ref_scores[ref][index]= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3161 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3162 if(score > ref_score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3163 score= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3164 best_ref= ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3165 mx= ref_mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3166 my= ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3167 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3168 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3169 //FIXME if mb_cmp != SSE then intra cannot be compared currently and mb_penalty vs. lambda2 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3170 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3171 // subpel search |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3172 base_bits= get_rac_count(&s->c) - 8*(s->c.bytestream - s->c.bytestream_start); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3173 pc= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3174 pc.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3175 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3176 memcpy(p_state, s->block_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3177 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3178 if(level!=s->block_max_depth) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3179 put_rac(&pc, &p_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3180 put_rac(&pc, &p_state[1 + left->type + top->type], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3181 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3182 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3183 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3184 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3185 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3186 p_len= pc.bytestream - pc.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3187 score += (s->lambda2*(get_rac_count(&pc)-base_bits))>>FF_LAMBDA_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3188 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3189 block_s= block_w*block_w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3190 sum = pix_sum(current_data[0], stride, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3191 l= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3192 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3193 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3194 block_s= block_w*block_w>>2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3195 sum = pix_sum(current_data[1], uvstride, block_w>>1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3196 cb= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3197 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3198 sum = pix_sum(current_data[2], uvstride, block_w>>1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3199 cr= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3200 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3201 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3202 ic= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3203 ic.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3204 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3205 memcpy(i_state, s->block_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3206 if(level!=s->block_max_depth) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3207 put_rac(&ic, &i_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3208 put_rac(&ic, &i_state[1 + left->type + top->type], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3209 put_symbol(&ic, &i_state[32], l-pl , 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3210 put_symbol(&ic, &i_state[64], cb-pcb, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3211 put_symbol(&ic, &i_state[96], cr-pcr, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3212 i_len= ic.bytestream - ic.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3213 iscore += (s->lambda2*(get_rac_count(&ic)-base_bits))>>FF_LAMBDA_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3214 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3215 // assert(score==256*256*256*64-1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3216 assert(iscore < 255*255*256 + s->lambda2*10); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3217 assert(iscore >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3218 assert(l>=0 && l<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3219 assert(pl>=0 && pl<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3220 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3221 if(level==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3222 int varc= iscore >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3223 int vard= score >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3224 if (vard <= 64 || vard < varc) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3225 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3226 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3227 c->scene_change_score+= s->m.qscale; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3228 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3229 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3230 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3231 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3232 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3233 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3234 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3235 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3236 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3237 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3238 if(score2 < score && score2 < iscore) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3239 return score2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3240 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3241 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3242 if(iscore < score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3243 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3244 memcpy(pbbak, i_buffer, i_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3245 s->c= ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3246 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3247 s->c.bytestream= pbbak + i_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3248 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3249 memcpy(s->block_state, i_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3250 return iscore; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3251 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3252 memcpy(pbbak, p_buffer, p_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3253 s->c= pc; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3254 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3255 s->c.bytestream= pbbak + p_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3256 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3257 memcpy(s->block_state, p_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3258 return score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3259 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3260 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3261 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3262 static void encode_q_branch2(SnowContext *s, int level, int x, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3263 const int w= s->b_width << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3264 const int rem_depth= s->block_max_depth - level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3265 const int index= (x + y*w) << rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3266 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3267 BlockNode *b= &s->block[index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3268 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3269 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3270 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3271 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3272 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3273 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3274 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3275 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3276 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3277 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3278 int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3279 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3280 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3281 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3282 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3283 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3284 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3285 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3286 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3287 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3288 put_rac(&s->c, &s->block_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3289 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3290 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3291 encode_q_branch2(s, level+1, 2*x+0, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3292 encode_q_branch2(s, level+1, 2*x+1, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3293 encode_q_branch2(s, level+1, 2*x+0, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3294 encode_q_branch2(s, level+1, 2*x+1, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3295 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3296 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3297 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3298 if(b->type & BLOCK_INTRA){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3299 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3300 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3301 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3302 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3303 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3304 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3305 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3306 pred_mv(s, &pmx, &pmy, b->ref, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3307 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3308 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3309 put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3310 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3311 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3312 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3313 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3314 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3315 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3316 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3317 int i, x2, y2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3318 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3319 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3320 const int block_w = plane_index ? block_size/2 : block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3321 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3322 const int obmc_stride= plane_index ? block_size : 2*block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3323 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3324 uint8_t *src= s-> input_picture.data[plane_index]; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3325 IDWTELEM *dst= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; //FIXME change to unsigned |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3326 const int b_stride = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3327 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3328 const int h= p->height; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3329 int index= mb_x + mb_y*b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3330 BlockNode *b= &s->block[index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3331 BlockNode backup= *b; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3332 int ab=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3333 int aa=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3334 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3335 b->type|= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3336 b->color[plane_index]= 0; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3337 memset(dst, 0, obmc_stride*obmc_stride*sizeof(IDWTELEM)); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3338 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3339 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3340 int mb_x2= mb_x + (i &1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3341 int mb_y2= mb_y + (i>>1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3342 int x= block_w*mb_x2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3343 int y= block_w*mb_y2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3344 |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3345 add_yblock(s, 0, NULL, dst + ((i&1)+(i>>1)*obmc_stride)*block_w, NULL, obmc, |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3346 x, y, block_w, block_w, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3347 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3348 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3349 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3350 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3351 int obmc_v= obmc[index]; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3352 int d; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3353 if(y<0) obmc_v += obmc[index + block_w*obmc_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3354 if(x<0) obmc_v += obmc[index + block_w]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3355 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3356 if(x+block_w>w) obmc_v += obmc[index - block_w]; |
6412 | 3357 //FIXME precalculate this or simplify it somehow else |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3358 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3359 d = -dst[index] + (1<<(FRAC_BITS-1)); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3360 dst[index] = d; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3361 ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v; |
6412 | 3362 aa += obmc_v * obmc_v; //FIXME precalculate this |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3363 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3364 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3365 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3366 *b= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3367 |
5127 | 3368 return av_clip(((ab<<LOG2_OBMC_MAX) + aa/2)/aa, 0, 255); //FIXME we should not need clipping |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3369 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3370 |
3051 | 3371 static inline int get_block_bits(SnowContext *s, int x, int y, int w){ |
3372 const int b_stride = s->b_width << s->block_max_depth; | |
3373 const int b_height = s->b_height<< s->block_max_depth; | |
3374 int index= x + y*b_stride; | |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3375 const BlockNode *b = &s->block[index]; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3376 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3377 const BlockNode *top = y ? &s->block[index-b_stride] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3378 const BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3379 const BlockNode *tr = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl; |
3051 | 3380 int dmx, dmy; |
4001 | 3381 // int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
3382 // int my_context= av_log2(2*FFABS(left->my - top->my)); | |
3051 | 3383 |
3384 if(x<0 || x>=b_stride || y>=b_height) | |
3385 return 0; | |
3386 /* | |
3387 1 0 0 | |
3388 01X 1-2 1 | |
3389 001XX 3-6 2-3 | |
3390 0001XXX 7-14 4-7 | |
3391 00001XXXX 15-30 8-15 | |
3392 */ | |
3393 //FIXME try accurate rate | |
6412 | 3394 //FIXME intra and inter predictors if surrounding blocks are not the same type |
3051 | 3395 if(b->type & BLOCK_INTRA){ |
4001 | 3396 return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0])) |
3397 + av_log2(2*FFABS(left->color[1] - b->color[1])) | |
3398 + av_log2(2*FFABS(left->color[2] - b->color[2]))); | |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3399 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3400 pred_mv(s, &dmx, &dmy, b->ref, left, top, tr); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3401 dmx-= b->mx; |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3402 dmy-= b->my; |
4001 | 3403 return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda |
3404 + av_log2(2*FFABS(dmy)) | |
3314 | 3405 + av_log2(2*b->ref)); |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3406 } |
3051 | 3407 } |
3408 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3409 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, const uint8_t *obmc_edged){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3410 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3411 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3412 const int block_w = plane_index ? block_size/2 : block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3413 const int obmc_stride= plane_index ? block_size : 2*block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3414 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3415 uint8_t *dst= s->current_picture.data[plane_index]; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3416 uint8_t *src= s-> input_picture.data[plane_index]; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3417 IDWTELEM *pred= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
3418 uint8_t *cur = s->scratchbuf; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
3419 uint8_t tmp[ref_stride*(2*MB_SIZE+HTAPS_MAX-1)]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3420 const int b_stride = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3421 const int b_height = s->b_height<< s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3422 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3423 const int h= p->height; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3424 int distortion; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3425 int rate= 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3426 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3427 int sx= block_w*mb_x - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3428 int sy= block_w*mb_y - block_w/2; |
3206 | 3429 int x0= FFMAX(0,-sx); |
3430 int y0= FFMAX(0,-sy); | |
3431 int x1= FFMIN(block_w*2, w-sx); | |
3432 int y1= FFMIN(block_w*2, h-sy); | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3433 int i,x,y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3434 |
3314 | 3435 pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_w*2, &s->block[mb_x + mb_y*b_stride], plane_index, w, h); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3436 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3437 for(y=y0; y<y1; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3438 const uint8_t *obmc1= obmc_edged + y*obmc_stride; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3439 const IDWTELEM *pred1 = pred + y*obmc_stride; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3440 uint8_t *cur1 = cur + y*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3441 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3442 for(x=x0; x<x1; x++){ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3443 #if FRAC_BITS >= LOG2_OBMC_MAX |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3444 int v = (cur1[x] * obmc1[x]) << (FRAC_BITS - LOG2_OBMC_MAX); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3445 #else |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3446 int v = (cur1[x] * obmc1[x] + (1<<(LOG2_OBMC_MAX - FRAC_BITS-1))) >> (LOG2_OBMC_MAX - FRAC_BITS); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3447 #endif |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3448 v = (v + pred1[x]) >> FRAC_BITS; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3449 if(v&(~255)) v= ~(v>>31); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3450 dst1[x] = v; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3451 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3452 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3453 |
3206 | 3454 /* copy the regions where obmc[] = (uint8_t)256 */ |
3455 if(LOG2_OBMC_MAX == 8 | |
3456 && (mb_x == 0 || mb_x == b_stride-1) | |
3457 && (mb_y == 0 || mb_y == b_height-1)){ | |
3458 if(mb_x == 0) | |
3459 x1 = block_w; | |
3460 else | |
3461 x0 = block_w; | |
3462 if(mb_y == 0) | |
3463 y1 = block_w; | |
3464 else | |
3465 y0 = block_w; | |
3466 for(y=y0; y<y1; y++) | |
3467 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0); | |
3468 } | |
3469 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3470 if(block_w==16){ |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3471 /* FIXME rearrange dsputil to fit 32x32 cmp functions */ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3472 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */ |
6412 | 3473 /* FIXME cmps overlap but do not cover the wavelet's whole support. |
3474 * So improving the score of one block is not strictly guaranteed | |
3475 * to improve the score of the whole frame, thus iterative motion | |
3476 * estimation does not always converge. */ | |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3477 if(s->avctx->me_cmp == FF_CMP_W97) |
4197 | 3478 distortion = w97_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3479 else if(s->avctx->me_cmp == FF_CMP_W53) |
4197 | 3480 distortion = w53_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3481 else{ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3482 distortion = 0; |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3483 for(i=0; i<4; i++){ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3484 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride; |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3485 distortion += s->dsp.me_cmp[0](&s->m, src + off, dst + off, ref_stride, 16); |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3486 } |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3487 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3488 }else{ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3489 assert(block_w==8); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3490 distortion = s->dsp.me_cmp[0](&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3491 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3492 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3493 if(plane_index==0){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3494 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3495 /* ..RRr |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3496 * .RXx. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3497 * rxx.. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3498 */ |
3051 | 3499 rate += get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3500 } |
3057 | 3501 if(mb_x == b_stride-2) |
3502 rate += get_block_bits(s, mb_x + 1, mb_y + 1, 1); | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3503 } |
3051 | 3504 return distortion + rate*penalty_factor; |
3505 } | |
3506 | |
3507 static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){ | |
3508 int i, y2; | |
3509 Plane *p= &s->plane[plane_index]; | |
3510 const int block_size = MB_SIZE >> s->block_max_depth; | |
3511 const int block_w = plane_index ? block_size/2 : block_size; | |
3512 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; | |
3513 const int obmc_stride= plane_index ? block_size : 2*block_size; | |
3514 const int ref_stride= s->current_picture.linesize[plane_index]; | |
3515 uint8_t *dst= s->current_picture.data[plane_index]; | |
3516 uint8_t *src= s-> input_picture.data[plane_index]; | |
6426 | 3517 //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst |
3518 // const has only been removed from zero_dst to suppress a warning | |
3519 static IDWTELEM zero_dst[4096]; //FIXME | |
3051 | 3520 const int b_stride = s->b_width << s->block_max_depth; |
3521 const int w= p->width; | |
3522 const int h= p->height; | |
3523 int distortion= 0; | |
3524 int rate= 0; | |
3525 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); | |
3526 | |
3527 for(i=0; i<9; i++){ | |
3528 int mb_x2= mb_x + (i%3) - 1; | |
3529 int mb_y2= mb_y + (i/3) - 1; | |
3530 int x= block_w*mb_x2 + block_w/2; | |
3531 int y= block_w*mb_y2 + block_w/2; | |
3532 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3533 add_yblock(s, 0, NULL, zero_dst, dst, obmc, |
3051 | 3534 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index); |
3535 | |
3536 //FIXME find a cleaner/simpler way to skip the outside stuff | |
3537 for(y2= y; y2<0; y2++) | |
3538 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3539 for(y2= h; y2<y+block_w; y2++) | |
3540 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3541 if(x<0){ | |
3542 for(y2= y; y2<y+block_w; y2++) | |
3543 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x); | |
3544 } | |
3545 if(x+block_w > w){ | |
3546 for(y2= y; y2<y+block_w; y2++) | |
3547 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w); | |
3548 } | |
3549 | |
3550 assert(block_w== 8 || block_w==16); | |
3551 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w); | |
3552 } | |
3553 | |
3554 if(plane_index==0){ | |
3555 BlockNode *b= &s->block[mb_x+mb_y*b_stride]; | |
3556 int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1); | |
3557 | |
3558 /* ..RRRr | |
3559 * .RXXx. | |
3560 * .RXXx. | |
3561 * rxxx. | |
3562 */ | |
3563 if(merged) | |
3564 rate = get_block_bits(s, mb_x, mb_y, 2); | |
3565 for(i=merged?4:0; i<9; i++){ | |
3566 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}}; | |
3567 rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1); | |
3568 } | |
3569 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3570 return distortion + rate*penalty_factor; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3571 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3572 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3573 static void ff_spatial_idwt_init(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3574 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3575 for(level=decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3576 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3577 case DWT_97: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3578 case DWT_53: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3579 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3580 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3581 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3582 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3583 static void ff_spatial_idwt_slice(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3584 const int support = type==1 ? 3 : 5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3585 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3586 if(type==2) return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3587 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3588 for(level=decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3589 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3590 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3591 case DWT_97: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3592 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3593 case DWT_53: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3594 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3595 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3596 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3597 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3598 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3599 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3600 static void ff_spatial_idwt(IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3601 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3602 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3603 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3604 for(y=0; y<height; y+=4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3605 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3606 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3607 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3608 static int encode_subband_c0run(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3609 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3610 const int h= b->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3611 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3612 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3613 if(1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3614 int run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3615 int runs[w*h]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3616 int run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3617 int max_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3618 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3619 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3620 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3621 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3622 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3623 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3624 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3625 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3626 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3627 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3628 lt= src[x - 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3629 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3630 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3631 rt= src[x + 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3632 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3633 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3634 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3635 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3636 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3637 if(orientation==1) ll= src[y + (x-2)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3638 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3639 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3640 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3641 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3642 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3643 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3644 if(px<b->parent->width && py<b->parent->height) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3645 p= parent[px + py*2*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3646 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3647 if(!(/*ll|*/l|lt|t|rt|p)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3648 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3649 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3650 run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3651 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3652 run++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3653 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3654 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3655 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3656 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3657 max_index= run_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3658 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3659 run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3660 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3661 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3662 put_symbol2(&s->c, b->state[30], max_index, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3663 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3664 put_symbol2(&s->c, b->state[1], run, 3); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3665 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3666 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3667 if(s->c.bytestream_end - s->c.bytestream < w*40){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3668 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3669 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3670 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3671 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3672 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3673 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3674 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3675 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3676 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3677 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3678 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3679 lt= src[x - 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3680 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3681 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3682 rt= src[x + 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3683 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3684 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3685 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3686 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3687 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3688 if(orientation==1) ll= src[y + (x-2)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3689 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3690 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3691 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3692 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3693 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3694 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3695 if(px<b->parent->width && py<b->parent->height) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3696 p= parent[px + py*2*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3697 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3698 if(/*ll|*/l|lt|t|rt|p){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3699 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3700 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3701 put_rac(&s->c, &b->state[0][context], !!v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3702 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3703 if(!run){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3704 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3705 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3706 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3707 put_symbol2(&s->c, b->state[1], run, 3); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3708 assert(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3709 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3710 run--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3711 assert(!v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3712 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3713 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3714 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3715 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3716 int l2= 2*FFABS(l) + (l<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3717 int t2= 2*FFABS(t) + (t<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3718 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3719 put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3720 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3721 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3722 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3723 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3724 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3725 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3726 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3727 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3728 static int encode_subband(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3729 // encode_subband_qtree(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3730 // encode_subband_z0run(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3731 return encode_subband_c0run(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3732 // encode_subband_dzr(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3733 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3734 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3735 static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3736 const int b_stride= s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3737 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3738 BlockNode backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3739 int rd, index, value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3740 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3741 assert(mb_x>=0 && mb_y>=0); |
2994 | 3742 assert(mb_x<b_stride); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3743 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3744 if(intra){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3745 block->color[0] = p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3746 block->color[1] = p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3747 block->color[2] = p[2]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3748 block->type |= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3749 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3750 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1); |
3314 | 3751 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3752 if(s->me_cache[index] == value) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3753 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3754 s->me_cache[index]= value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3755 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3756 block->mx= p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3757 block->my= p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3758 block->type &= ~BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3759 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3760 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3761 rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3762 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3763 //FIXME chroma |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3764 if(rd < *best_rd){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3765 *best_rd= rd; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3766 return 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3767 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3768 *block= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3769 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3770 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3771 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3772 |
6412 | 3773 /* special case for int[2] args we discard afterwards, |
3774 * fixes compilation problem with gcc 2.95 */ | |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3775 static av_always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){ |
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3776 int p[2] = {p0, p1}; |
3197 | 3777 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd); |
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3778 } |
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3779 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3780 static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd){ |
3051 | 3781 const int b_stride= s->b_width << s->block_max_depth; |
3782 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | |
3783 BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | |
3784 int rd, index, value; | |
3785 | |
3786 assert(mb_x>=0 && mb_y>=0); | |
3787 assert(mb_x<b_stride); | |
3788 assert(((mb_x|mb_y)&1) == 0); | |
3789 | |
3790 index= (p0 + 31*p1) & (ME_CACHE_SIZE-1); | |
3314 | 3791 value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12); |
3051 | 3792 if(s->me_cache[index] == value) |
3793 return 0; | |
3794 s->me_cache[index]= value; | |
3795 | |
3796 block->mx= p0; | |
3797 block->my= p1; | |
3314 | 3798 block->ref= ref; |
3051 | 3799 block->type &= ~BLOCK_INTRA; |
3800 block[1]= block[b_stride]= block[b_stride+1]= *block; | |
3801 | |
3802 rd= get_4block_rd(s, mb_x, mb_y, 0); | |
3803 | |
3804 //FIXME chroma | |
3805 if(rd < *best_rd){ | |
3806 *best_rd= rd; | |
3807 return 1; | |
3808 }else{ | |
3809 block[0]= backup[0]; | |
3810 block[1]= backup[1]; | |
3811 block[b_stride]= backup[2]; | |
3812 block[b_stride+1]= backup[3]; | |
3813 return 0; | |
3814 } | |
3815 } | |
3816 | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3817 static void iterative_me(SnowContext *s){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3818 int pass, mb_x, mb_y; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3819 const int b_width = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3820 const int b_height= s->b_height << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3821 const int b_stride= b_width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3822 int color[3]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3823 |
3194
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3824 { |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3825 RangeCoder r = s->c; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3826 uint8_t state[sizeof(s->block_state)]; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3827 memcpy(state, s->block_state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3828 for(mb_y= 0; mb_y<s->b_height; mb_y++) |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3829 for(mb_x= 0; mb_x<s->b_width; mb_x++) |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3830 encode_q_branch(s, 0, mb_x, mb_y); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3831 s->c = r; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3832 memcpy(s->block_state, state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3833 } |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3834 |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3835 for(pass=0; pass<25; pass++){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3836 int change= 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3837 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3838 for(mb_y= 0; mb_y<b_height; mb_y++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3839 for(mb_x= 0; mb_x<b_width; mb_x++){ |
3314 | 3840 int dia_change, i, j, ref; |
3841 int best_rd= INT_MAX, ref_rd; | |
3842 BlockNode backup, ref_b; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3843 const int index= mb_x + mb_y * b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3844 BlockNode *block= &s->block[index]; |
3324 | 3845 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : NULL; |
3846 BlockNode *lb = mb_x ? &s->block[index -1] : NULL; | |
3847 BlockNode *rb = mb_x+1<b_width ? &s->block[index +1] : NULL; | |
3848 BlockNode *bb = mb_y+1<b_height ? &s->block[index+b_stride ] : NULL; | |
3849 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : NULL; | |
3850 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->block[index-b_stride+1] : NULL; | |
3851 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL; | |
3852 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->block[index+b_stride+1] : NULL; | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3853 const int b_w= (MB_SIZE >> s->block_max_depth); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3854 uint8_t obmc_edged[b_w*2][b_w*2]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3855 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3856 if(pass && (block->type & BLOCK_OPT)) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3857 continue; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3858 block->type |= BLOCK_OPT; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3859 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3860 backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3861 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3862 if(!s->me_cache_generation) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3863 memset(s->me_cache, 0, sizeof(s->me_cache)); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3864 s->me_cache_generation += 1<<22; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3865 |
6412 | 3866 //FIXME precalculate |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3867 { |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3868 int x, y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3869 memcpy(obmc_edged, obmc_tab[s->block_max_depth], b_w*b_w*4); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3870 if(mb_x==0) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3871 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3872 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3873 if(mb_x==b_stride-1) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3874 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3875 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3876 if(mb_y==0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3877 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3878 obmc_edged[0][x] += obmc_edged[b_w-1][x]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3879 for(y=1; y<b_w; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3880 memcpy(obmc_edged[y], obmc_edged[0], b_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3881 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3882 if(mb_y==b_height-1){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3883 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3884 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3885 for(y=b_w; y<b_w*2-1; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3886 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3887 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3888 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3889 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3890 //skip stuff outside the picture |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
3891 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){ |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3892 uint8_t *src= s-> input_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3893 uint8_t *dst= s->current_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3894 const int stride= s->current_picture.linesize[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3895 const int block_w= MB_SIZE >> s->block_max_depth; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3896 const int sx= block_w*mb_x - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3897 const int sy= block_w*mb_y - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3898 const int w= s->plane[0].width; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3899 const int h= s->plane[0].height; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3900 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3901 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3902 for(y=sy; y<0; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3903 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3904 for(y=h; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3905 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3906 if(sx<0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3907 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3908 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3909 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3910 if(sx+block_w*2 > w){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3911 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3912 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3913 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3914 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3915 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3916 // intra(black) = neighbors' contribution to the current block |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3917 for(i=0; i<3; i++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3918 color[i]= get_dc(s, mb_x, mb_y, i); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3919 |
5127 | 3920 // get previous score (cannot be cached due to OBMC) |
3057 | 3921 if(pass > 0 && (block->type&BLOCK_INTRA)){ |
3922 int color0[3]= {block->color[0], block->color[1], block->color[2]}; | |
3923 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd); | |
3924 }else | |
3197 | 3925 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd); |
3926 | |
3314 | 3927 ref_b= *block; |
3928 ref_rd= best_rd; | |
3929 for(ref=0; ref < s->ref_frames; ref++){ | |
3930 int16_t (*mvr)[2]= &s->ref_mvs[ref][index]; | |
3931 if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold | |
3932 continue; | |
3933 block->ref= ref; | |
3934 best_rd= INT_MAX; | |
3935 | |
3936 check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd); | |
3937 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd); | |
3324 | 3938 if(tb) |
3314 | 3939 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd); |
3324 | 3940 if(lb) |
3314 | 3941 check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd); |
3324 | 3942 if(rb) |
3314 | 3943 check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd); |
3324 | 3944 if(bb) |
3314 | 3945 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd); |
3946 | |
3947 /* fullpel ME */ | |
6412 | 3948 //FIXME avoid subpel interpolation / round to nearest integer |
3314 | 3949 do{ |
3950 dia_change=0; | |
3951 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){ | |
3952 for(j=0; j<i; j++){ | |
3953 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3954 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3955 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3956 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3957 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3958 } |
3314 | 3959 }while(dia_change); |
3960 /* subpel ME */ | |
3961 do{ | |
3962 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},}; | |
3963 dia_change=0; | |
3964 for(i=0; i<8; i++) | |
3965 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd); | |
3966 }while(dia_change); | |
3967 //FIXME or try the standard 2 pass qpel or similar | |
3968 | |
3969 mvr[0][0]= block->mx; | |
3970 mvr[0][1]= block->my; | |
3971 if(ref_rd > best_rd){ | |
3972 ref_rd= best_rd; | |
3973 ref_b= *block; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3974 } |
3314 | 3975 } |
3976 best_rd= ref_rd; | |
3977 *block= ref_b; | |
2998 | 3978 #if 1 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3979 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3980 //FIXME RD style color selection |
2998 | 3981 #endif |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3982 if(!same_block(block, &backup)){ |
3324 | 3983 if(tb ) tb ->type &= ~BLOCK_OPT; |
3984 if(lb ) lb ->type &= ~BLOCK_OPT; | |
3985 if(rb ) rb ->type &= ~BLOCK_OPT; | |
3986 if(bb ) bb ->type &= ~BLOCK_OPT; | |
3987 if(tlb) tlb->type &= ~BLOCK_OPT; | |
3988 if(trb) trb->type &= ~BLOCK_OPT; | |
3989 if(blb) blb->type &= ~BLOCK_OPT; | |
3990 if(brb) brb->type &= ~BLOCK_OPT; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3991 change ++; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3992 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3993 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3994 } |
10810 | 3995 av_log(s->avctx, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3996 if(!change) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3997 break; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3998 } |
3051 | 3999 |
4000 if(s->block_max_depth == 1){ | |
4001 int change= 0; | |
4002 for(mb_y= 0; mb_y<b_height; mb_y+=2){ | |
4003 for(mb_x= 0; mb_x<b_width; mb_x+=2){ | |
3324 | 4004 int i; |
3051 | 4005 int best_rd, init_rd; |
4006 const int index= mb_x + mb_y * b_stride; | |
4007 BlockNode *b[4]; | |
4008 | |
4009 b[0]= &s->block[index]; | |
4010 b[1]= b[0]+1; | |
4011 b[2]= b[0]+b_stride; | |
4012 b[3]= b[2]+1; | |
4013 if(same_block(b[0], b[1]) && | |
4014 same_block(b[0], b[2]) && | |
4015 same_block(b[0], b[3])) | |
4016 continue; | |
4017 | |
4018 if(!s->me_cache_generation) | |
4019 memset(s->me_cache, 0, sizeof(s->me_cache)); | |
4020 s->me_cache_generation += 1<<22; | |
4021 | |
4022 init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0); | |
4023 | |
3314 | 4024 //FIXME more multiref search? |
3051 | 4025 check_4block_inter(s, mb_x, mb_y, |
4026 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2, | |
3314 | 4027 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd); |
3051 | 4028 |
4029 for(i=0; i<4; i++) | |
4030 if(!(b[i]->type&BLOCK_INTRA)) | |
3314 | 4031 check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd); |
3051 | 4032 |
4033 if(init_rd != best_rd) | |
4034 change++; | |
4035 } | |
4036 } | |
10810 | 4037 av_log(s->avctx, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4); |
3051 | 4038 } |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4039 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4040 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4041 static void encode_blocks(SnowContext *s, int search){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4042 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4043 int w= s->b_width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4044 int h= s->b_height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4045 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4046 if(s->avctx->me_method == ME_ITER && !s->keyframe && search) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4047 iterative_me(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4048 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4049 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4050 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4051 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4052 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4053 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4054 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4055 if(s->avctx->me_method == ME_ITER || !search) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4056 encode_q_branch2(s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4057 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4058 encode_q_branch (s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4059 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4060 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4061 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4062 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4063 static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias){ |
2138 | 4064 const int w= b->width; |
4065 const int h= b->height; | |
4594 | 4066 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
5575 | 4067 const int qmul= qexp[qlog&(QROOT-1)]<<((qlog>>QSHIFT) + ENCODER_EXTRA_BITS); |
2150 | 4068 int x,y, thres1, thres2; |
2138 | 4069 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4070 if(s->qlog == LOSSLESS_QLOG){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4071 for(y=0; y<h; y++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4072 for(x=0; x<w; x++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4073 dst[x + y*stride]= src[x + y*stride]; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4074 return; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4075 } |
2967 | 4076 |
2138 | 4077 bias= bias ? 0 : (3*qmul)>>3; |
2150 | 4078 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
4079 thres2= 2*thres1; | |
2967 | 4080 |
2138 | 4081 if(!bias){ |
4082 for(y=0; y<h; y++){ | |
4083 for(x=0; x<w; x++){ | |
2150 | 4084 int i= src[x + y*stride]; |
2967 | 4085 |
2150 | 4086 if((unsigned)(i+thres1) > thres2){ |
4087 if(i>=0){ | |
4088 i<<= QEXPSHIFT; | |
4089 i/= qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4090 dst[x + y*stride]= i; |
2150 | 4091 }else{ |
4092 i= -i; | |
4093 i<<= QEXPSHIFT; | |
4094 i/= qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4095 dst[x + y*stride]= -i; |
2150 | 4096 } |
4097 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4098 dst[x + y*stride]= 0; |
2138 | 4099 } |
4100 } | |
4101 }else{ | |
4102 for(y=0; y<h; y++){ | |
4103 for(x=0; x<w; x++){ | |
2967 | 4104 int i= src[x + y*stride]; |
4105 | |
2150 | 4106 if((unsigned)(i+thres1) > thres2){ |
4107 if(i>=0){ | |
4108 i<<= QEXPSHIFT; | |
4109 i= (i + bias) / qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4110 dst[x + y*stride]= i; |
2150 | 4111 }else{ |
4112 i= -i; | |
4113 i<<= QEXPSHIFT; | |
4114 i= (i + bias) / qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4115 dst[x + y*stride]= -i; |
2150 | 4116 } |
4117 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4118 dst[x + y*stride]= 0; |
2138 | 4119 } |
4120 } | |
4121 } | |
4122 } | |
4123 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4124 static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride){ |
2138 | 4125 const int w= b->width; |
4126 const int h= b->height; | |
4594 | 4127 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 4128 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2138 | 4129 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
4130 int x,y; | |
2967 | 4131 |
2161 | 4132 if(s->qlog == LOSSLESS_QLOG) return; |
2967 | 4133 |
2138 | 4134 for(y=0; y<h; y++){ |
4135 for(x=0; x<w; x++){ | |
4136 int i= src[x + y*stride]; | |
4137 if(i<0){ | |
4138 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
4139 }else if(i>0){ | |
4140 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
4141 } | |
4142 } | |
4143 } | |
4144 } | |
4145 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4146 static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){ |
2138 | 4147 const int w= b->width; |
4148 const int h= b->height; | |
4149 int x,y; | |
2967 | 4150 |
2138 | 4151 for(y=h-1; y>=0; y--){ |
4152 for(x=w-1; x>=0; x--){ | |
4153 int i= x + y*stride; | |
2967 | 4154 |
2138 | 4155 if(x){ |
4156 if(use_median){ | |
4157 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
4158 else src[i] -= src[i - 1]; | |
4159 }else{ | |
4160 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
4161 else src[i] -= src[i - 1]; | |
4162 } | |
4163 }else{ | |
4164 if(y) src[i] -= src[i - stride]; | |
4165 } | |
4166 } | |
4167 } | |
4168 } | |
4169 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4170 static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){ |
2138 | 4171 const int w= b->width; |
4172 const int h= b->height; | |
4173 int x,y; | |
2967 | 4174 |
2138 | 4175 for(y=0; y<h; y++){ |
4176 for(x=0; x<w; x++){ | |
4177 int i= x + y*stride; | |
2967 | 4178 |
2138 | 4179 if(x){ |
4180 if(use_median){ | |
4181 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
4182 else src[i] += src[i - 1]; | |
4183 }else{ | |
4184 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
4185 else src[i] += src[i - 1]; | |
4186 } | |
4187 }else{ | |
4188 if(y) src[i] += src[i - stride]; | |
4189 } | |
4190 } | |
4191 } | |
4192 } | |
4193 | |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4194 static void encode_qlogs(SnowContext *s){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4195 int plane_index, level, orientation; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4196 |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4197 for(plane_index=0; plane_index<2; plane_index++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4198 for(level=0; level<s->spatial_decomposition_count; level++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4199 for(orientation=level ? 1:0; orientation<4; orientation++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4200 if(orientation==2) continue; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4201 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4202 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4203 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4204 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4205 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4206 |
2138 | 4207 static void encode_header(SnowContext *s){ |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4208 int plane_index, i; |
2967 | 4209 uint8_t kstate[32]; |
4210 | |
4211 memset(kstate, MID_STATE, sizeof(kstate)); | |
2138 | 4212 |
2335 | 4213 put_rac(&s->c, kstate, s->keyframe); |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4214 if(s->keyframe || s->always_reset){ |
2199 | 4215 reset_contexts(s); |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4216 s->last_spatial_decomposition_type= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4217 s->last_qlog= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4218 s->last_qbias= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4219 s->last_mv_scale= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4220 s->last_block_max_depth= 0; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4221 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4222 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4223 p->last_htaps=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4224 p->last_diag_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4225 memset(p->last_hcoeff, 0, sizeof(p->last_hcoeff)); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4226 } |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4227 } |
2138 | 4228 if(s->keyframe){ |
4229 put_symbol(&s->c, s->header_state, s->version, 0); | |
2335 | 4230 put_rac(&s->c, s->header_state, s->always_reset); |
2138 | 4231 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); |
4232 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); | |
4233 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); | |
4234 put_symbol(&s->c, s->header_state, s->colorspace_type, 0); | |
4235 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0); | |
4236 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0); | |
2335 | 4237 put_rac(&s->c, s->header_state, s->spatial_scalability); |
4238 // put_rac(&s->c, s->header_state, s->rate_scalability); | |
3314 | 4239 put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0); |
2138 | 4240 |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4241 encode_qlogs(s); |
2138 | 4242 } |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4243 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4244 if(!s->keyframe){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4245 int update_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4246 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4247 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4248 update_mc |= p->last_htaps != p->htaps; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4249 update_mc |= p->last_diag_mc != p->diag_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4250 update_mc |= !!memcmp(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4251 } |
5667
9242e125395f
do not force the halfpel filter coeffs to be retransmitted on every frame
michael
parents:
5666
diff
changeset
|
4252 put_rac(&s->c, s->header_state, update_mc); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4253 if(update_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4254 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4255 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4256 put_rac(&s->c, s->header_state, p->diag_mc); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4257 put_symbol(&s->c, s->header_state, p->htaps/2-1, 0); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4258 for(i= p->htaps/2; i; i--) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4259 put_symbol(&s->c, s->header_state, FFABS(p->hcoeff[i]), 0); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4260 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4261 } |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4262 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4263 put_rac(&s->c, s->header_state, 1); |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4264 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4265 encode_qlogs(s); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4266 }else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4267 put_rac(&s->c, s->header_state, 0); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4268 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4269 |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4270 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type - s->last_spatial_decomposition_type, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4271 put_symbol(&s->c, s->header_state, s->qlog - s->last_qlog , 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4272 put_symbol(&s->c, s->header_state, s->mv_scale - s->last_mv_scale, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4273 put_symbol(&s->c, s->header_state, s->qbias - s->last_qbias , 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4274 put_symbol(&s->c, s->header_state, s->block_max_depth - s->last_block_max_depth, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4275 |
6144 | 4276 } |
4277 | |
4278 static void update_last_header_values(SnowContext *s){ | |
4279 int plane_index; | |
4280 | |
4281 if(!s->keyframe){ | |
4282 for(plane_index=0; plane_index<2; plane_index++){ | |
4283 Plane *p= &s->plane[plane_index]; | |
4284 p->last_diag_mc= p->diag_mc; | |
4285 p->last_htaps = p->htaps; | |
4286 memcpy(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); | |
4287 } | |
4288 } | |
4289 | |
6414 | 4290 s->last_spatial_decomposition_type = s->spatial_decomposition_type; |
4291 s->last_qlog = s->qlog; | |
4292 s->last_qbias = s->qbias; | |
4293 s->last_mv_scale = s->mv_scale; | |
4294 s->last_block_max_depth = s->block_max_depth; | |
4295 s->last_spatial_decomposition_count = s->spatial_decomposition_count; | |
2138 | 4296 } |
4297 | |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4298 static int qscale2qlog(int qscale){ |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4299 return rint(QROOT*log(qscale / (float)FF_QP2LAMBDA)/log(2)) |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4300 + 61*QROOT/8; //<64 >60 |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4301 } |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4302 |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4303 static int ratecontrol_1pass(SnowContext *s, AVFrame *pict) |
3313 | 4304 { |
6412 | 4305 /* Estimate the frame's complexity as a sum of weighted dwt coefficients. |
3313 | 4306 * FIXME we know exact mv bits at this point, |
4307 * but ratecontrol isn't set up to include them. */ | |
4308 uint32_t coef_sum= 0; | |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4309 int level, orientation, delta_qlog; |
3313 | 4310 |
4311 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4312 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4313 SubBand *b= &s->plane[0].band[level][orientation]; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4314 IDWTELEM *buf= b->ibuf; |
3313 | 4315 const int w= b->width; |
4316 const int h= b->height; | |
4317 const int stride= b->stride; | |
4594 | 4318 const int qlog= av_clip(2*QROOT + b->qlog, 0, QROOT*16); |
3313 | 4319 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
4320 const int qdiv= (1<<16)/qmul; | |
4321 int x, y; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4322 //FIXME this is ugly |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4323 for(y=0; y<h; y++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4324 for(x=0; x<w; x++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4325 buf[x+y*stride]= b->buf[x+y*stride]; |
3313 | 4326 if(orientation==0) |
4327 decorrelate(s, b, buf, stride, 1, 0); | |
4328 for(y=0; y<h; y++) | |
4329 for(x=0; x<w; x++) | |
4330 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16; | |
4331 } | |
4332 } | |
4333 | |
4334 /* ugly, ratecontrol just takes a sqrt again */ | |
4335 coef_sum = (uint64_t)coef_sum * coef_sum >> 16; | |
4336 assert(coef_sum < INT_MAX); | |
4337 | |
6481 | 4338 if(pict->pict_type == FF_I_TYPE){ |
3313 | 4339 s->m.current_picture.mb_var_sum= coef_sum; |
4340 s->m.current_picture.mc_mb_var_sum= 0; | |
4341 }else{ | |
4342 s->m.current_picture.mc_mb_var_sum= coef_sum; | |
4343 s->m.current_picture.mb_var_sum= 0; | |
4344 } | |
4345 | |
4346 pict->quality= ff_rate_estimate_qscale(&s->m, 1); | |
3766 | 4347 if (pict->quality < 0) |
4011
5bce97c30a69
-1 is a valid return value in ratecontrol_1pass() -> 100l for takis
michael
parents:
4001
diff
changeset
|
4348 return INT_MIN; |
3313 | 4349 s->lambda= pict->quality * 3/2; |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4350 delta_qlog= qscale2qlog(pict->quality) - s->qlog; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4351 s->qlog+= delta_qlog; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4352 return delta_qlog; |
3313 | 4353 } |
2138 | 4354 |
5909 | 4355 static void calculate_visual_weight(SnowContext *s, Plane *p){ |
2138 | 4356 int width = p->width; |
4357 int height= p->height; | |
2198 | 4358 int level, orientation, x, y; |
2138 | 4359 |
4360 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4361 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4362 SubBand *b= &p->band[level][orientation]; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4363 IDWTELEM *ibuf= b->ibuf; |
2138 | 4364 int64_t error=0; |
2967 | 4365 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4366 memset(s->spatial_idwt_buffer, 0, sizeof(*s->spatial_idwt_buffer)*width*height); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4367 ibuf[b->width/2 + b->height/2*b->stride]= 256*16; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4368 ff_spatial_idwt(s->spatial_idwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 4369 for(y=0; y<height; y++){ |
4370 for(x=0; x<width; x++){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4371 int64_t d= s->spatial_idwt_buffer[x + y*width]*16; |
2138 | 4372 error += d*d; |
4373 } | |
4374 } | |
4375 | |
4376 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
4377 } | |
4378 } | |
4379 } | |
4380 | |
4381 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
4382 SnowContext *s = avctx->priv_data; | |
2335 | 4383 RangeCoder * const c= &s->c; |
2138 | 4384 AVFrame *pict = data; |
4385 const int width= s->avctx->width; | |
4386 const int height= s->avctx->height; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4387 int level, orientation, plane_index, i, y; |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4388 uint8_t rc_header_bak[sizeof(s->header_state)]; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4389 uint8_t rc_block_bak[sizeof(s->block_state)]; |
2138 | 4390 |
2335 | 4391 ff_init_range_encoder(c, buf, buf_size); |
4392 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
2967 | 4393 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4394 for(i=0; i<3; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4395 int shift= !!i; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4396 for(y=0; y<(height>>shift); y++) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4397 memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]], |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4398 &pict->data[i][y * pict->linesize[i]], |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4399 width>>shift); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4400 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4401 s->new_picture = *pict; |
2138 | 4402 |
3313 | 4403 s->m.picture_number= avctx->frame_number; |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4404 if(avctx->flags&CODEC_FLAG_PASS2){ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4405 s->m.pict_type = |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4406 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4407 s->keyframe= pict->pict_type==FF_I_TYPE; |
3766 | 4408 if(!(avctx->flags&CODEC_FLAG_QSCALE)) { |
3193 | 4409 pict->quality= ff_rate_estimate_qscale(&s->m, 0); |
3766 | 4410 if (pict->quality < 0) |
4411 return -1; | |
4412 } | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4413 }else{ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4414 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; |
3313 | 4415 s->m.pict_type= |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4416 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4417 } |
2967 | 4418 |
3313 | 4419 if(s->pass1_rc && avctx->frame_number == 0) |
4420 pict->quality= 2*FF_QP2LAMBDA; | |
2161 | 4421 if(pict->quality){ |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4422 s->qlog= qscale2qlog(pict->quality); |
3313 | 4423 s->lambda = pict->quality * 3/2; |
4424 } | |
4425 if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){ | |
2161 | 4426 s->qlog= LOSSLESS_QLOG; |
3313 | 4427 s->lambda = 0; |
6412 | 4428 }//else keep previous frame's qlog until after motion estimation |
2138 | 4429 |
4430 frame_start(s); | |
4431 | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4432 s->m.current_picture_ptr= &s->m.current_picture; |
10625 | 4433 s->m.last_picture.pts= s->m.current_picture.pts; |
4434 s->m.current_picture.pts= pict->pts; | |
6481 | 4435 if(pict->pict_type == FF_P_TYPE){ |
2138 | 4436 int block_width = (width +15)>>4; |
4437 int block_height= (height+15)>>4; | |
4438 int stride= s->current_picture.linesize[0]; | |
2967 | 4439 |
2138 | 4440 assert(s->current_picture.data[0]); |
3314 | 4441 assert(s->last_picture[0].data[0]); |
2967 | 4442 |
2138 | 4443 s->m.avctx= s->avctx; |
4444 s->m.current_picture.data[0]= s->current_picture.data[0]; | |
3314 | 4445 s->m. last_picture.data[0]= s->last_picture[0].data[0]; |
2138 | 4446 s->m. new_picture.data[0]= s-> input_picture.data[0]; |
4447 s->m. last_picture_ptr= &s->m. last_picture; | |
4448 s->m.linesize= | |
4449 s->m. last_picture.linesize[0]= | |
4450 s->m. new_picture.linesize[0]= | |
4451 s->m.current_picture.linesize[0]= stride; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4452 s->m.uvlinesize= s->current_picture.linesize[1]; |
2138 | 4453 s->m.width = width; |
4454 s->m.height= height; | |
4455 s->m.mb_width = block_width; | |
4456 s->m.mb_height= block_height; | |
4457 s->m.mb_stride= s->m.mb_width+1; | |
4458 s->m.b8_stride= 2*s->m.mb_width+1; | |
4459 s->m.f_code=1; | |
4460 s->m.pict_type= pict->pict_type; | |
4461 s->m.me_method= s->avctx->me_method; | |
4462 s->m.me.scene_change_score=0; | |
4463 s->m.flags= s->avctx->flags; | |
4464 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0; | |
4465 s->m.out_format= FMT_H263; | |
4466 s->m.unrestricted_mv= 1; | |
4467 | |
3313 | 4468 s->m.lambda = s->lambda; |
2138 | 4469 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4470 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4471 |
2138 | 4472 s->m.dsp= s->dsp; //move |
4473 ff_init_me(&s->m); | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4474 s->dsp= s->m.dsp; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4475 } |
2967 | 4476 |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4477 if(s->pass1_rc){ |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4478 memcpy(rc_header_bak, s->header_state, sizeof(s->header_state)); |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4479 memcpy(rc_block_bak, s->block_state, sizeof(s->block_state)); |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4480 } |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4481 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4482 redo_frame: |
2967 | 4483 |
6481 | 4484 if(pict->pict_type == FF_I_TYPE) |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4485 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4486 else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4487 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4488 |
3313 | 4489 s->m.pict_type = pict->pict_type; |
6481 | 4490 s->qbias= pict->pict_type == FF_P_TYPE ? 2 : 0; |
2138 | 4491 |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4492 common_init_after_header(avctx); |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4493 |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4494 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4495 for(plane_index=0; plane_index<3; plane_index++){ |
5909 | 4496 calculate_visual_weight(s, &s->plane[plane_index]); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4497 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4498 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4499 |
2138 | 4500 encode_header(s); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4501 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4502 encode_blocks(s, 1); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4503 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits; |
2967 | 4504 |
2138 | 4505 for(plane_index=0; plane_index<3; plane_index++){ |
4506 Plane *p= &s->plane[plane_index]; | |
4507 int w= p->width; | |
4508 int h= p->height; | |
4509 int x, y; | |
2198 | 4510 // int bits= put_bits_count(&s->c.pb); |
2138 | 4511 |
6414 | 4512 if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){ |
4513 //FIXME optimize | |
4514 if(pict->data[plane_index]) //FIXME gray hack | |
4515 for(y=0; y<h; y++){ | |
4516 for(x=0; x<w; x++){ | |
4517 s->spatial_idwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS; | |
4518 } | |
4519 } | |
4520 predict_plane(s, s->spatial_idwt_buffer, plane_index, 0); | |
4521 | |
4522 if( plane_index==0 | |
6481 | 4523 && pict->pict_type == FF_P_TYPE |
6414 | 4524 && !(avctx->flags&CODEC_FLAG_PASS2) |
4525 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){ | |
4526 ff_init_range_encoder(c, buf, buf_size); | |
4527 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
4528 pict->pict_type= FF_I_TYPE; | |
4529 s->keyframe=1; | |
4530 s->current_picture.key_frame=1; | |
4531 goto redo_frame; | |
2138 | 4532 } |
6414 | 4533 |
4534 if(s->qlog == LOSSLESS_QLOG){ | |
4535 for(y=0; y<h; y++){ | |
4536 for(x=0; x<w; x++){ | |
4537 s->spatial_dwt_buffer[y*w + x]= (s->spatial_idwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS; | |
4538 } | |
2161 | 4539 } |
6414 | 4540 }else{ |
4541 for(y=0; y<h; y++){ | |
4542 for(x=0; x<w; x++){ | |
4543 s->spatial_dwt_buffer[y*w + x]=s->spatial_idwt_buffer[y*w + x]<<ENCODER_EXTRA_BITS; | |
4544 } | |
5575 | 4545 } |
4546 } | |
6414 | 4547 |
4548 /* if(QUANTIZE2) | |
4549 dwt_quantize(s, p, s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type); | |
4550 else*/ | |
4551 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4552 | |
4553 if(s->pass1_rc && plane_index==0){ | |
4554 int delta_qlog = ratecontrol_1pass(s, pict); | |
4555 if (delta_qlog <= INT_MIN) | |
4556 return -1; | |
4557 if(delta_qlog){ | |
4558 //reordering qlog in the bitstream would eliminate this reset | |
4559 ff_init_range_encoder(c, buf, buf_size); | |
4560 memcpy(s->header_state, rc_header_bak, sizeof(s->header_state)); | |
4561 memcpy(s->block_state, rc_block_bak, sizeof(s->block_state)); | |
4562 encode_header(s); | |
4563 encode_blocks(s, 0); | |
2161 | 4564 } |
4565 } | |
6414 | 4566 |
4567 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4568 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4569 SubBand *b= &p->band[level][orientation]; | |
4570 | |
4571 if(!QUANTIZE2) | |
4572 quantize(s, b, b->ibuf, b->buf, b->stride, s->qbias); | |
4573 if(orientation==0) | |
6481 | 4574 decorrelate(s, b, b->ibuf, b->stride, pict->pict_type == FF_P_TYPE, 0); |
6414 | 4575 encode_subband(s, b, b->ibuf, b->parent ? b->parent->ibuf : NULL, b->stride, orientation); |
4576 assert(b->parent==NULL || b->parent->stride == b->stride*2); | |
4577 if(orientation==0) | |
4578 correlate(s, b, b->ibuf, b->stride, 1, 0); | |
4579 } | |
4580 } | |
4581 | |
4582 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4583 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4584 SubBand *b= &p->band[level][orientation]; | |
4585 | |
4586 dequantize(s, b, b->ibuf, b->stride); | |
4587 } | |
4588 } | |
4589 | |
4590 ff_spatial_idwt(s->spatial_idwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4591 if(s->qlog == LOSSLESS_QLOG){ | |
4592 for(y=0; y<h; y++){ | |
4593 for(x=0; x<w; x++){ | |
4594 s->spatial_idwt_buffer[y*w + x]<<=FRAC_BITS; | |
4595 } | |
4596 } | |
4597 } | |
4598 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); | |
4599 }else{ | |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4600 //ME/MC only |
6481 | 4601 if(pict->pict_type == FF_I_TYPE){ |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4602 for(y=0; y<h; y++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4603 for(x=0; x<w; x++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4604 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4605 pict->data[plane_index][y*pict->linesize[plane_index] + x]; |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4606 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4607 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4608 }else{ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4609 memset(s->spatial_idwt_buffer, 0, sizeof(IDWTELEM)*w*h); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4610 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4611 } |
6414 | 4612 } |
2138 | 4613 if(s->avctx->flags&CODEC_FLAG_PSNR){ |
4614 int64_t error= 0; | |
2967 | 4615 |
6414 | 4616 if(pict->data[plane_index]) //FIXME gray hack |
4617 for(y=0; y<h; y++){ | |
4618 for(x=0; x<w; x++){ | |
4619 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]; | |
4620 error += d*d; | |
4621 } | |
2138 | 4622 } |
4623 s->avctx->error[plane_index] += error; | |
2232 | 4624 s->current_picture.error[plane_index] = error; |
2138 | 4625 } |
6414 | 4626 |
2138 | 4627 } |
4628 | |
6144 | 4629 update_last_header_values(s); |
4630 | |
9374 | 4631 release_buffer(avctx); |
2138 | 4632 |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4633 s->current_picture.coded_picture_number = avctx->frame_number; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4634 s->current_picture.pict_type = pict->pict_type; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4635 s->current_picture.quality = pict->quality; |
3313 | 4636 s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
4637 s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits; | |
4638 s->m.current_picture.display_picture_number = | |
4639 s->m.current_picture.coded_picture_number = avctx->frame_number; | |
4640 s->m.current_picture.quality = pict->quality; | |
4641 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start); | |
4642 if(s->pass1_rc) | |
3766 | 4643 if (ff_rate_estimate_qscale(&s->m, 0) < 0) |
4644 return -1; | |
3313 | 4645 if(avctx->flags&CODEC_FLAG_PASS1) |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4646 ff_write_pass1_stats(&s->m); |
3313 | 4647 s->m.last_pict_type = s->m.pict_type; |
4123
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4648 avctx->frame_bits = s->m.frame_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4649 avctx->mv_bits = s->m.mv_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4650 avctx->misc_bits = s->m.misc_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4651 avctx->p_tex_bits = s->m.p_tex_bits; |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4652 |
2138 | 4653 emms_c(); |
2967 | 4654 |
2335 | 4655 return ff_rac_terminate(c); |
2138 | 4656 } |
4657 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
4658 static av_cold int encode_end(AVCodecContext *avctx) |
2138 | 4659 { |
4660 SnowContext *s = avctx->priv_data; | |
4661 | |
4662 common_end(s); | |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4663 if (s->input_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4664 avctx->release_buffer(avctx, &s->input_picture); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4665 av_free(avctx->stats_out); |
2138 | 4666 |
4667 return 0; | |
4668 } | |
4669 | |
4670 AVCodec snow_encoder = { | |
4671 "snow", | |
4672 CODEC_TYPE_VIDEO, | |
4673 CODEC_ID_SNOW, | |
4674 sizeof(SnowContext), | |
4675 encode_init, | |
4676 encode_frame, | |
4677 encode_end, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
4678 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
2138 | 4679 }; |
2408
a6e4da1c28ee
Disable encoders patch by (Gianluigi Tiesi <mplayer netfarm it>)
michael
parents:
2368
diff
changeset
|
4680 #endif |
2138 | 4681 |
4682 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4683 #ifdef TEST |
2138 | 4684 #undef malloc |
4685 #undef free | |
4686 #undef printf | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4687 |
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4688 #include "libavutil/lfg.h" |
2138 | 4689 |
5934 | 4690 int main(void){ |
2138 | 4691 int width=256; |
4692 int height=256; | |
4693 int buffer[2][width*height]; | |
4694 SnowContext s; | |
4695 int i; | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4696 AVLFG prng; |
2138 | 4697 s.spatial_decomposition_count=6; |
4698 s.spatial_decomposition_type=1; | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4699 |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4700 av_lfg_init(&prng, 1); |
2967 | 4701 |
2138 | 4702 printf("testing 5/3 DWT\n"); |
4703 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4704 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4705 |
2951 | 4706 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4707 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4708 |
2138 | 4709 for(i=0; i<width*height; i++) |
9197 | 4710 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2138 | 4711 |
4712 printf("testing 9/7 DWT\n"); | |
4713 s.spatial_decomposition_type=0; | |
4714 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4715 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4716 |
2951 | 4717 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4718 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4719 |
2138 | 4720 for(i=0; i<width*height; i++) |
9197 | 4721 if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2967 | 4722 |
2951 | 4723 #if 0 |
2138 | 4724 printf("testing AC coder\n"); |
4725 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4726 ff_init_range_encoder(&s.c, buffer[0], 256*256); |
2138 | 4727 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4728 |
2138 | 4729 for(i=-256; i<256; i++){ |
4001 | 4730 put_symbol(&s.c, s.header_state, i*i*i/3*FFABS(i), 1); |
2138 | 4731 } |
2335 | 4732 ff_rac_terminate(&s.c); |
2138 | 4733 |
4734 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4735 ff_init_range_decoder(&s.c, buffer[0], 256*256); |
2138 | 4736 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4737 |
2138 | 4738 for(i=-256; i<256; i++){ |
4739 int j; | |
4740 j= get_symbol(&s.c, s.header_state, 1); | |
4001 | 4741 if(j!=i*i*i/3*FFABS(i)) printf("fsck: %d != %d\n", i, j); |
2138 | 4742 } |
2951 | 4743 #endif |
6414 | 4744 { |
4745 int level, orientation, x, y; | |
4746 int64_t errors[8][4]; | |
4747 int64_t g=0; | |
4748 | |
4749 memset(errors, 0, sizeof(errors)); | |
4750 s.spatial_decomposition_count=3; | |
4751 s.spatial_decomposition_type=0; | |
4752 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4753 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4754 int w= width >> (s.spatial_decomposition_count-level); | |
4755 int h= height >> (s.spatial_decomposition_count-level); | |
4756 int stride= width << (s.spatial_decomposition_count-level); | |
4757 DWTELEM *buf= buffer[0]; | |
4758 int64_t error=0; | |
4759 | |
4760 if(orientation&1) buf+=w; | |
4761 if(orientation>1) buf+=stride>>1; | |
4762 | |
4763 memset(buffer[0], 0, sizeof(int)*width*height); | |
4764 buf[w/2 + h/2*stride]= 256*256; | |
4765 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
4766 for(y=0; y<height; y++){ | |
4767 for(x=0; x<width; x++){ | |
4768 int64_t d= buffer[0][x + y*width]; | |
4769 error += d*d; | |
4770 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d); | |
4771 } | |
4772 if(FFABS(height/2-y)<9 && level==2) printf("\n"); | |
2138 | 4773 } |
6414 | 4774 error= (int)(sqrt(error)+0.5); |
4775 errors[level][orientation]= error; | |
8611 | 4776 if(g) g=av_gcd(g, error); |
6414 | 4777 else g= error; |
2138 | 4778 } |
4779 } | |
6414 | 4780 printf("static int const visual_weight[][4]={\n"); |
4781 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4782 printf(" {"); | |
4783 for(orientation=0; orientation<4; orientation++){ | |
4784 printf("%8"PRId64",", errors[level][orientation]/g); | |
4785 } | |
4786 printf("},\n"); | |
2138 | 4787 } |
6414 | 4788 printf("};\n"); |
4789 { | |
2138 | 4790 int level=2; |
4791 int w= width >> (s.spatial_decomposition_count-level); | |
6168 | 4792 //int h= height >> (s.spatial_decomposition_count-level); |
2138 | 4793 int stride= width << (s.spatial_decomposition_count-level); |
4794 DWTELEM *buf= buffer[0]; | |
4795 int64_t error=0; | |
4796 | |
4797 buf+=w; | |
4798 buf+=stride>>1; | |
2967 | 4799 |
2138 | 4800 memset(buffer[0], 0, sizeof(int)*width*height); |
4801 #if 1 | |
4802 for(y=0; y<height; y++){ | |
4803 for(x=0; x<width; x++){ | |
4804 int tab[4]={0,2,3,1}; | |
4805 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)]; | |
4806 } | |
4807 } | |
2951 | 4808 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4809 #else |
4810 for(y=0; y<h; y++){ | |
4811 for(x=0; x<w; x++){ | |
4812 buf[x + y*stride ]=169; | |
4813 buf[x + y*stride-w]=64; | |
4814 } | |
4815 } | |
2951 | 4816 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4817 #endif |
4818 for(y=0; y<height; y++){ | |
4819 for(x=0; x<width; x++){ | |
4820 int64_t d= buffer[0][x + y*width]; | |
4821 error += d*d; | |
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4822 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d); |
2138 | 4823 } |
4001 | 4824 if(FFABS(height/2-y)<9) printf("\n"); |
2138 | 4825 } |
6414 | 4826 } |
4827 | |
2138 | 4828 } |
4829 return 0; | |
4830 } | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4831 #endif /* TEST */ |