Mercurial > libavcodec.hg
annotate snow.c @ 10809:35ced8a13d7d libavcodec
Cosmetics : remove duplicated comment.
author | jai_menon |
---|---|
date | Fri, 08 Jan 2010 14:33:35 +0000 |
parents | e58e93f04279 |
children | 0f4dee00de1d |
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 #if 0 | |
2893 | 1019 int A1,A2,A3,A4; |
2138 | 1020 A2= temp[1 ]; |
1021 A4= temp[0 ]; | |
1022 A1= temp[0+width2]; | |
1023 A1 -= (A2 + A4)>>1; | |
1024 A4 += (A1 + 1)>>1; | |
1025 b[0+width2] = A1; | |
1026 b[0 ] = A4; | |
1027 for(x=1; x+1<width2; x+=2){ | |
1028 A3= temp[x+width2]; | |
1029 A4= temp[x+1 ]; | |
1030 A3 -= (A2 + A4)>>1; | |
1031 A2 += (A1 + A3 + 2)>>2; | |
1032 b[x+width2] = A3; | |
1033 b[x ] = A2; | |
1034 | |
1035 A1= temp[x+1+width2]; | |
1036 A2= temp[x+2 ]; | |
1037 A1 -= (A2 + A4)>>1; | |
1038 A4 += (A1 + A3 + 2)>>2; | |
1039 b[x+1+width2] = A1; | |
1040 b[x+1 ] = A4; | |
1041 } | |
1042 A3= temp[width-1]; | |
1043 A3 -= A2; | |
1044 A2 += (A1 + A3 + 2)>>2; | |
1045 b[width -1] = A3; | |
1046 b[width2-1] = A2; | |
2967 | 1047 #else |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1048 inv_lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1049 inv_lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1); |
5910 | 1050 #endif /* 0 */ |
2138 | 1051 for(x=0; x<width2; x++){ |
1052 b[2*x ]= temp[x ]; | |
1053 b[2*x + 1]= temp[x+w2]; | |
1054 } | |
1055 if(width&1) | |
1056 b[2*x ]= temp[x ]; | |
1057 } | |
1058 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1059 static void vertical_compose53iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1060 int i; |
2967 | 1061 |
2138 | 1062 for(i=0; i<width; i++){ |
1063 b1[i] += (b0[i] + b2[i])>>1; | |
1064 } | |
1065 } | |
1066 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1067 static void vertical_compose53iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1068 int i; |
2967 | 1069 |
2138 | 1070 for(i=0; i<width; i++){ |
1071 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
1072 } | |
1073 } | |
1074 | |
8308 | 1075 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
|
1076 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
|
1077 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
|
1078 cs->y = -1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1079 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1080 |
8308 | 1081 static void spatial_compose53i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1082 cs->b0 = buffer + mirror(-1-1, height-1)*stride; |
1083 cs->b1 = buffer + mirror(-1 , height-1)*stride; | |
1084 cs->y = -1; | |
1085 } | |
1086 | |
8308 | 1087 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
|
1088 int y= cs->y; |
2967 | 1089 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1090 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1091 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1092 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
|
1093 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
|
1094 |
2998 | 1095 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1096 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
6405 | 1097 |
2998 | 1098 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1099 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1100 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1101 cs->b0 = b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1102 cs->b1 = b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1103 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1104 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1105 |
8308 | 1106 static void spatial_compose53i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1107 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
|
1108 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1109 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1110 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
|
1111 IDWTELEM *b3= buffer + mirror(y+2, height-1)*stride; |
2138 | 1112 |
2998 | 1113 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1114 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
6405 | 1115 |
2998 | 1116 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1117 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2138 | 1118 |
2562 | 1119 cs->b0 = b2; |
1120 cs->b1 = b3; | |
1121 cs->y += 2; | |
1122 } | |
1123 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1124 static void av_unused spatial_compose53i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1125 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1126 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
|
1127 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
|
1128 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
|
1129 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1130 |
2967 | 1131 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1132 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
|
1133 IDWTELEM temp[width]; |
2138 | 1134 const int w2= (width+1)>>1; |
1135 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1136 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
|
1137 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
|
1138 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
|
1139 inv_lift (b+1 , temp+w2, b , 2, 1, 2, width, W_AM, W_AO, W_AS, 1, 0); |
2138 | 1140 } |
1141 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1142 static void vertical_compose97iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1143 int i; |
2967 | 1144 |
2138 | 1145 for(i=0; i<width; i++){ |
1146 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1147 } | |
1148 } | |
1149 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1150 static void vertical_compose97iH1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1151 int i; |
2967 | 1152 |
2138 | 1153 for(i=0; i<width; i++){ |
1154 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1155 } | |
1156 } | |
1157 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1158 static void vertical_compose97iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1159 int i; |
2967 | 1160 |
2138 | 1161 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
|
1162 #ifdef liftS |
2138 | 1163 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
|
1164 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1165 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
|
1166 #endif |
2138 | 1167 } |
1168 } | |
1169 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1170 static void vertical_compose97iL1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1171 int i; |
2967 | 1172 |
2138 | 1173 for(i=0; i<width; i++){ |
1174 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1175 } | |
1176 } | |
1177 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1178 void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width){ |
2592 | 1179 int i; |
2967 | 1180 |
2592 | 1181 for(i=0; i<width; i++){ |
1182 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS; | |
1183 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
|
1184 #ifdef liftS |
2592 | 1185 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
|
1186 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1187 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
|
1188 #endif |
2592 | 1189 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; |
1190 } | |
1191 } | |
1192 | |
8308 | 1193 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
|
1194 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
|
1195 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
|
1196 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
|
1197 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
|
1198 cs->y = -3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1199 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1200 |
8308 | 1201 static void spatial_compose97i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1202 cs->b0 = buffer + mirror(-3-1, height-1)*stride; |
1203 cs->b1 = buffer + mirror(-3 , height-1)*stride; | |
1204 cs->b2 = buffer + mirror(-3+1, height-1)*stride; | |
1205 cs->b3 = buffer + mirror(-3+2, height-1)*stride; | |
1206 cs->y = -3; | |
1207 } | |
2138 | 1208 |
8308 | 1209 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
|
1210 int y = cs->y; |
2967 | 1211 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1212 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1213 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1214 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1215 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1216 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
|
1217 IDWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line); |
2967 | 1218 |
2592 | 1219 if(y>0 && y+4<height){ |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1220 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width); |
2592 | 1221 }else{ |
2998 | 1222 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1223 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1224 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1225 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
2592 | 1226 } |
6405 | 1227 |
9495 | 1228 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width); |
1229 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
|
1230 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1231 cs->b0=b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1232 cs->b1=b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1233 cs->b2=b4; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1234 cs->b3=b5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1235 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1236 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1237 |
8308 | 1238 static void spatial_compose97i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1239 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
|
1240 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1241 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1242 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1243 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1244 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
|
1245 IDWTELEM *b5= buffer + mirror(y+4, height-1)*stride; |
2138 | 1246 |
9495 | 1247 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1248 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1249 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1250 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
1251 | |
1252 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width); | |
1253 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width); | |
2562 | 1254 |
1255 cs->b0=b2; | |
1256 cs->b1=b3; | |
1257 cs->b2=b4; | |
1258 cs->b3=b5; | |
1259 cs->y += 2; | |
1260 } | |
1261 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1262 static void av_unused spatial_compose97i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1263 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1264 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
|
1265 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
|
1266 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
|
1267 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1268 |
8308 | 1269 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
|
1270 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1271 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1272 switch(type){ |
3326 | 1273 case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; |
1274 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
|
1275 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1276 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1277 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1278 |
8308 | 1279 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
|
1280 const int support = type==1 ? 3 : 5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1281 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1282 if(type==2) return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1283 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1284 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1285 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1286 switch(type){ |
3326 | 1287 case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1288 break; |
3326 | 1289 case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1290 break; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1291 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1292 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1293 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1294 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1295 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1296 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){ |
2138 | 1297 const int w= b->width; |
1298 const int h= b->height; | |
1299 int x,y; | |
2967 | 1300 |
2138 | 1301 if(1){ |
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1302 int run, runs; |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1303 x_and_coeff *xc= b->x_coeff; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1304 x_and_coeff *prev_xc= NULL; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1305 x_and_coeff *prev2_xc= xc; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1306 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1307 x_and_coeff *prev_parent_xc= parent_xc; |
2138 | 1308 |
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1309 runs= get_symbol2(&s->c, b->state[30], 0); |
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1310 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); |
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1311 else run= INT_MAX; |
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1312 |
2138 | 1313 for(y=0; y<h; y++){ |
2193 | 1314 int v=0; |
1315 int lt=0, t=0, rt=0; | |
1316 | |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1317 if(y && prev_xc->x == 0){ |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1318 rt= prev_xc->coeff; |
2193 | 1319 } |
2138 | 1320 for(x=0; x<w; x++){ |
2193 | 1321 int p=0; |
1322 const int l= v; | |
2967 | 1323 |
2193 | 1324 lt= t; t= rt; |
1325 | |
2194 | 1326 if(y){ |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1327 if(prev_xc->x <= x) |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1328 prev_xc++; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1329 if(prev_xc->x == x + 1) |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1330 rt= prev_xc->coeff; |
2194 | 1331 else |
1332 rt=0; | |
1333 } | |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1334 if(parent_xc){ |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1335 if(x>>1 > parent_xc->x){ |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1336 parent_xc++; |
2192 | 1337 } |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1338 if(x>>1 == parent_xc->x){ |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1339 p= parent_xc->coeff; |
2194 | 1340 } |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1341 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1342 if(/*ll|*/l|lt|t|rt|p){ |
4001 | 1343 int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); |
2144 | 1344 |
2335 | 1345 v=get_rac(&s->c, &b->state[0][context]); |
2605 | 1346 if(v){ |
1347 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); | |
1348 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]); | |
2967 | 1349 |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1350 xc->x=x; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1351 (xc++)->coeff= v; |
2605 | 1352 } |
2138 | 1353 }else{ |
1354 if(!run){ | |
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1355 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); |
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1356 else run= INT_MAX; |
2605 | 1357 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); |
1358 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]); | |
2967 | 1359 |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1360 xc->x=x; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1361 (xc++)->coeff= v; |
2138 | 1362 }else{ |
2606 | 1363 int max_run; |
2138 | 1364 run--; |
1365 v=0; | |
2191 | 1366 |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1367 if(y) max_run= FFMIN(run, prev_xc->x - x - 2); |
2606 | 1368 else max_run= FFMIN(run, w-x-1); |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1369 if(parent_xc) |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1370 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1); |
2606 | 1371 x+= max_run; |
1372 run-= max_run; | |
2138 | 1373 } |
1374 } | |
2192 | 1375 } |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1376 (xc++)->x= w+1; //end marker |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1377 prev_xc= prev2_xc; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1378 prev2_xc= xc; |
2967 | 1379 |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1380 if(parent_xc){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1381 if(y&1){ |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1382 while(parent_xc->x != parent->width+1) |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1383 parent_xc++; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1384 parent_xc++; |
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1385 prev_parent_xc= parent_xc; |
2192 | 1386 }else{ |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1387 parent_xc= prev_parent_xc; |
2138 | 1388 } |
1389 } | |
1390 } | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1391 |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1392 (xc++)->x= w+1; //end marker |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1393 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1394 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1395 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1396 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
|
1397 const int w= b->width; |
2893 | 1398 int y; |
4594 | 1399 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 1400 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1401 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1402 int new_index = 0; |
2967 | 1403 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1404 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
|
1405 qadd= 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1406 qmul= 1<<QEXPSHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1407 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1408 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1409 /* 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
|
1410 if (start_y != 0) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1411 new_index = save_state[0]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1412 |
2967 | 1413 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1414 for(y=start_y; y<h; y++){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1415 int x = 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1416 int v; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1417 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
|
1418 memset(line, 0, b->width*sizeof(IDWTELEM)); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1419 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1420 x = b->x_coeff[new_index++].x; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
1421 while(x < w){ |
2596 | 1422 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT; |
1423 register int u= -(v&1); | |
1424 line[x] = (t^u) - u; | |
1425 | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1426 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1427 x = b->x_coeff[new_index++].x; |
2138 | 1428 } |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1429 } |
2967 | 1430 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1431 /* Save our variables for the next slice. */ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1432 save_state[0] = new_index; |
2967 | 1433 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1434 return; |
2138 | 1435 } |
1436 | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
1437 static void reset_contexts(SnowContext *s){ //FIXME better initial contexts |
2138 | 1438 int plane_index, level, orientation; |
1439 | |
2199 | 1440 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
|
1441 for(level=0; level<MAX_DECOMPOSITIONS; level++){ |
2138 | 1442 for(orientation=level ? 1:0; orientation<4; orientation++){ |
2335 | 1443 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state)); |
2138 | 1444 } |
1445 } | |
1446 } | |
2335 | 1447 memset(s->header_state, MID_STATE, sizeof(s->header_state)); |
1448 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
|
1449 } |
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 |
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 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
|
1452 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
|
1453 int h= -((-s->avctx->height)>>LOG2_MB_SIZE); |
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 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
|
1456 s->b_height= h; |
2967 | 1457 |
9370 | 1458 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
|
1459 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
|
1460 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
|
1461 } |
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 |
2335 | 1463 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){ |
1464 uint8_t *bytestream= d->bytestream; | |
1465 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
|
1466 *d= *s; |
2335 | 1467 d->bytestream= bytestream; |
1468 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
|
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 |
3314 | 1471 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
|
1472 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
|
1473 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
|
1474 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
|
1475 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
|
1476 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
|
1477 int i,j; |
2967 | 1478 |
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
|
1479 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
|
1480 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
|
1481 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
|
1482 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
|
1483 block.my= my; |
3314 | 1484 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
|
1485 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
|
1486 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
|
1487 |
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
|
1488 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
|
1489 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
|
1490 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
|
1491 } |
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
|
1492 } |
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
|
1493 } |
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
|
1494 |
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
|
1495 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
|
1496 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
|
1497 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
|
1498 ((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
|
1499 ((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
|
1500 }; |
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
|
1501 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
|
1502 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
|
1503 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
|
1504 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
|
1505 } |
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
|
1506 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
|
1507 } |
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
|
1508 |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1509 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
|
1510 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
|
1511 if(s->ref_frames == 1){ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1512 *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
|
1513 *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
|
1514 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1515 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
|
1516 *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
|
1517 (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
|
1518 (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
|
1519 *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
|
1520 (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
|
1521 (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
|
1522 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1523 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1524 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
1525 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
|
1526 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1527 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
|
1528 }else{ |
3314 | 1529 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
|
1530 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1531 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1532 |
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
|
1533 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
|
1534 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
|
1535 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
|
1536 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
|
1537 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
|
1538 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
|
1539 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
|
1540 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
|
1541 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
|
1542 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
2967 | 1543 |
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
|
1544 if(s->keyframe){ |
3314 | 1545 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
|
1546 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
|
1547 } |
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 |
2335 | 1549 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){ |
4332 | 1550 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
|
1551 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
|
1552 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
|
1553 int cr= left->color[2]; |
3314 | 1554 int ref = 0; |
1555 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); | |
4001 | 1556 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx)); |
1557 int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my)); | |
2967 | 1558 |
2335 | 1559 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
|
1560 |
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 if(type){ |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1562 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
|
1563 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
|
1564 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
|
1565 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
|
1566 }else{ |
3314 | 1567 if(s->ref_frames > 1) |
1568 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
|
1569 pred_mv(s, &mx, &my, ref, left, top, tr); |
3314 | 1570 mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1); |
1571 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
|
1572 } |
3314 | 1573 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
|
1574 }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
|
1575 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
|
1576 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
|
1577 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
|
1578 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
|
1579 } |
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
|
1580 } |
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
|
1581 |
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
|
1582 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
|
1583 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
|
1584 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
|
1585 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
|
1586 |
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
|
1587 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
|
1588 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
|
1589 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
|
1590 } |
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
|
1591 } |
2138 | 1592 } |
1593 | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1594 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 | 1595 static const uint8_t weight[64]={ |
5648 | 1596 8,7,6,5,4,3,2,1, |
1597 7,7,0,0,0,0,0,1, | |
1598 6,0,6,0,0,0,2,0, | |
1599 5,0,0,5,0,3,0,0, | |
1600 4,0,0,0,4,0,0,0, | |
1601 3,0,0,5,0,3,0,0, | |
1602 2,0,6,0,0,0,2,0, | |
1603 1,7,0,0,0,0,0,1, | |
1604 }; | |
1605 | |
7622 | 1606 static const uint8_t brane[256]={ |
5648 | 1607 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12, |
1608 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52, | |
1609 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc, | |
1610 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc, | |
1611 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc, | |
1612 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc, | |
1613 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc, | |
1614 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16, | |
1615 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56, | |
1616 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96, | |
1617 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc, | |
1618 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc, | |
1619 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc, | |
1620 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc, | |
1621 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc, | |
1622 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A, | |
1623 }; | |
1624 | |
7622 | 1625 static const uint8_t needs[16]={ |
5648 | 1626 0,1,0,0, |
1627 2,4,2,0, | |
1628 0,1,0,0, | |
1629 15 | |
1630 }; | |
1631 | |
1632 int x, y, b, r, l; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1633 int16_t tmpIt [64*(32+HTAPS_MAX)]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1634 uint8_t tmp2t[3][stride*(32+HTAPS_MAX)]; |
5648 | 1635 int16_t *tmpI= tmpIt; |
1636 uint8_t *tmp2= tmp2t[0]; | |
6205 | 1637 const uint8_t *hpel[11]; |
5648 | 1638 assert(dx<16 && dy<16); |
1639 r= brane[dx + 16*dy]&15; | |
1640 l= brane[dx + 16*dy]>>4; | |
1641 | |
1642 b= needs[l] | needs[r]; | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1643 if(p && !p->diag_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1644 b= 15; |
5648 | 1645 |
1646 if(b&5){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1647 for(y=0; y < b_h+HTAPS_MAX-1; y++){ |
5649 | 1648 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
|
1649 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
|
1650 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
|
1651 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
|
1652 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
|
1653 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
|
1654 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
|
1655 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
|
1656 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
|
1657 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1658 if(!p || p->fast_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1659 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
|
1660 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1661 am= (am+16)>>5; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1662 }else{ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1663 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
|
1664 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1665 am= (am+32)>>6; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1666 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1667 |
5649 | 1668 if(am&(~255)) am= ~(am>>31); |
1669 tmp2[x]= am; | |
1670 } | |
1671 tmpI+= 64; | |
1672 tmp2+= stride; | |
1673 src += stride; | |
2138 | 1674 } |
5649 | 1675 src -= stride*y; |
5648 | 1676 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1677 src += HTAPS_MAX/2 - 1; |
5648 | 1678 tmp2= tmp2t[1]; |
1679 | |
1680 if(b&2){ | |
5649 | 1681 for(y=0; y < b_h; y++){ |
1682 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
|
1683 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
|
1684 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
|
1685 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
|
1686 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
|
1687 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
|
1688 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
|
1689 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
|
1690 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
|
1691 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1692 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1693 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
|
1694 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1695 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
|
1696 |
5649 | 1697 if(am&(~255)) am= ~(am>>31); |
1698 tmp2[x]= am; | |
1699 } | |
1700 src += stride; | |
1701 tmp2+= stride; | |
5648 | 1702 } |
5649 | 1703 src -= stride*y; |
5648 | 1704 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1705 src += stride*(HTAPS_MAX/2 - 1); |
5648 | 1706 tmp2= tmp2t[2]; |
1707 tmpI= tmpIt; | |
1708 if(b&4){ | |
1709 for(y=0; y < b_h; y++){ | |
1710 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
|
1711 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
|
1712 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
|
1713 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
|
1714 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
|
1715 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
|
1716 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
|
1717 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
|
1718 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
|
1719 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1720 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1721 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
|
1722 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1723 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 | 1724 if(am&(~255)) am= ~(am>>31); |
1725 tmp2[x]= am; | |
1726 } | |
1727 tmpI+= 64; | |
1728 tmp2+= stride; | |
2138 | 1729 } |
5648 | 1730 } |
1731 | |
1732 hpel[ 0]= src; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1733 hpel[ 1]= tmp2t[0] + stride*(HTAPS_MAX/2-1); |
5648 | 1734 hpel[ 2]= src + 1; |
1735 | |
1736 hpel[ 4]= tmp2t[1]; | |
1737 hpel[ 5]= tmp2t[2]; | |
1738 hpel[ 6]= tmp2t[1] + 1; | |
1739 | |
1740 hpel[ 8]= src + stride; | |
1741 hpel[ 9]= hpel[1] + stride; | |
1742 hpel[10]= hpel[8] + 1; | |
1743 | |
1744 if(b==15){ | |
6205 | 1745 const uint8_t *src1= hpel[dx/8 + dy/8*4 ]; |
1746 const uint8_t *src2= hpel[dx/8 + dy/8*4+1]; | |
1747 const uint8_t *src3= hpel[dx/8 + dy/8*4+4]; | |
1748 const uint8_t *src4= hpel[dx/8 + dy/8*4+5]; | |
5648 | 1749 dx&=7; |
1750 dy&=7; | |
1751 for(y=0; y < b_h; y++){ | |
1752 for(x=0; x < b_w; x++){ | |
1753 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+ | |
1754 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6; | |
1755 } | |
1756 src1+=stride; | |
1757 src2+=stride; | |
1758 src3+=stride; | |
1759 src4+=stride; | |
1760 dst +=stride; | |
1761 } | |
1762 }else{ | |
6205 | 1763 const uint8_t *src1= hpel[l]; |
1764 const uint8_t *src2= hpel[r]; | |
5648 | 1765 int a= weight[((dx&7) + (8*(dy&7)))]; |
1766 int b= 8-a; | |
1767 for(y=0; y < b_h; y++){ | |
1768 for(x=0; x < b_w; x++){ | |
1769 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3; | |
1770 } | |
1771 src1+=stride; | |
1772 src2+=stride; | |
1773 dst +=stride; | |
1774 } | |
2138 | 1775 } |
1776 } | |
1777 | |
1778 #define mca(dx,dy,b_w)\ | |
5254 | 1779 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
|
1780 uint8_t tmp[stride*(b_w+HTAPS_MAX-1)];\ |
2138 | 1781 assert(h==b_w);\ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1782 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, tmp, stride, b_w, b_w, dx, dy);\ |
2138 | 1783 } |
1784 | |
1785 mca( 0, 0,16) | |
1786 mca( 8, 0,16) | |
1787 mca( 0, 8,16) | |
1788 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
|
1789 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
|
1790 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
|
1791 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
|
1792 mca( 8, 8,8) |
2138 | 1793 |
3314 | 1794 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
|
1795 if(block->type & BLOCK_INTRA){ |
2206 | 1796 int x, y; |
3018 | 1797 const int color = block->color[plane_index]; |
1798 const int color4= color*0x01010101; | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1799 if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1800 for(y=0; y < b_h; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1801 *(uint32_t*)&dst[0 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1802 *(uint32_t*)&dst[4 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1803 *(uint32_t*)&dst[8 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1804 *(uint32_t*)&dst[12+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1805 *(uint32_t*)&dst[16+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1806 *(uint32_t*)&dst[20+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1807 *(uint32_t*)&dst[24+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1808 *(uint32_t*)&dst[28+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1809 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1810 }else if(b_w==16){ |
3018 | 1811 for(y=0; y < b_h; y++){ |
1812 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1813 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1814 *(uint32_t*)&dst[8 + y*stride]= color4; | |
1815 *(uint32_t*)&dst[12+ y*stride]= color4; | |
1816 } | |
1817 }else if(b_w==8){ | |
1818 for(y=0; y < b_h; y++){ | |
1819 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1820 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1821 } | |
1822 }else if(b_w==4){ | |
1823 for(y=0; y < b_h; y++){ | |
1824 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1825 } | |
1826 }else{ | |
1827 for(y=0; y < b_h; y++){ | |
1828 for(x=0; x < b_w; x++){ | |
1829 dst[x + y*stride]= color; | |
1830 } | |
2138 | 1831 } |
1832 } | |
1833 }else{ | |
3314 | 1834 uint8_t *src= s->last_picture[block->ref].data[plane_index]; |
2206 | 1835 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale; |
1836 int mx= block->mx*scale; | |
1837 int my= block->my*scale; | |
2223 | 1838 const int dx= mx&15; |
1839 const int dy= my&15; | |
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
1840 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
|
1841 sx += (mx>>4) - (HTAPS_MAX/2-1); |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1842 sy += (my>>4) - (HTAPS_MAX/2-1); |
2206 | 1843 src += sx + sy*stride; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1844 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
|
1845 || (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
|
1846 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+HTAPS_MAX-1, b_h+HTAPS_MAX-1, sx, sy, w, h); |
2206 | 1847 src= tmp + MB_SIZE; |
2138 | 1848 } |
3189 | 1849 // assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h); |
1850 // assert(!(b_w&(b_w-1))); | |
3018 | 1851 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
|
1852 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
|
1853 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
|
1854 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
|
1855 else if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1856 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1857 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
|
1858 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
|
1859 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
|
1860 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1861 }else if(b_w==b_h) |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1862 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride); |
3018 | 1863 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
|
1864 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
|
1865 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride); |
3018 | 1866 }else{ |
1867 assert(2*b_w==b_h); | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1868 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
|
1869 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 | 1870 } |
2138 | 1871 } |
1872 } | |
1873 | |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1874 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
|
1875 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
|
1876 int y, x; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1877 IDWTELEM * dst; |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1878 for(y=0; y<b_h; y++){ |
5409 | 1879 //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
|
1880 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
|
1881 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
|
1882 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
|
1883 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1884 dst = slice_buffer_get_line(sb, src_y + y); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1885 for(x=0; x<b_w; x++){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1886 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
|
1887 +obmc2[x] * block[2][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1888 +obmc3[x] * block[1][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1889 +obmc4[x] * block[0][x + y*src_stride]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1890 |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1891 v <<= 8 - LOG2_OBMC_MAX; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1892 if(FRAC_BITS != 8){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1893 v >>= 8 - FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1894 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1895 if(add){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1896 v += dst[x + src_x]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1897 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1898 if(v&(~255)) v= ~(v>>31); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1899 dst8[x + y*src_stride] = v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1900 }else{ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1901 dst[x + src_x] -= v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1902 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1903 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1904 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1905 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1906 |
6412 | 1907 //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
|
1908 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
|
1909 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
|
1910 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
|
1911 const int b_stride= b_width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1912 BlockNode *lt= &s->block[b_x + b_y*b_stride]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1913 BlockNode *rt= lt+1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1914 BlockNode *lb= lt+b_stride; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1915 BlockNode *rb= lb+1; |
2967 | 1916 uint8_t *block[4]; |
2842 | 1917 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
|
1918 uint8_t *tmp = s->scratchbuf; |
2842 | 1919 uint8_t *ptmp; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1920 int x,y; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1921 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1922 if(b_x<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1923 lt= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1924 lb= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1925 }else if(b_x + 1 >= b_width){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1926 rt= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1927 rb= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1928 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1929 if(b_y<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1930 lt= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1931 rt= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1932 }else if(b_y + 1 >= b_height){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1933 lb= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1934 rb= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1935 } |
2967 | 1936 |
6412 | 1937 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
|
1938 obmc -= src_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1939 b_w += src_x; |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1940 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1941 dst -= src_x; |
2206 | 1942 src_x=0; |
1943 }else if(src_x + b_w > w){ | |
1944 b_w = w - src_x; | |
1945 } | |
1946 if(src_y<0){ | |
1947 obmc -= src_y*obmc_stride; | |
1948 b_h += src_y; | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1949 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1950 dst -= src_y*dst_stride; |
2206 | 1951 src_y=0; |
1952 }else if(src_y + b_h> h){ | |
1953 b_h = h - src_y; | |
1954 } | |
2967 | 1955 |
2206 | 1956 if(b_w<=0 || b_h<=0) return; |
1957 | |
6414 | 1958 assert(src_stride > 2*MB_SIZE + 5); |
1959 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1960 if(!sliced && offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1961 dst += src_x + src_y*dst_stride; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
1962 dst8+= src_x + src_y*src_stride; |
2206 | 1963 // src += src_x + src_y*src_stride; |
1964 | |
2842 | 1965 ptmp= tmp + 3*tmp_step; |
1966 block[0]= ptmp; | |
1967 ptmp+=tmp_step; | |
3314 | 1968 pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h); |
2206 | 1969 |
1970 if(same_block(lt, rt)){ | |
1971 block[1]= block[0]; | |
1972 }else{ | |
2842 | 1973 block[1]= ptmp; |
1974 ptmp+=tmp_step; | |
3314 | 1975 pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h); |
2206 | 1976 } |
2967 | 1977 |
2206 | 1978 if(same_block(lt, lb)){ |
1979 block[2]= block[0]; | |
1980 }else if(same_block(rt, lb)){ | |
1981 block[2]= block[1]; | |
1982 }else{ | |
2842 | 1983 block[2]= ptmp; |
1984 ptmp+=tmp_step; | |
3314 | 1985 pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h); |
2206 | 1986 } |
1987 | |
1988 if(same_block(lt, rb) ){ | |
1989 block[3]= block[0]; | |
1990 }else if(same_block(rt, rb)){ | |
1991 block[3]= block[1]; | |
1992 }else if(same_block(lb, rb)){ | |
1993 block[3]= block[2]; | |
1994 }else{ | |
2842 | 1995 block[3]= ptmp; |
3314 | 1996 pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h); |
2206 | 1997 } |
1998 #if 0 | |
1999 for(y=0; y<b_h; y++){ | |
2000 for(x=0; x<b_w; x++){ | |
2001 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX); | |
2002 if(add) dst[x + y*dst_stride] += v; | |
2003 else dst[x + y*dst_stride] -= v; | |
2004 } | |
2005 } | |
2006 for(y=0; y<b_h; y++){ | |
2007 uint8_t *obmc2= obmc + (obmc_stride>>1); | |
2008 for(x=0; x<b_w; x++){ | |
2009 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX); | |
2010 if(add) dst[x + y*dst_stride] += v; | |
2011 else dst[x + y*dst_stride] -= v; | |
2012 } | |
2013 } | |
2014 for(y=0; y<b_h; y++){ | |
2015 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2016 for(x=0; x<b_w; x++){ | |
2017 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX); | |
2018 if(add) dst[x + y*dst_stride] += v; | |
2019 else dst[x + y*dst_stride] -= v; | |
2020 } | |
2021 } | |
2022 for(y=0; y<b_h; y++){ | |
2023 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2024 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2025 for(x=0; x<b_w; x++){ | |
2026 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX); | |
2027 if(add) dst[x + y*dst_stride] += v; | |
2028 else dst[x + y*dst_stride] -= v; | |
2029 } | |
2030 } | |
2031 #else | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2032 if(sliced){ |
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2033 s->dsp.inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8); |
6475 | 2034 }else{ |
2035 for(y=0; y<b_h; y++){ | |
2036 //FIXME ugly misuse of obmc_stride | |
2037 const uint8_t *obmc1= obmc + y*obmc_stride; | |
2038 const uint8_t *obmc2= obmc1+ (obmc_stride>>1); | |
2039 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); | |
2040 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2041 for(x=0; x<b_w; x++){ | |
2042 int v= obmc1[x] * block[3][x + y*src_stride] | |
2043 +obmc2[x] * block[2][x + y*src_stride] | |
2044 +obmc3[x] * block[1][x + y*src_stride] | |
2045 +obmc4[x] * block[0][x + y*src_stride]; | |
2046 | |
2047 v <<= 8 - LOG2_OBMC_MAX; | |
2048 if(FRAC_BITS != 8){ | |
2049 v >>= 8 - FRAC_BITS; | |
2050 } | |
2051 if(add){ | |
2052 v += dst[x + y*dst_stride]; | |
2053 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; | |
2054 if(v&(~255)) v= ~(v>>31); | |
2055 dst8[x + y*src_stride] = v; | |
2056 }else{ | |
2057 dst[x + y*dst_stride] -= v; | |
2058 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2059 } |
2206 | 2060 } |
2061 } | |
5910 | 2062 #endif /* 0 */ |
2206 | 2063 } |
2064 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2065 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
|
2066 Plane *p= &s->plane[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2067 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
|
2068 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
|
2069 int x, y, mb_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2070 int block_size = MB_SIZE >> s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2071 int block_w = plane_index ? block_size/2 : block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2072 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
|
2073 int obmc_stride= plane_index ? block_size : 2*block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2074 int ref_stride= s->current_picture.linesize[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2075 uint8_t *dst8= s->current_picture.data[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2076 int w= p->width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2077 int h= p->height; |
2967 | 2078 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2079 if(s->keyframe || (s->avctx->debug&512)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2080 if(mb_y==mb_h) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2081 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2082 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2083 if(add){ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2084 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
|
2085 // 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
|
2086 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2087 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2088 // 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
|
2089 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
|
2090 v >>= FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2091 if(v&(~255)) v= ~(v>>31); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2092 dst8[x + y*ref_stride]= v; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2093 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2094 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2095 }else{ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2096 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
|
2097 // 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
|
2098 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2099 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2100 line[x] -= 128 << FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2101 // buf[x + y*w]-= 128<<FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2102 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2103 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2104 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2105 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2106 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2107 } |
2967 | 2108 |
6475 | 2109 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2110 add_yblock(s, 1, sb, old_buffer, dst8, obmc, | |
2111 block_w*mb_x - block_w/2, | |
2112 block_w*mb_y - block_w/2, | |
2113 block_w, block_w, | |
2114 w, h, | |
2115 w, ref_stride, obmc_stride, | |
2116 mb_x - 1, mb_y - 1, | |
2117 add, 0, plane_index); | |
2118 } | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2119 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2120 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2121 static av_always_inline void predict_slice(SnowContext *s, IDWTELEM *buf, int plane_index, int add, int mb_y){ |
2138 | 2122 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
|
2123 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
|
2124 const int mb_h= s->b_height << s->block_max_depth; |
2562 | 2125 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
|
2126 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
|
2127 int block_w = plane_index ? block_size/2 : block_size; |
2206 | 2128 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
|
2129 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
|
2130 int ref_stride= s->current_picture.linesize[plane_index]; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2131 uint8_t *dst8= s->current_picture.data[plane_index]; |
2138 | 2132 int w= p->width; |
2133 int h= p->height; | |
2967 | 2134 |
2206 | 2135 if(s->keyframe || (s->avctx->debug&512)){ |
2562 | 2136 if(mb_y==mb_h) |
2137 return; | |
2138 | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2139 if(add){ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2140 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
|
2141 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2142 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
|
2143 v >>= FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2144 if(v&(~255)) v= ~(v>>31); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2145 dst8[x + y*ref_stride]= v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2146 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2147 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2148 }else{ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2149 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
|
2150 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2151 buf[x + y*w]-= 128<<FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2152 } |
2206 | 2153 } |
2138 | 2154 } |
2206 | 2155 |
2156 return; | |
2138 | 2157 } |
2967 | 2158 |
6414 | 2159 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2160 add_yblock(s, 0, NULL, buf, dst8, obmc, | |
2161 block_w*mb_x - block_w/2, | |
2162 block_w*mb_y - block_w/2, | |
2163 block_w, block_w, | |
2164 w, h, | |
2165 w, ref_stride, obmc_stride, | |
2166 mb_x - 1, mb_y - 1, | |
2167 add, 1, plane_index); | |
2168 } | |
2562 | 2169 } |
2170 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2171 static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add){ |
2562 | 2172 const int mb_h= s->b_height << s->block_max_depth; |
2173 int mb_y; | |
2174 for(mb_y=0; mb_y<=mb_h; mb_y++) | |
2175 predict_slice(s, buf, plane_index, add, mb_y); | |
2138 | 2176 } |
2177 | |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2178 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
|
2179 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2180 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
|
2181 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
|
2182 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
|
2183 int x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2184 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2185 if(s->qlog == LOSSLESS_QLOG) return; |
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 // 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
|
2189 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
|
2190 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2191 int i= line[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2192 if(i<0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2193 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
|
2194 }else if(i>0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2195 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2196 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2197 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2198 } |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2201 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
|
2202 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2203 int x,y; |
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 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
|
2206 IDWTELEM * prev; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2207 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2208 if (start_y != 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2209 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
|
2210 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2211 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
|
2212 prev = line; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2213 // 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
|
2214 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
|
2215 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2216 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2217 if(use_median){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2218 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
|
2219 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2220 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2221 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
|
2222 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2223 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2224 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2225 if(y) line[x] += prev[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2226 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2227 } |
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 } |
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 void decode_qlogs(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2232 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2233 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2234 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
|
2235 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
|
2236 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
|
2237 int q; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2238 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
|
2239 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
|
2240 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
|
2241 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
|
2242 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2243 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2244 } |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2247 #define GET_S(dst, check) \ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2248 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
|
2249 if(!(check)){\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2250 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
|
2251 return -1;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2252 }\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2253 dst= tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2254 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2255 static int decode_header(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2256 int plane_index, tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2257 uint8_t kstate[32]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2258 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2259 memset(kstate, MID_STATE, sizeof(kstate)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2260 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2261 s->keyframe= get_rac(&s->c, kstate); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2262 if(s->keyframe || s->always_reset){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2263 reset_contexts(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2264 s->spatial_decomposition_type= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2265 s->qlog= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2266 s->qbias= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2267 s->mv_scale= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2268 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2269 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2270 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2271 GET_S(s->version, tmp <= 0U) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2272 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
|
2273 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
|
2274 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
|
2275 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
|
2276 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
|
2277 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
|
2278 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
|
2279 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
|
2280 // 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
|
2281 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
|
2282 s->max_ref_frames++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2283 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2284 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2285 } |
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 if(!s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2288 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
|
2289 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
|
2290 int htaps, i, sum=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2291 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2292 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
|
2293 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
|
2294 if((unsigned)htaps > HTAPS_MAX || htaps==0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2295 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2296 p->htaps= htaps; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2297 for(i= htaps/2; i; i--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2298 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
|
2299 sum += p->hcoeff[i]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2300 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2301 p->hcoeff[0]= 32-sum; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2302 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2303 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
|
2304 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
|
2305 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
|
2306 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2307 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
|
2308 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
|
2309 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2310 } |
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 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
|
2314 if(s->spatial_decomposition_type > 1U){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2315 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
|
2316 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2317 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2318 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
|
2319 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
|
2320 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
|
2321 return -1; |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2324 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
|
2325 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
|
2326 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
|
2327 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
|
2328 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
|
2329 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
|
2330 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2331 return -1; |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2334 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2335 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2336 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2337 static void init_qexp(void){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2338 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2339 double v=128; |
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 for(i=0; i<QROOT; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2342 qexp[i]= lrintf(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2343 v *= pow(2, 1.0 / QROOT); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2344 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2345 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2346 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2347 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
|
2348 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2349 int width, height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2350 int i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2351 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2352 s->avctx= avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2353 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
|
2354 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2355 dsputil_init(&s->dsp, avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2356 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2357 #define mcf(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2358 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
|
2359 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
|
2360 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
|
2361 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
|
2362 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
|
2363 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
|
2364 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2365 mcf( 0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2366 mcf( 4, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2367 mcf( 8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2368 mcf(12, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2369 mcf( 0, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2370 mcf( 4, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2371 mcf( 8, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2372 mcf(12, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2373 mcf( 0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2374 mcf( 4, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2375 mcf( 8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2376 mcf(12, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2377 mcf( 0,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2378 mcf( 4,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2379 mcf( 8,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2380 mcf(12,12) |
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 #define mcfh(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2383 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
|
2384 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
|
2385 mc_block_hpel ## dx ## dy ## 16;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2386 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
|
2387 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
|
2388 mc_block_hpel ## dx ## dy ## 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2389 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2390 mcfh(0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2391 mcfh(8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2392 mcfh(0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2393 mcfh(8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2394 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2395 if(!qexp[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2396 init_qexp(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2397 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2398 // 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
|
2399 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2400 width= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2401 height= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2402 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2403 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
|
2404 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
|
2405 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2406 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
|
2407 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
|
2408 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
|
2409 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2410 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
|
2411 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
|
2412 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2413 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2414 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2415 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2416 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
|
2417 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2418 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2419 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2420 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
|
2421 int w= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2422 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2423 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2424 if(plane_index){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2425 w>>= s->chroma_h_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2426 h>>= s->chroma_v_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2427 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2428 s->plane[plane_index].width = w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2429 s->plane[plane_index].height= h; |
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 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
|
2432 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
|
2433 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
|
2434 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2435 b->buf= s->spatial_dwt_buffer; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2436 b->level= level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2437 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
|
2438 b->width = (w + !(orientation&1))>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2439 b->height= (h + !(orientation>1))>>1; |
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 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
|
2442 b->buf_x_offset = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2443 b->buf_y_offset = 0; |
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 if(orientation&1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2446 b->buf += (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2447 b->buf_x_offset = (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2448 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2449 if(orientation>1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2450 b->buf += b->stride>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2451 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
|
2452 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2453 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
|
2454 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2455 if(level) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2456 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
|
2457 //FIXME avoid this realloc |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2458 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2459 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
|
2460 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2461 w= (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2462 h= (h+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2463 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2464 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2465 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2466 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2467 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2468 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2469 #define QUANTIZE2 0 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2470 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2471 #if QUANTIZE2==1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2472 #define Q2_STEP 8 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2473 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2474 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
|
2475 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2476 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2477 int xo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2478 int yo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2479 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
|
2480 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2481 if(orientation&1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2482 xo= step>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2483 if(orientation&2) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2484 yo= step>>1; |
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 //FIXME bias for nonzero ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2487 //FIXME optimize |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2488 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
|
2489 for(y=0; y<p->height; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2490 for(x=0; x<p->width; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2491 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
|
2492 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
|
2493 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
|
2494 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
|
2495 v= ((v+8)>>4)<<4; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2496 score[sx + sy*score_stride] += v*v; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2497 assert(score[sx + sy*score_stride] >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2498 } |
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 } |
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 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
|
2503 int level, orientation; |
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= buffer + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2509 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2510 dequantize(s, b, dst, b->stride); |
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 } |
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 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
|
2516 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
|
2517 IDWTELEM best_dequant[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2518 IDWTELEM idwt2_buffer[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2519 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
|
2520 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
|
2521 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
|
2522 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
|
2523 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2524 //FIXME pass the copy cleanly ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2525 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2526 // 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
|
2527 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
|
2528 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2529 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
|
2530 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
|
2531 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2532 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
|
2533 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
|
2534 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
|
2535 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2536 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
|
2537 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2538 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2539 for(pass=0; pass<1; pass++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2540 if(s->qbias == 0) //keyframe |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2541 continue; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2542 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
|
2543 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
|
2544 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2545 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
|
2546 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
|
2547 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2548 for(ys= 0; ys<Q2_STEP; ys++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2549 for(xs= 0; xs<Q2_STEP; xs++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2550 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
|
2551 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
|
2552 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
|
2553 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
|
2554 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
|
2555 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
|
2556 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
|
2557 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
|
2558 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
|
2559 //FIXME try more than just -- |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2560 } |
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 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
|
2563 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
|
2564 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
|
2565 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
|
2566 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
|
2567 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
|
2568 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
|
2569 best_score[score_idx]= score[score_idx]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2570 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
|
2571 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
|
2572 //FIXME copy instead |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2573 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2574 } |
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 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2577 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2578 } |
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 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2581 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
|
2582 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2583 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2584 #endif /* QUANTIZE2==1 */ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2585 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2586 #define USE_HALFPEL_PLANE 0 |
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 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
|
2589 int p,x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2590 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2591 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
|
2592 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2593 for(p=0; p<3; p++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2594 int is_chroma= !!p; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2595 int w= s->avctx->width >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2596 int h= s->avctx->height >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2597 int ls= frame->linesize[p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2598 uint8_t *src= frame->data[p]; |
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[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
|
2601 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
|
2602 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
|
2603 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2604 halfpel[0][p]= src; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2605 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2606 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2607 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2608 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2609 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
|
2610 } |
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 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2613 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2614 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2615 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2616 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
|
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 src= halfpel[1][p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2620 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2621 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2622 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2623 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2624 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
|
2625 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2626 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2627 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2628 //FIXME border! |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2632 static void release_buffer(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2633 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2634 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2635 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2636 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
|
2637 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
|
2638 for(i=0; i<9; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2639 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
|
2640 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
|
2641 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2642 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2643 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2644 static int frame_start(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2645 AVFrame tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2646 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
|
2647 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2648 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2649 if(s->current_picture.data[0]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2650 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
|
2651 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
|
2652 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
|
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 release_buffer(s->avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2656 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2657 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
|
2658 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
|
2659 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
|
2660 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
|
2661 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
|
2662 s->last_picture[0]= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2663 s->current_picture= tmp; |
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 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2666 s->ref_frames= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2667 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2668 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2669 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
|
2670 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
|
2671 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2672 s->ref_frames= i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2673 if(s->ref_frames==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2674 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
|
2675 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2676 } |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2679 s->current_picture.reference= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2680 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
|
2681 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
|
2682 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2683 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2684 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2685 s->current_picture.key_frame= s->keyframe; |
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 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2688 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2689 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2690 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
|
2691 int plane_index, level, orientation, i; |
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(&s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2694 av_freep(&s->spatial_idwt_buffer); |
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 s->m.me.temp= NULL; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2697 av_freep(&s->m.me.scratchpad); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2698 av_freep(&s->m.me.map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2699 av_freep(&s->m.me.score_map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2700 av_freep(&s->m.obmc_scratchpad); |
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 av_freep(&s->block); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2703 av_freep(&s->scratchbuf); |
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 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
|
2706 av_freep(&s->ref_mvs[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2707 av_freep(&s->ref_scores[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2708 if(s->last_picture[i].data[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2709 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
|
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 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
|
2713 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
|
2714 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
|
2715 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
|
2716 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2717 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2718 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2719 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2720 } |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2721 if (s->mconly_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2722 s->avctx->release_buffer(s->avctx, &s->mconly_picture); |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2723 if (s->current_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2724 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
|
2725 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2726 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2727 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
|
2728 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2729 avctx->pix_fmt= PIX_FMT_YUV420P; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2730 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2731 common_init(avctx); |
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 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2734 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2735 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2736 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
|
2737 const uint8_t *buf = avpkt->data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2738 int buf_size = avpkt->size; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2739 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2740 RangeCoder * const c= &s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2741 int bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2742 AVFrame *picture = data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2743 int level, orientation, plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2744 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2745 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
|
2746 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
|
2747 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2748 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
|
2749 if(decode_header(s)<0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2750 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2751 common_init_after_header(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2752 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2753 // 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
|
2754 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2755 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
|
2756 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2757 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
|
2758 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2759 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
|
2760 && p->hcoeff[1]==-10 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2761 && p->hcoeff[2]==2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2762 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2763 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2764 alloc_blocks(s); |
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 if(frame_start(s) < 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2767 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2768 //keyframe flag duplication mess FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2769 if(avctx->debug&FF_DEBUG_PICT_INFO) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2770 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
|
2771 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2772 decode_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2773 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2774 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
|
2775 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2776 int w= p->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2777 int h= p->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2778 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2779 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
|
2780 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2781 if(s->avctx->debug&2048){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2782 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
|
2783 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
|
2784 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2785 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2786 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2787 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
|
2788 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
|
2789 } |
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 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2792 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2793 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2794 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
|
2795 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
|
2796 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2797 unpack_coeffs(s, b, b->parent, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2798 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2799 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2800 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2801 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2802 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2803 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
|
2804 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
|
2805 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
|
2806 int mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2807 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2808 int yd=0, yq=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2809 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2810 int end_y; |
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 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
|
2813 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
|
2814 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2815 int slice_starty = block_w*mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2816 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
|
2817 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2818 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
|
2819 slice_h -= (block_w >> 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2820 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2821 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2822 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
|
2823 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
|
2824 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2825 int start_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2826 int end_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2827 int our_mb_start = mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2828 int our_mb_end = (mb_y + 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2829 const int extra= 3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2830 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
|
2831 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
|
2832 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2833 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
|
2834 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
|
2835 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2836 start_y = FFMIN(b->height, start_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2837 end_y = FFMIN(b->height, end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2838 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2839 if (start_y != end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2840 if (orientation == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2841 SubBand * correlate_band = &p->band[0][0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2842 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
|
2843 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
|
2844 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
|
2845 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
|
2846 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
|
2847 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2848 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2849 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
|
2850 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2851 } |
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 for(; yd<slice_h; yd+=4){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2855 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
|
2856 } |
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 if(s->qlog == LOSSLESS_QLOG){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2859 for(; yq<slice_h && yq<h; yq++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2860 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
|
2861 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2862 line[x] <<= FRAC_BITS; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2863 } |
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 } |
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 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
|
2868 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2869 y = FFMIN(p->height, slice_starty); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2870 end_y = FFMIN(p->height, slice_h); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2871 while(y < end_y) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2872 slice_buffer_release(&s->sb, y++); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2873 } |
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 slice_buffer_flush(&s->sb); |
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 |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2880 emms_c(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2881 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2882 release_buffer(avctx); |
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 if(!(s->avctx->debug&2048)) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2885 *picture= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2886 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2887 *picture= s->mconly_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2888 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2889 *data_size = sizeof(AVFrame); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2890 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2891 bytes_read= c->bytestream - c->bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2892 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
|
2893 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2894 return bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2895 } |
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 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
|
2898 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2899 SnowContext *s = avctx->priv_data; |
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 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2902 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2903 common_end(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2904 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2905 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2906 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2907 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2908 AVCodec snow_decoder = { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2909 "snow", |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2910 CODEC_TYPE_VIDEO, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2911 CODEC_ID_SNOW, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2912 sizeof(SnowContext), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2913 decode_init, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2914 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2915 decode_end, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2916 decode_frame, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2917 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
|
2918 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2919 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2920 }; |
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 #if CONFIG_SNOW_ENCODER |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2923 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
|
2924 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2925 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2926 int plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2927 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2928 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
|
2929 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
|
2930 "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
|
2931 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2932 } |
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 if(avctx->prediction_method == DWT_97 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2935 && (avctx->flags & CODEC_FLAG_QSCALE) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2936 && avctx->global_quality == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2937 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
|
2938 return -1; |
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 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2941 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
|
2942 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2943 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
|
2944 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
|
2945 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2946 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
|
2947 s->plane[plane_index].diag_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2948 s->plane[plane_index].htaps= 6; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2949 s->plane[plane_index].hcoeff[0]= 40; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2950 s->plane[plane_index].hcoeff[1]= -10; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2951 s->plane[plane_index].hcoeff[2]= 2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2952 s->plane[plane_index].fast_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2953 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2954 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2955 common_init(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2956 alloc_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2957 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2958 s->version=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2959 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2960 s->m.avctx = avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2961 s->m.flags = avctx->flags; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2962 s->m.bit_rate= avctx->bit_rate; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2963 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2964 s->m.me.temp = |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2965 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
|
2966 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
|
2967 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
|
2968 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
|
2969 h263_encode_init(&s->m); //mv_penalty |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2970 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2971 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
|
2972 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2973 if(avctx->flags&CODEC_FLAG_PASS1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2974 if(!avctx->stats_out) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2975 avctx->stats_out = av_mallocz(256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2976 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2977 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
|
2978 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
|
2979 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2980 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2981 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
|
2982 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2983 avctx->coded_frame= &s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2984 switch(avctx->pix_fmt){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2985 // case PIX_FMT_YUV444P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2986 // case PIX_FMT_YUV422P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2987 case PIX_FMT_YUV420P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2988 case PIX_FMT_GRAY8: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2989 // case PIX_FMT_YUV411P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2990 // case PIX_FMT_YUV410P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2991 s->colorspace_type= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2992 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2993 /* case PIX_FMT_RGB32: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2994 s->colorspace= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2995 break;*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2996 default: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2997 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
|
2998 return -1; |
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 // 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
|
3001 s->chroma_h_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3002 s->chroma_v_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3003 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3004 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
|
3005 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
|
3006 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3007 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
|
3008 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3009 if(s->avctx->me_method == ME_ITER){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3010 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3011 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
|
3012 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
|
3013 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
|
3014 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
|
3015 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3016 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3017 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3018 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3019 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3020 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3021 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3022 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
|
3023 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3024 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3025 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3026 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3027 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3028 for (j = 0; j < w; j++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3029 s += pix[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3030 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3031 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3032 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3033 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3034 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3035 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3036 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3037 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3038 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
|
3039 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3040 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3041 uint32_t *sq = ff_squareTbl + 256; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3042 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3043 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3044 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3045 for (j = 0; j < w; j ++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3046 s += sq[pix[0]]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3047 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3048 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3049 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3050 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3051 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3052 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3053 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3054 //FIXME copy&paste |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3055 #define P_LEFT P[1] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3056 #define P_TOP P[2] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3057 #define P_TOPRIGHT P[3] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3058 #define P_MEDIAN P[4] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3059 #define P_MV1 P[9] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3060 #define FLAG_QPEL 1 //must be 1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3061 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3062 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
|
3063 uint8_t p_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3064 uint8_t i_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3065 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
|
3066 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
|
3067 RangeCoder pc, ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3068 uint8_t *pbbak= s->c.bytestream; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3069 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
|
3070 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
|
3071 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
|
3072 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
|
3073 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
|
3074 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
|
3075 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
|
3076 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3077 int try= (y+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3078 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
|
3079 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
|
3080 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
|
3081 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
|
3082 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
|
3083 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
|
3084 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3085 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3086 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3087 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3088 int mx=0, my=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3089 int l,cr,cb; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3090 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
|
3091 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
|
3092 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
|
3093 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
|
3094 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
|
3095 int P[10][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3096 int16_t last_mv[3][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3097 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
|
3098 const int shift= 1+qpel; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3099 MotionEstContext *c= &s->m.me; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3100 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
|
3101 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
|
3102 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
|
3103 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
|
3104 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
|
3105 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3106 assert(sizeof(s->block_state) >= 256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3107 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3108 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
|
3109 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3110 } |
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 // clip predictors / edge ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3113 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3114 P_LEFT[0]= left->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3115 P_LEFT[1]= left->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3116 P_TOP [0]= top->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3117 P_TOP [1]= top->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3118 P_TOPRIGHT[0]= tr->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3119 P_TOPRIGHT[1]= tr->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3120 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3121 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
|
3122 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
|
3123 last_mv[1][0]= right->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3124 last_mv[1][1]= right->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3125 last_mv[2][0]= bottom->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3126 last_mv[2][1]= bottom->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3127 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3128 s->m.mb_stride=2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3129 s->m.mb_x= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3130 s->m.mb_y= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3131 c->skip= 0; |
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 assert(c-> stride == stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3134 assert(c->uvstride == uvstride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3135 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3136 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
|
3137 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
|
3138 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
|
3139 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
|
3140 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3141 c->xmin = - x*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3142 c->ymin = - y*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3143 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
|
3144 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
|
3145 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3146 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
|
3147 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
|
3148 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
|
3149 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
|
3150 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
|
3151 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
|
3152 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
|
3153 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3154 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
|
3155 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
|
3156 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3157 if (!y) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3158 c->pred_x= P_LEFT[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3159 c->pred_y= P_LEFT[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3160 } else { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3161 c->pred_x = P_MEDIAN[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3162 c->pred_y = P_MEDIAN[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3163 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3164 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3165 score= INT_MAX; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3166 best_ref= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3167 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
|
3168 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
|
3169 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3170 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
|
3171 (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
|
3172 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3173 assert(ref_mx >= c->xmin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3174 assert(ref_mx <= c->xmax); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3175 assert(ref_my >= c->ymin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3176 assert(ref_my <= c->ymax); |
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 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
|
3179 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
|
3180 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
|
3181 if(s->ref_mvs[ref]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3182 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
|
3183 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
|
3184 s->ref_scores[ref][index]= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3185 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3186 if(score > ref_score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3187 score= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3188 best_ref= ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3189 mx= ref_mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3190 my= ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3191 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3192 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3193 //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
|
3194 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3195 // subpel search |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3196 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
|
3197 pc= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3198 pc.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3199 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
|
3200 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
|
3201 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3202 if(level!=s->block_max_depth) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3203 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
|
3204 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
|
3205 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3206 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
|
3207 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
|
3208 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
|
3209 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
|
3210 p_len= pc.bytestream - pc.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3211 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
|
3212 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3213 block_s= block_w*block_w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3214 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
|
3215 l= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3216 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
|
3217 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3218 block_s= block_w*block_w>>2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3219 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
|
3220 cb= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3221 // 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
|
3222 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
|
3223 cr= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3224 // 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
|
3225 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3226 ic= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3227 ic.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3228 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
|
3229 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
|
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(&ic, &i_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3232 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
|
3233 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
|
3234 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
|
3235 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
|
3236 i_len= ic.bytestream - ic.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3237 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
|
3238 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3239 // assert(score==256*256*256*64-1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3240 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
|
3241 assert(iscore >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3242 assert(l>=0 && l<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3243 assert(pl>=0 && pl<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3244 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3245 if(level==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3246 int varc= iscore >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3247 int vard= score >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3248 if (vard <= 64 || vard < varc) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3249 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
|
3250 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3251 c->scene_change_score+= s->m.qscale; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3252 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3253 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3254 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3255 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
|
3256 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
|
3257 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
|
3258 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
|
3259 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
|
3260 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
|
3261 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3262 if(score2 < score && score2 < iscore) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3263 return score2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3264 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3265 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3266 if(iscore < score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3267 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
|
3268 memcpy(pbbak, i_buffer, i_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3269 s->c= ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3270 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3271 s->c.bytestream= pbbak + i_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3272 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
|
3273 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
|
3274 return iscore; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3275 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3276 memcpy(pbbak, p_buffer, p_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3277 s->c= pc; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3278 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3279 s->c.bytestream= pbbak + p_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3280 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
|
3281 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
|
3282 return score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3283 } |
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 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
|
3287 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
|
3288 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
|
3289 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
|
3290 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3291 BlockNode *b= &s->block[index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3292 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
|
3293 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
|
3294 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
|
3295 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
|
3296 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3297 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3298 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3299 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3300 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
|
3301 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
|
3302 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
|
3303 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
|
3304 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3305 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3306 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
|
3307 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3308 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3309 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3310 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3311 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
|
3312 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
|
3313 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3314 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
|
3315 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
|
3316 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
|
3317 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
|
3318 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
|
3319 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3320 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3321 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3322 if(b->type & BLOCK_INTRA){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3323 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
|
3324 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
|
3325 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
|
3326 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
|
3327 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
|
3328 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
|
3329 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3330 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
|
3331 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
|
3332 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3333 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
|
3334 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
|
3335 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
|
3336 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
|
3337 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3338 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3339 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3340 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
|
3341 int i, x2, y2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3342 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3343 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3344 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
|
3345 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
|
3346 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
|
3347 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3348 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
|
3349 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
|
3350 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
|
3351 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3352 const int h= p->height; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3353 int index= mb_x + mb_y*b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3354 BlockNode *b= &s->block[index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3355 BlockNode backup= *b; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3356 int ab=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3357 int aa=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3358 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3359 b->type|= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3360 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
|
3361 memset(dst, 0, obmc_stride*obmc_stride*sizeof(IDWTELEM)); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3362 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3363 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3364 int mb_x2= mb_x + (i &1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3365 int mb_y2= mb_y + (i>>1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3366 int x= block_w*mb_x2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3367 int y= block_w*mb_y2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3368 |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3369 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
|
3370 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
|
3371 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3372 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
|
3373 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
|
3374 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
|
3375 int obmc_v= obmc[index]; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3376 int d; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3377 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
|
3378 if(x<0) obmc_v += obmc[index + block_w]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3379 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
|
3380 if(x+block_w>w) obmc_v += obmc[index - block_w]; |
6412 | 3381 //FIXME precalculate this or simplify it somehow else |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3382 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3383 d = -dst[index] + (1<<(FRAC_BITS-1)); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3384 dst[index] = d; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3385 ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v; |
6412 | 3386 aa += obmc_v * obmc_v; //FIXME precalculate this |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3387 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3388 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3389 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3390 *b= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3391 |
5127 | 3392 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
|
3393 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3394 |
3051 | 3395 static inline int get_block_bits(SnowContext *s, int x, int y, int w){ |
3396 const int b_stride = s->b_width << s->block_max_depth; | |
3397 const int b_height = s->b_height<< s->block_max_depth; | |
3398 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
|
3399 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
|
3400 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
|
3401 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
|
3402 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
|
3403 const BlockNode *tr = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl; |
3051 | 3404 int dmx, dmy; |
4001 | 3405 // int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
3406 // int my_context= av_log2(2*FFABS(left->my - top->my)); | |
3051 | 3407 |
3408 if(x<0 || x>=b_stride || y>=b_height) | |
3409 return 0; | |
3410 /* | |
3411 1 0 0 | |
3412 01X 1-2 1 | |
3413 001XX 3-6 2-3 | |
3414 0001XXX 7-14 4-7 | |
3415 00001XXXX 15-30 8-15 | |
3416 */ | |
3417 //FIXME try accurate rate | |
6412 | 3418 //FIXME intra and inter predictors if surrounding blocks are not the same type |
3051 | 3419 if(b->type & BLOCK_INTRA){ |
4001 | 3420 return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0])) |
3421 + av_log2(2*FFABS(left->color[1] - b->color[1])) | |
3422 + 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
|
3423 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3424 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
|
3425 dmx-= b->mx; |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3426 dmy-= b->my; |
4001 | 3427 return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda |
3428 + av_log2(2*FFABS(dmy)) | |
3314 | 3429 + av_log2(2*b->ref)); |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3430 } |
3051 | 3431 } |
3432 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3433 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
|
3434 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3435 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3436 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
|
3437 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
|
3438 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3439 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
|
3440 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
|
3441 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
|
3442 uint8_t *cur = s->scratchbuf; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
3443 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
|
3444 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
|
3445 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
|
3446 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3447 const int h= p->height; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3448 int distortion; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3449 int rate= 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3450 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
|
3451 int sx= block_w*mb_x - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3452 int sy= block_w*mb_y - block_w/2; |
3206 | 3453 int x0= FFMAX(0,-sx); |
3454 int y0= FFMAX(0,-sy); | |
3455 int x1= FFMIN(block_w*2, w-sx); | |
3456 int y1= FFMIN(block_w*2, h-sy); | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3457 int i,x,y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3458 |
3314 | 3459 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
|
3460 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3461 for(y=y0; y<y1; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3462 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
|
3463 const IDWTELEM *pred1 = pred + y*obmc_stride; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3464 uint8_t *cur1 = cur + y*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3465 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3466 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
|
3467 #if FRAC_BITS >= LOG2_OBMC_MAX |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3468 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
|
3469 #else |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3470 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
|
3471 #endif |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3472 v = (v + pred1[x]) >> FRAC_BITS; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3473 if(v&(~255)) v= ~(v>>31); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3474 dst1[x] = v; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3475 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3476 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3477 |
3206 | 3478 /* copy the regions where obmc[] = (uint8_t)256 */ |
3479 if(LOG2_OBMC_MAX == 8 | |
3480 && (mb_x == 0 || mb_x == b_stride-1) | |
3481 && (mb_y == 0 || mb_y == b_height-1)){ | |
3482 if(mb_x == 0) | |
3483 x1 = block_w; | |
3484 else | |
3485 x0 = block_w; | |
3486 if(mb_y == 0) | |
3487 y1 = block_w; | |
3488 else | |
3489 y0 = block_w; | |
3490 for(y=y0; y<y1; y++) | |
3491 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0); | |
3492 } | |
3493 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3494 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
|
3495 /* 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
|
3496 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */ |
6412 | 3497 /* FIXME cmps overlap but do not cover the wavelet's whole support. |
3498 * So improving the score of one block is not strictly guaranteed | |
3499 * to improve the score of the whole frame, thus iterative motion | |
3500 * 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
|
3501 if(s->avctx->me_cmp == FF_CMP_W97) |
4197 | 3502 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
|
3503 else if(s->avctx->me_cmp == FF_CMP_W53) |
4197 | 3504 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
|
3505 else{ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3506 distortion = 0; |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3507 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
|
3508 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
|
3509 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
|
3510 } |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3511 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3512 }else{ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3513 assert(block_w==8); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3514 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
|
3515 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3516 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3517 if(plane_index==0){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3518 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3519 /* ..RRr |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3520 * .RXx. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3521 * rxx.. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3522 */ |
3051 | 3523 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
|
3524 } |
3057 | 3525 if(mb_x == b_stride-2) |
3526 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
|
3527 } |
3051 | 3528 return distortion + rate*penalty_factor; |
3529 } | |
3530 | |
3531 static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){ | |
3532 int i, y2; | |
3533 Plane *p= &s->plane[plane_index]; | |
3534 const int block_size = MB_SIZE >> s->block_max_depth; | |
3535 const int block_w = plane_index ? block_size/2 : block_size; | |
3536 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; | |
3537 const int obmc_stride= plane_index ? block_size : 2*block_size; | |
3538 const int ref_stride= s->current_picture.linesize[plane_index]; | |
3539 uint8_t *dst= s->current_picture.data[plane_index]; | |
3540 uint8_t *src= s-> input_picture.data[plane_index]; | |
6426 | 3541 //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst |
3542 // const has only been removed from zero_dst to suppress a warning | |
3543 static IDWTELEM zero_dst[4096]; //FIXME | |
3051 | 3544 const int b_stride = s->b_width << s->block_max_depth; |
3545 const int w= p->width; | |
3546 const int h= p->height; | |
3547 int distortion= 0; | |
3548 int rate= 0; | |
3549 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); | |
3550 | |
3551 for(i=0; i<9; i++){ | |
3552 int mb_x2= mb_x + (i%3) - 1; | |
3553 int mb_y2= mb_y + (i/3) - 1; | |
3554 int x= block_w*mb_x2 + block_w/2; | |
3555 int y= block_w*mb_y2 + block_w/2; | |
3556 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3557 add_yblock(s, 0, NULL, zero_dst, dst, obmc, |
3051 | 3558 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index); |
3559 | |
3560 //FIXME find a cleaner/simpler way to skip the outside stuff | |
3561 for(y2= y; y2<0; y2++) | |
3562 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3563 for(y2= h; y2<y+block_w; y2++) | |
3564 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3565 if(x<0){ | |
3566 for(y2= y; y2<y+block_w; y2++) | |
3567 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x); | |
3568 } | |
3569 if(x+block_w > w){ | |
3570 for(y2= y; y2<y+block_w; y2++) | |
3571 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w); | |
3572 } | |
3573 | |
3574 assert(block_w== 8 || block_w==16); | |
3575 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w); | |
3576 } | |
3577 | |
3578 if(plane_index==0){ | |
3579 BlockNode *b= &s->block[mb_x+mb_y*b_stride]; | |
3580 int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1); | |
3581 | |
3582 /* ..RRRr | |
3583 * .RXXx. | |
3584 * .RXXx. | |
3585 * rxxx. | |
3586 */ | |
3587 if(merged) | |
3588 rate = get_block_bits(s, mb_x, mb_y, 2); | |
3589 for(i=merged?4:0; i<9; i++){ | |
3590 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}}; | |
3591 rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1); | |
3592 } | |
3593 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3594 return distortion + rate*penalty_factor; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3595 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3596 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3597 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
|
3598 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3599 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
|
3600 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3601 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
|
3602 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
|
3603 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3604 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3605 } |
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 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
|
3608 const int support = type==1 ? 3 : 5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3609 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3610 if(type==2) return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3611 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3612 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
|
3613 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
|
3614 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3615 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
|
3616 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3617 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
|
3618 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3619 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3620 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3621 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3622 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3623 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3624 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
|
3625 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3626 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3627 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
|
3628 for(y=0; y<height; y+=4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3629 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
|
3630 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3631 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3632 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
|
3633 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3634 const int h= b->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3635 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3636 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3637 if(1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3638 int run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3639 int runs[w*h]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3640 int run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3641 int max_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3642 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3643 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3644 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3645 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3646 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
|
3647 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3648 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3649 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3650 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3651 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3652 lt= src[x - 1 + (y-1)*stride]; |
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 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3655 rt= src[x + 1 + (y-1)*stride]; |
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 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3658 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3659 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3660 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3661 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
|
3662 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3663 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3664 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3665 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3666 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3667 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3668 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
|
3669 p= parent[px + py*2*stride]; |
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 if(!(/*ll|*/l|lt|t|rt|p)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3672 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3673 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3674 run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3675 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3676 run++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3677 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3678 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3679 } |
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 max_index= run_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3682 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3683 run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3684 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3685 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3686 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
|
3687 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3688 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
|
3689 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3690 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3691 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
|
3692 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
|
3693 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3694 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3695 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3696 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3697 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
|
3698 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3699 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3700 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3701 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3702 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3703 lt= src[x - 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3704 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3705 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3706 rt= src[x + 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3707 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3708 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3709 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3710 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3711 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3712 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
|
3713 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3714 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3715 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3716 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3717 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3718 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3719 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
|
3720 p= parent[px + py*2*stride]; |
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 if(/*ll|*/l|lt|t|rt|p){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3723 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
|
3724 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3725 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
|
3726 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3727 if(!run){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3728 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3729 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3730 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3731 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
|
3732 assert(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3733 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3734 run--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3735 assert(!v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3736 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3737 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3738 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3739 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
|
3740 int l2= 2*FFABS(l) + (l<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3741 int t2= 2*FFABS(t) + (t<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3742 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3743 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
|
3744 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
|
3745 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3746 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3747 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3748 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3749 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3750 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3751 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3752 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
|
3753 // 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
|
3754 // 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
|
3755 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
|
3756 // 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
|
3757 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3758 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3759 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
|
3760 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
|
3761 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3762 BlockNode backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3763 int rd, index, value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3764 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3765 assert(mb_x>=0 && mb_y>=0); |
2994 | 3766 assert(mb_x<b_stride); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3767 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3768 if(intra){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3769 block->color[0] = p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3770 block->color[1] = p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3771 block->color[2] = p[2]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3772 block->type |= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3773 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3774 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1); |
3314 | 3775 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
|
3776 if(s->me_cache[index] == value) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3777 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3778 s->me_cache[index]= value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3779 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3780 block->mx= p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3781 block->my= p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3782 block->type &= ~BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3783 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3784 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3785 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
|
3786 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3787 //FIXME chroma |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3788 if(rd < *best_rd){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3789 *best_rd= rd; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3790 return 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3791 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3792 *block= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3793 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3794 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3795 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3796 |
6412 | 3797 /* special case for int[2] args we discard afterwards, |
3798 * 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
|
3799 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
|
3800 int p[2] = {p0, p1}; |
3197 | 3801 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
|
3802 } |
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
|
3803 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3804 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 | 3805 const int b_stride= s->b_width << s->block_max_depth; |
3806 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | |
3807 BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | |
3808 int rd, index, value; | |
3809 | |
3810 assert(mb_x>=0 && mb_y>=0); | |
3811 assert(mb_x<b_stride); | |
3812 assert(((mb_x|mb_y)&1) == 0); | |
3813 | |
3814 index= (p0 + 31*p1) & (ME_CACHE_SIZE-1); | |
3314 | 3815 value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12); |
3051 | 3816 if(s->me_cache[index] == value) |
3817 return 0; | |
3818 s->me_cache[index]= value; | |
3819 | |
3820 block->mx= p0; | |
3821 block->my= p1; | |
3314 | 3822 block->ref= ref; |
3051 | 3823 block->type &= ~BLOCK_INTRA; |
3824 block[1]= block[b_stride]= block[b_stride+1]= *block; | |
3825 | |
3826 rd= get_4block_rd(s, mb_x, mb_y, 0); | |
3827 | |
3828 //FIXME chroma | |
3829 if(rd < *best_rd){ | |
3830 *best_rd= rd; | |
3831 return 1; | |
3832 }else{ | |
3833 block[0]= backup[0]; | |
3834 block[1]= backup[1]; | |
3835 block[b_stride]= backup[2]; | |
3836 block[b_stride+1]= backup[3]; | |
3837 return 0; | |
3838 } | |
3839 } | |
3840 | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3841 static void iterative_me(SnowContext *s){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3842 int pass, mb_x, mb_y; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3843 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
|
3844 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
|
3845 const int b_stride= b_width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3846 int color[3]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3847 |
3194
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3848 { |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3849 RangeCoder r = s->c; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3850 uint8_t state[sizeof(s->block_state)]; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3851 memcpy(state, s->block_state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3852 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
|
3853 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
|
3854 encode_q_branch(s, 0, mb_x, mb_y); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3855 s->c = r; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3856 memcpy(s->block_state, state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3857 } |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3858 |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3859 for(pass=0; pass<25; pass++){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3860 int change= 0; |
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 for(mb_y= 0; mb_y<b_height; mb_y++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3863 for(mb_x= 0; mb_x<b_width; mb_x++){ |
3314 | 3864 int dia_change, i, j, ref; |
3865 int best_rd= INT_MAX, ref_rd; | |
3866 BlockNode backup, ref_b; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3867 const int index= mb_x + mb_y * b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3868 BlockNode *block= &s->block[index]; |
3324 | 3869 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : NULL; |
3870 BlockNode *lb = mb_x ? &s->block[index -1] : NULL; | |
3871 BlockNode *rb = mb_x+1<b_width ? &s->block[index +1] : NULL; | |
3872 BlockNode *bb = mb_y+1<b_height ? &s->block[index+b_stride ] : NULL; | |
3873 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : NULL; | |
3874 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->block[index-b_stride+1] : NULL; | |
3875 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL; | |
3876 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
|
3877 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
|
3878 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
|
3879 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3880 if(pass && (block->type & BLOCK_OPT)) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3881 continue; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3882 block->type |= BLOCK_OPT; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3883 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3884 backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3885 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3886 if(!s->me_cache_generation) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3887 memset(s->me_cache, 0, sizeof(s->me_cache)); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3888 s->me_cache_generation += 1<<22; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3889 |
6412 | 3890 //FIXME precalculate |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3891 { |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3892 int x, y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3893 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
|
3894 if(mb_x==0) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3895 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3896 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
|
3897 if(mb_x==b_stride-1) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3898 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3899 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
|
3900 if(mb_y==0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3901 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3902 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
|
3903 for(y=1; y<b_w; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3904 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
|
3905 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3906 if(mb_y==b_height-1){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3907 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3908 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
|
3909 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
|
3910 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
|
3911 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3912 } |
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 //skip stuff outside the picture |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
3915 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
|
3916 uint8_t *src= s-> input_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3917 uint8_t *dst= s->current_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3918 const int stride= s->current_picture.linesize[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3919 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
|
3920 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
|
3921 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
|
3922 const int w= s->plane[0].width; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3923 const int h= s->plane[0].height; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3924 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3925 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3926 for(y=sy; y<0; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3927 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
|
3928 for(y=h; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3929 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
|
3930 if(sx<0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3931 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3932 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
|
3933 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3934 if(sx+block_w*2 > w){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3935 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3936 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
|
3937 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3938 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3939 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3940 // intra(black) = neighbors' contribution to the current block |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3941 for(i=0; i<3; i++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3942 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
|
3943 |
5127 | 3944 // get previous score (cannot be cached due to OBMC) |
3057 | 3945 if(pass > 0 && (block->type&BLOCK_INTRA)){ |
3946 int color0[3]= {block->color[0], block->color[1], block->color[2]}; | |
3947 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd); | |
3948 }else | |
3197 | 3949 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd); |
3950 | |
3314 | 3951 ref_b= *block; |
3952 ref_rd= best_rd; | |
3953 for(ref=0; ref < s->ref_frames; ref++){ | |
3954 int16_t (*mvr)[2]= &s->ref_mvs[ref][index]; | |
3955 if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold | |
3956 continue; | |
3957 block->ref= ref; | |
3958 best_rd= INT_MAX; | |
3959 | |
3960 check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd); | |
3961 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd); | |
3324 | 3962 if(tb) |
3314 | 3963 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd); |
3324 | 3964 if(lb) |
3314 | 3965 check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd); |
3324 | 3966 if(rb) |
3314 | 3967 check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd); |
3324 | 3968 if(bb) |
3314 | 3969 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd); |
3970 | |
3971 /* fullpel ME */ | |
6412 | 3972 //FIXME avoid subpel interpolation / round to nearest integer |
3314 | 3973 do{ |
3974 dia_change=0; | |
3975 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){ | |
3976 for(j=0; j<i; j++){ | |
3977 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3978 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3979 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3980 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3981 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3982 } |
3314 | 3983 }while(dia_change); |
3984 /* subpel ME */ | |
3985 do{ | |
3986 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},}; | |
3987 dia_change=0; | |
3988 for(i=0; i<8; i++) | |
3989 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd); | |
3990 }while(dia_change); | |
3991 //FIXME or try the standard 2 pass qpel or similar | |
3992 | |
3993 mvr[0][0]= block->mx; | |
3994 mvr[0][1]= block->my; | |
3995 if(ref_rd > best_rd){ | |
3996 ref_rd= best_rd; | |
3997 ref_b= *block; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3998 } |
3314 | 3999 } |
4000 best_rd= ref_rd; | |
4001 *block= ref_b; | |
2998 | 4002 #if 1 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
4003 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
|
4004 //FIXME RD style color selection |
2998 | 4005 #endif |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4006 if(!same_block(block, &backup)){ |
3324 | 4007 if(tb ) tb ->type &= ~BLOCK_OPT; |
4008 if(lb ) lb ->type &= ~BLOCK_OPT; | |
4009 if(rb ) rb ->type &= ~BLOCK_OPT; | |
4010 if(bb ) bb ->type &= ~BLOCK_OPT; | |
4011 if(tlb) tlb->type &= ~BLOCK_OPT; | |
4012 if(trb) trb->type &= ~BLOCK_OPT; | |
4013 if(blb) blb->type &= ~BLOCK_OPT; | |
4014 if(brb) brb->type &= ~BLOCK_OPT; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4015 change ++; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4016 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4017 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4018 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4019 av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4020 if(!change) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4021 break; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4022 } |
3051 | 4023 |
4024 if(s->block_max_depth == 1){ | |
4025 int change= 0; | |
4026 for(mb_y= 0; mb_y<b_height; mb_y+=2){ | |
4027 for(mb_x= 0; mb_x<b_width; mb_x+=2){ | |
3324 | 4028 int i; |
3051 | 4029 int best_rd, init_rd; |
4030 const int index= mb_x + mb_y * b_stride; | |
4031 BlockNode *b[4]; | |
4032 | |
4033 b[0]= &s->block[index]; | |
4034 b[1]= b[0]+1; | |
4035 b[2]= b[0]+b_stride; | |
4036 b[3]= b[2]+1; | |
4037 if(same_block(b[0], b[1]) && | |
4038 same_block(b[0], b[2]) && | |
4039 same_block(b[0], b[3])) | |
4040 continue; | |
4041 | |
4042 if(!s->me_cache_generation) | |
4043 memset(s->me_cache, 0, sizeof(s->me_cache)); | |
4044 s->me_cache_generation += 1<<22; | |
4045 | |
4046 init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0); | |
4047 | |
3314 | 4048 //FIXME more multiref search? |
3051 | 4049 check_4block_inter(s, mb_x, mb_y, |
4050 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2, | |
3314 | 4051 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd); |
3051 | 4052 |
4053 for(i=0; i<4; i++) | |
4054 if(!(b[i]->type&BLOCK_INTRA)) | |
3314 | 4055 check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd); |
3051 | 4056 |
4057 if(init_rd != best_rd) | |
4058 change++; | |
4059 } | |
4060 } | |
4061 av_log(NULL, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4); | |
4062 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4063 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4064 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4065 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
|
4066 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4067 int w= s->b_width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4068 int h= s->b_height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4069 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4070 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
|
4071 iterative_me(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4072 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4073 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4074 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
|
4075 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
|
4076 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4077 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4078 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4079 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
|
4080 encode_q_branch2(s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4081 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4082 encode_q_branch (s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4083 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4084 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4085 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4086 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4087 static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias){ |
2138 | 4088 const int w= b->width; |
4089 const int h= b->height; | |
4594 | 4090 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
5575 | 4091 const int qmul= qexp[qlog&(QROOT-1)]<<((qlog>>QSHIFT) + ENCODER_EXTRA_BITS); |
2150 | 4092 int x,y, thres1, thres2; |
2138 | 4093 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4094 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
|
4095 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
|
4096 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
|
4097 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
|
4098 return; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4099 } |
2967 | 4100 |
2138 | 4101 bias= bias ? 0 : (3*qmul)>>3; |
2150 | 4102 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
4103 thres2= 2*thres1; | |
2967 | 4104 |
2138 | 4105 if(!bias){ |
4106 for(y=0; y<h; y++){ | |
4107 for(x=0; x<w; x++){ | |
2150 | 4108 int i= src[x + y*stride]; |
2967 | 4109 |
2150 | 4110 if((unsigned)(i+thres1) > thres2){ |
4111 if(i>=0){ | |
4112 i<<= QEXPSHIFT; | |
4113 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
|
4114 dst[x + y*stride]= i; |
2150 | 4115 }else{ |
4116 i= -i; | |
4117 i<<= QEXPSHIFT; | |
4118 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
|
4119 dst[x + y*stride]= -i; |
2150 | 4120 } |
4121 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4122 dst[x + y*stride]= 0; |
2138 | 4123 } |
4124 } | |
4125 }else{ | |
4126 for(y=0; y<h; y++){ | |
4127 for(x=0; x<w; x++){ | |
2967 | 4128 int i= src[x + y*stride]; |
4129 | |
2150 | 4130 if((unsigned)(i+thres1) > thres2){ |
4131 if(i>=0){ | |
4132 i<<= QEXPSHIFT; | |
4133 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
|
4134 dst[x + y*stride]= i; |
2150 | 4135 }else{ |
4136 i= -i; | |
4137 i<<= QEXPSHIFT; | |
4138 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
|
4139 dst[x + y*stride]= -i; |
2150 | 4140 } |
4141 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4142 dst[x + y*stride]= 0; |
2138 | 4143 } |
4144 } | |
4145 } | |
4146 } | |
4147 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4148 static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride){ |
2138 | 4149 const int w= b->width; |
4150 const int h= b->height; | |
4594 | 4151 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 4152 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2138 | 4153 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
4154 int x,y; | |
2967 | 4155 |
2161 | 4156 if(s->qlog == LOSSLESS_QLOG) return; |
2967 | 4157 |
2138 | 4158 for(y=0; y<h; y++){ |
4159 for(x=0; x<w; x++){ | |
4160 int i= src[x + y*stride]; | |
4161 if(i<0){ | |
4162 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
4163 }else if(i>0){ | |
4164 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
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 decorrelate(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=h-1; y>=0; y--){ |
4176 for(x=w-1; x>=0; 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 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4194 static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){ |
2138 | 4195 const int w= b->width; |
4196 const int h= b->height; | |
4197 int x,y; | |
2967 | 4198 |
2138 | 4199 for(y=0; y<h; y++){ |
4200 for(x=0; x<w; x++){ | |
4201 int i= x + y*stride; | |
2967 | 4202 |
2138 | 4203 if(x){ |
4204 if(use_median){ | |
4205 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
4206 else src[i] += src[i - 1]; | |
4207 }else{ | |
4208 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
4209 else src[i] += src[i - 1]; | |
4210 } | |
4211 }else{ | |
4212 if(y) src[i] += src[i - stride]; | |
4213 } | |
4214 } | |
4215 } | |
4216 } | |
4217 | |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4218 static void encode_qlogs(SnowContext *s){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4219 int plane_index, level, orientation; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4220 |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4221 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
|
4222 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
|
4223 for(orientation=level ? 1:0; orientation<4; orientation++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4224 if(orientation==2) continue; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4225 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
|
4226 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4227 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4228 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4229 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4230 |
2138 | 4231 static void encode_header(SnowContext *s){ |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4232 int plane_index, i; |
2967 | 4233 uint8_t kstate[32]; |
4234 | |
4235 memset(kstate, MID_STATE, sizeof(kstate)); | |
2138 | 4236 |
2335 | 4237 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
|
4238 if(s->keyframe || s->always_reset){ |
2199 | 4239 reset_contexts(s); |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4240 s->last_spatial_decomposition_type= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4241 s->last_qlog= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4242 s->last_qbias= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4243 s->last_mv_scale= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4244 s->last_block_max_depth= 0; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4245 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
|
4246 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4247 p->last_htaps=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4248 p->last_diag_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4249 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
|
4250 } |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4251 } |
2138 | 4252 if(s->keyframe){ |
4253 put_symbol(&s->c, s->header_state, s->version, 0); | |
2335 | 4254 put_rac(&s->c, s->header_state, s->always_reset); |
2138 | 4255 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); |
4256 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); | |
4257 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); | |
4258 put_symbol(&s->c, s->header_state, s->colorspace_type, 0); | |
4259 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0); | |
4260 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0); | |
2335 | 4261 put_rac(&s->c, s->header_state, s->spatial_scalability); |
4262 // put_rac(&s->c, s->header_state, s->rate_scalability); | |
3314 | 4263 put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0); |
2138 | 4264 |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4265 encode_qlogs(s); |
2138 | 4266 } |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4267 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4268 if(!s->keyframe){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4269 int update_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4270 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
|
4271 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4272 update_mc |= p->last_htaps != p->htaps; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4273 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
|
4274 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
|
4275 } |
5667
9242e125395f
do not force the halfpel filter coeffs to be retransmitted on every frame
michael
parents:
5666
diff
changeset
|
4276 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
|
4277 if(update_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4278 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
|
4279 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4280 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
|
4281 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
|
4282 for(i= p->htaps/2; i; i--) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4283 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
|
4284 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4285 } |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4286 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4287 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
|
4288 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
|
4289 encode_qlogs(s); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4290 }else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4291 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
|
4292 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4293 |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4294 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
|
4295 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
|
4296 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
|
4297 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
|
4298 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
|
4299 |
6144 | 4300 } |
4301 | |
4302 static void update_last_header_values(SnowContext *s){ | |
4303 int plane_index; | |
4304 | |
4305 if(!s->keyframe){ | |
4306 for(plane_index=0; plane_index<2; plane_index++){ | |
4307 Plane *p= &s->plane[plane_index]; | |
4308 p->last_diag_mc= p->diag_mc; | |
4309 p->last_htaps = p->htaps; | |
4310 memcpy(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); | |
4311 } | |
4312 } | |
4313 | |
6414 | 4314 s->last_spatial_decomposition_type = s->spatial_decomposition_type; |
4315 s->last_qlog = s->qlog; | |
4316 s->last_qbias = s->qbias; | |
4317 s->last_mv_scale = s->mv_scale; | |
4318 s->last_block_max_depth = s->block_max_depth; | |
4319 s->last_spatial_decomposition_count = s->spatial_decomposition_count; | |
2138 | 4320 } |
4321 | |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4322 static int qscale2qlog(int qscale){ |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4323 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
|
4324 + 61*QROOT/8; //<64 >60 |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4325 } |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4326 |
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
|
4327 static int ratecontrol_1pass(SnowContext *s, AVFrame *pict) |
3313 | 4328 { |
6412 | 4329 /* Estimate the frame's complexity as a sum of weighted dwt coefficients. |
3313 | 4330 * FIXME we know exact mv bits at this point, |
4331 * but ratecontrol isn't set up to include them. */ | |
4332 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
|
4333 int level, orientation, delta_qlog; |
3313 | 4334 |
4335 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4336 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4337 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
|
4338 IDWTELEM *buf= b->ibuf; |
3313 | 4339 const int w= b->width; |
4340 const int h= b->height; | |
4341 const int stride= b->stride; | |
4594 | 4342 const int qlog= av_clip(2*QROOT + b->qlog, 0, QROOT*16); |
3313 | 4343 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
4344 const int qdiv= (1<<16)/qmul; | |
4345 int x, y; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4346 //FIXME this is ugly |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4347 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
|
4348 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
|
4349 buf[x+y*stride]= b->buf[x+y*stride]; |
3313 | 4350 if(orientation==0) |
4351 decorrelate(s, b, buf, stride, 1, 0); | |
4352 for(y=0; y<h; y++) | |
4353 for(x=0; x<w; x++) | |
4354 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16; | |
4355 } | |
4356 } | |
4357 | |
4358 /* ugly, ratecontrol just takes a sqrt again */ | |
4359 coef_sum = (uint64_t)coef_sum * coef_sum >> 16; | |
4360 assert(coef_sum < INT_MAX); | |
4361 | |
6481 | 4362 if(pict->pict_type == FF_I_TYPE){ |
3313 | 4363 s->m.current_picture.mb_var_sum= coef_sum; |
4364 s->m.current_picture.mc_mb_var_sum= 0; | |
4365 }else{ | |
4366 s->m.current_picture.mc_mb_var_sum= coef_sum; | |
4367 s->m.current_picture.mb_var_sum= 0; | |
4368 } | |
4369 | |
4370 pict->quality= ff_rate_estimate_qscale(&s->m, 1); | |
3766 | 4371 if (pict->quality < 0) |
4011
5bce97c30a69
-1 is a valid return value in ratecontrol_1pass() -> 100l for takis
michael
parents:
4001
diff
changeset
|
4372 return INT_MIN; |
3313 | 4373 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
|
4374 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
|
4375 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
|
4376 return delta_qlog; |
3313 | 4377 } |
2138 | 4378 |
5909 | 4379 static void calculate_visual_weight(SnowContext *s, Plane *p){ |
2138 | 4380 int width = p->width; |
4381 int height= p->height; | |
2198 | 4382 int level, orientation, x, y; |
2138 | 4383 |
4384 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4385 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4386 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
|
4387 IDWTELEM *ibuf= b->ibuf; |
2138 | 4388 int64_t error=0; |
2967 | 4389 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4390 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
|
4391 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
|
4392 ff_spatial_idwt(s->spatial_idwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 4393 for(y=0; y<height; y++){ |
4394 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
|
4395 int64_t d= s->spatial_idwt_buffer[x + y*width]*16; |
2138 | 4396 error += d*d; |
4397 } | |
4398 } | |
4399 | |
4400 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
4401 } | |
4402 } | |
4403 } | |
4404 | |
4405 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
4406 SnowContext *s = avctx->priv_data; | |
2335 | 4407 RangeCoder * const c= &s->c; |
2138 | 4408 AVFrame *pict = data; |
4409 const int width= s->avctx->width; | |
4410 const int height= s->avctx->height; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4411 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
|
4412 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
|
4413 uint8_t rc_block_bak[sizeof(s->block_state)]; |
2138 | 4414 |
2335 | 4415 ff_init_range_encoder(c, buf, buf_size); |
4416 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
2967 | 4417 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4418 for(i=0; i<3; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4419 int shift= !!i; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4420 for(y=0; y<(height>>shift); y++) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4421 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
|
4422 &pict->data[i][y * pict->linesize[i]], |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4423 width>>shift); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4424 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4425 s->new_picture = *pict; |
2138 | 4426 |
3313 | 4427 s->m.picture_number= avctx->frame_number; |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4428 if(avctx->flags&CODEC_FLAG_PASS2){ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4429 s->m.pict_type = |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4430 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
|
4431 s->keyframe= pict->pict_type==FF_I_TYPE; |
3766 | 4432 if(!(avctx->flags&CODEC_FLAG_QSCALE)) { |
3193 | 4433 pict->quality= ff_rate_estimate_qscale(&s->m, 0); |
3766 | 4434 if (pict->quality < 0) |
4435 return -1; | |
4436 } | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4437 }else{ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4438 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; |
3313 | 4439 s->m.pict_type= |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4440 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
|
4441 } |
2967 | 4442 |
3313 | 4443 if(s->pass1_rc && avctx->frame_number == 0) |
4444 pict->quality= 2*FF_QP2LAMBDA; | |
2161 | 4445 if(pict->quality){ |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4446 s->qlog= qscale2qlog(pict->quality); |
3313 | 4447 s->lambda = pict->quality * 3/2; |
4448 } | |
4449 if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){ | |
2161 | 4450 s->qlog= LOSSLESS_QLOG; |
3313 | 4451 s->lambda = 0; |
6412 | 4452 }//else keep previous frame's qlog until after motion estimation |
2138 | 4453 |
4454 frame_start(s); | |
4455 | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4456 s->m.current_picture_ptr= &s->m.current_picture; |
10625 | 4457 s->m.last_picture.pts= s->m.current_picture.pts; |
4458 s->m.current_picture.pts= pict->pts; | |
6481 | 4459 if(pict->pict_type == FF_P_TYPE){ |
2138 | 4460 int block_width = (width +15)>>4; |
4461 int block_height= (height+15)>>4; | |
4462 int stride= s->current_picture.linesize[0]; | |
2967 | 4463 |
2138 | 4464 assert(s->current_picture.data[0]); |
3314 | 4465 assert(s->last_picture[0].data[0]); |
2967 | 4466 |
2138 | 4467 s->m.avctx= s->avctx; |
4468 s->m.current_picture.data[0]= s->current_picture.data[0]; | |
3314 | 4469 s->m. last_picture.data[0]= s->last_picture[0].data[0]; |
2138 | 4470 s->m. new_picture.data[0]= s-> input_picture.data[0]; |
4471 s->m. last_picture_ptr= &s->m. last_picture; | |
4472 s->m.linesize= | |
4473 s->m. last_picture.linesize[0]= | |
4474 s->m. new_picture.linesize[0]= | |
4475 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
|
4476 s->m.uvlinesize= s->current_picture.linesize[1]; |
2138 | 4477 s->m.width = width; |
4478 s->m.height= height; | |
4479 s->m.mb_width = block_width; | |
4480 s->m.mb_height= block_height; | |
4481 s->m.mb_stride= s->m.mb_width+1; | |
4482 s->m.b8_stride= 2*s->m.mb_width+1; | |
4483 s->m.f_code=1; | |
4484 s->m.pict_type= pict->pict_type; | |
4485 s->m.me_method= s->avctx->me_method; | |
4486 s->m.me.scene_change_score=0; | |
4487 s->m.flags= s->avctx->flags; | |
4488 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0; | |
4489 s->m.out_format= FMT_H263; | |
4490 s->m.unrestricted_mv= 1; | |
4491 | |
3313 | 4492 s->m.lambda = s->lambda; |
2138 | 4493 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
|
4494 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
|
4495 |
2138 | 4496 s->m.dsp= s->dsp; //move |
4497 ff_init_me(&s->m); | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4498 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
|
4499 } |
2967 | 4500 |
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
|
4501 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
|
4502 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
|
4503 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
|
4504 } |
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
|
4505 |
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
|
4506 redo_frame: |
2967 | 4507 |
6481 | 4508 if(pict->pict_type == FF_I_TYPE) |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4509 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4510 else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4511 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4512 |
3313 | 4513 s->m.pict_type = pict->pict_type; |
6481 | 4514 s->qbias= pict->pict_type == FF_P_TYPE ? 2 : 0; |
2138 | 4515 |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4516 common_init_after_header(avctx); |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4517 |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4518 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4519 for(plane_index=0; plane_index<3; plane_index++){ |
5909 | 4520 calculate_visual_weight(s, &s->plane[plane_index]); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4521 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4522 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4523 |
2138 | 4524 encode_header(s); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4525 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
|
4526 encode_blocks(s, 1); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4527 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits; |
2967 | 4528 |
2138 | 4529 for(plane_index=0; plane_index<3; plane_index++){ |
4530 Plane *p= &s->plane[plane_index]; | |
4531 int w= p->width; | |
4532 int h= p->height; | |
4533 int x, y; | |
2198 | 4534 // int bits= put_bits_count(&s->c.pb); |
2138 | 4535 |
6414 | 4536 if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){ |
4537 //FIXME optimize | |
4538 if(pict->data[plane_index]) //FIXME gray hack | |
4539 for(y=0; y<h; y++){ | |
4540 for(x=0; x<w; x++){ | |
4541 s->spatial_idwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS; | |
4542 } | |
4543 } | |
4544 predict_plane(s, s->spatial_idwt_buffer, plane_index, 0); | |
4545 | |
4546 if( plane_index==0 | |
6481 | 4547 && pict->pict_type == FF_P_TYPE |
6414 | 4548 && !(avctx->flags&CODEC_FLAG_PASS2) |
4549 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){ | |
4550 ff_init_range_encoder(c, buf, buf_size); | |
4551 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
4552 pict->pict_type= FF_I_TYPE; | |
4553 s->keyframe=1; | |
4554 s->current_picture.key_frame=1; | |
4555 goto redo_frame; | |
2138 | 4556 } |
6414 | 4557 |
4558 if(s->qlog == LOSSLESS_QLOG){ | |
4559 for(y=0; y<h; y++){ | |
4560 for(x=0; x<w; x++){ | |
4561 s->spatial_dwt_buffer[y*w + x]= (s->spatial_idwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS; | |
4562 } | |
2161 | 4563 } |
6414 | 4564 }else{ |
4565 for(y=0; y<h; y++){ | |
4566 for(x=0; x<w; x++){ | |
4567 s->spatial_dwt_buffer[y*w + x]=s->spatial_idwt_buffer[y*w + x]<<ENCODER_EXTRA_BITS; | |
4568 } | |
5575 | 4569 } |
4570 } | |
6414 | 4571 |
4572 /* if(QUANTIZE2) | |
4573 dwt_quantize(s, p, s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type); | |
4574 else*/ | |
4575 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4576 | |
4577 if(s->pass1_rc && plane_index==0){ | |
4578 int delta_qlog = ratecontrol_1pass(s, pict); | |
4579 if (delta_qlog <= INT_MIN) | |
4580 return -1; | |
4581 if(delta_qlog){ | |
4582 //reordering qlog in the bitstream would eliminate this reset | |
4583 ff_init_range_encoder(c, buf, buf_size); | |
4584 memcpy(s->header_state, rc_header_bak, sizeof(s->header_state)); | |
4585 memcpy(s->block_state, rc_block_bak, sizeof(s->block_state)); | |
4586 encode_header(s); | |
4587 encode_blocks(s, 0); | |
2161 | 4588 } |
4589 } | |
6414 | 4590 |
4591 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4592 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4593 SubBand *b= &p->band[level][orientation]; | |
4594 | |
4595 if(!QUANTIZE2) | |
4596 quantize(s, b, b->ibuf, b->buf, b->stride, s->qbias); | |
4597 if(orientation==0) | |
6481 | 4598 decorrelate(s, b, b->ibuf, b->stride, pict->pict_type == FF_P_TYPE, 0); |
6414 | 4599 encode_subband(s, b, b->ibuf, b->parent ? b->parent->ibuf : NULL, b->stride, orientation); |
4600 assert(b->parent==NULL || b->parent->stride == b->stride*2); | |
4601 if(orientation==0) | |
4602 correlate(s, b, b->ibuf, b->stride, 1, 0); | |
4603 } | |
4604 } | |
4605 | |
4606 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4607 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4608 SubBand *b= &p->band[level][orientation]; | |
4609 | |
4610 dequantize(s, b, b->ibuf, b->stride); | |
4611 } | |
4612 } | |
4613 | |
4614 ff_spatial_idwt(s->spatial_idwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4615 if(s->qlog == LOSSLESS_QLOG){ | |
4616 for(y=0; y<h; y++){ | |
4617 for(x=0; x<w; x++){ | |
4618 s->spatial_idwt_buffer[y*w + x]<<=FRAC_BITS; | |
4619 } | |
4620 } | |
4621 } | |
4622 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); | |
4623 }else{ | |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4624 //ME/MC only |
6481 | 4625 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
|
4626 for(y=0; y<h; y++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4627 for(x=0; x<w; x++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4628 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
|
4629 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
|
4630 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4631 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4632 }else{ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4633 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
|
4634 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
|
4635 } |
6414 | 4636 } |
2138 | 4637 if(s->avctx->flags&CODEC_FLAG_PSNR){ |
4638 int64_t error= 0; | |
2967 | 4639 |
6414 | 4640 if(pict->data[plane_index]) //FIXME gray hack |
4641 for(y=0; y<h; y++){ | |
4642 for(x=0; x<w; x++){ | |
4643 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]; | |
4644 error += d*d; | |
4645 } | |
2138 | 4646 } |
4647 s->avctx->error[plane_index] += error; | |
2232 | 4648 s->current_picture.error[plane_index] = error; |
2138 | 4649 } |
6414 | 4650 |
2138 | 4651 } |
4652 | |
6144 | 4653 update_last_header_values(s); |
4654 | |
9374 | 4655 release_buffer(avctx); |
2138 | 4656 |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4657 s->current_picture.coded_picture_number = avctx->frame_number; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4658 s->current_picture.pict_type = pict->pict_type; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4659 s->current_picture.quality = pict->quality; |
3313 | 4660 s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
4661 s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits; | |
4662 s->m.current_picture.display_picture_number = | |
4663 s->m.current_picture.coded_picture_number = avctx->frame_number; | |
4664 s->m.current_picture.quality = pict->quality; | |
4665 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start); | |
4666 if(s->pass1_rc) | |
3766 | 4667 if (ff_rate_estimate_qscale(&s->m, 0) < 0) |
4668 return -1; | |
3313 | 4669 if(avctx->flags&CODEC_FLAG_PASS1) |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4670 ff_write_pass1_stats(&s->m); |
3313 | 4671 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
|
4672 avctx->frame_bits = s->m.frame_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4673 avctx->mv_bits = s->m.mv_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4674 avctx->misc_bits = s->m.misc_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4675 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
|
4676 |
2138 | 4677 emms_c(); |
2967 | 4678 |
2335 | 4679 return ff_rac_terminate(c); |
2138 | 4680 } |
4681 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
4682 static av_cold int encode_end(AVCodecContext *avctx) |
2138 | 4683 { |
4684 SnowContext *s = avctx->priv_data; | |
4685 | |
4686 common_end(s); | |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4687 if (s->input_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4688 avctx->release_buffer(avctx, &s->input_picture); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4689 av_free(avctx->stats_out); |
2138 | 4690 |
4691 return 0; | |
4692 } | |
4693 | |
4694 AVCodec snow_encoder = { | |
4695 "snow", | |
4696 CODEC_TYPE_VIDEO, | |
4697 CODEC_ID_SNOW, | |
4698 sizeof(SnowContext), | |
4699 encode_init, | |
4700 encode_frame, | |
4701 encode_end, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
4702 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
2138 | 4703 }; |
2408
a6e4da1c28ee
Disable encoders patch by (Gianluigi Tiesi <mplayer netfarm it>)
michael
parents:
2368
diff
changeset
|
4704 #endif |
2138 | 4705 |
4706 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4707 #ifdef TEST |
2138 | 4708 #undef malloc |
4709 #undef free | |
4710 #undef printf | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4711 |
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4712 #include "libavutil/lfg.h" |
2138 | 4713 |
5934 | 4714 int main(void){ |
2138 | 4715 int width=256; |
4716 int height=256; | |
4717 int buffer[2][width*height]; | |
4718 SnowContext s; | |
4719 int i; | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4720 AVLFG prng; |
2138 | 4721 s.spatial_decomposition_count=6; |
4722 s.spatial_decomposition_type=1; | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4723 |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4724 av_lfg_init(&prng, 1); |
2967 | 4725 |
2138 | 4726 printf("testing 5/3 DWT\n"); |
4727 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4728 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4729 |
2951 | 4730 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4731 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4732 |
2138 | 4733 for(i=0; i<width*height; i++) |
9197 | 4734 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2138 | 4735 |
4736 printf("testing 9/7 DWT\n"); | |
4737 s.spatial_decomposition_type=0; | |
4738 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4739 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4740 |
2951 | 4741 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4742 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4743 |
2138 | 4744 for(i=0; i<width*height; i++) |
9197 | 4745 if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2967 | 4746 |
2951 | 4747 #if 0 |
2138 | 4748 printf("testing AC coder\n"); |
4749 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4750 ff_init_range_encoder(&s.c, buffer[0], 256*256); |
2138 | 4751 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4752 |
2138 | 4753 for(i=-256; i<256; i++){ |
4001 | 4754 put_symbol(&s.c, s.header_state, i*i*i/3*FFABS(i), 1); |
2138 | 4755 } |
2335 | 4756 ff_rac_terminate(&s.c); |
2138 | 4757 |
4758 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4759 ff_init_range_decoder(&s.c, buffer[0], 256*256); |
2138 | 4760 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4761 |
2138 | 4762 for(i=-256; i<256; i++){ |
4763 int j; | |
4764 j= get_symbol(&s.c, s.header_state, 1); | |
4001 | 4765 if(j!=i*i*i/3*FFABS(i)) printf("fsck: %d != %d\n", i, j); |
2138 | 4766 } |
2951 | 4767 #endif |
6414 | 4768 { |
4769 int level, orientation, x, y; | |
4770 int64_t errors[8][4]; | |
4771 int64_t g=0; | |
4772 | |
4773 memset(errors, 0, sizeof(errors)); | |
4774 s.spatial_decomposition_count=3; | |
4775 s.spatial_decomposition_type=0; | |
4776 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4777 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4778 int w= width >> (s.spatial_decomposition_count-level); | |
4779 int h= height >> (s.spatial_decomposition_count-level); | |
4780 int stride= width << (s.spatial_decomposition_count-level); | |
4781 DWTELEM *buf= buffer[0]; | |
4782 int64_t error=0; | |
4783 | |
4784 if(orientation&1) buf+=w; | |
4785 if(orientation>1) buf+=stride>>1; | |
4786 | |
4787 memset(buffer[0], 0, sizeof(int)*width*height); | |
4788 buf[w/2 + h/2*stride]= 256*256; | |
4789 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
4790 for(y=0; y<height; y++){ | |
4791 for(x=0; x<width; x++){ | |
4792 int64_t d= buffer[0][x + y*width]; | |
4793 error += d*d; | |
4794 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d); | |
4795 } | |
4796 if(FFABS(height/2-y)<9 && level==2) printf("\n"); | |
2138 | 4797 } |
6414 | 4798 error= (int)(sqrt(error)+0.5); |
4799 errors[level][orientation]= error; | |
8611 | 4800 if(g) g=av_gcd(g, error); |
6414 | 4801 else g= error; |
2138 | 4802 } |
4803 } | |
6414 | 4804 printf("static int const visual_weight[][4]={\n"); |
4805 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4806 printf(" {"); | |
4807 for(orientation=0; orientation<4; orientation++){ | |
4808 printf("%8"PRId64",", errors[level][orientation]/g); | |
4809 } | |
4810 printf("},\n"); | |
2138 | 4811 } |
6414 | 4812 printf("};\n"); |
4813 { | |
2138 | 4814 int level=2; |
4815 int w= width >> (s.spatial_decomposition_count-level); | |
6168 | 4816 //int h= height >> (s.spatial_decomposition_count-level); |
2138 | 4817 int stride= width << (s.spatial_decomposition_count-level); |
4818 DWTELEM *buf= buffer[0]; | |
4819 int64_t error=0; | |
4820 | |
4821 buf+=w; | |
4822 buf+=stride>>1; | |
2967 | 4823 |
2138 | 4824 memset(buffer[0], 0, sizeof(int)*width*height); |
4825 #if 1 | |
4826 for(y=0; y<height; y++){ | |
4827 for(x=0; x<width; x++){ | |
4828 int tab[4]={0,2,3,1}; | |
4829 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)]; | |
4830 } | |
4831 } | |
2951 | 4832 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4833 #else |
4834 for(y=0; y<h; y++){ | |
4835 for(x=0; x<w; x++){ | |
4836 buf[x + y*stride ]=169; | |
4837 buf[x + y*stride-w]=64; | |
4838 } | |
4839 } | |
2951 | 4840 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4841 #endif |
4842 for(y=0; y<height; y++){ | |
4843 for(x=0; x<width; x++){ | |
4844 int64_t d= buffer[0][x + y*width]; | |
4845 error += d*d; | |
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4846 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d); |
2138 | 4847 } |
4001 | 4848 if(FFABS(height/2-y)<9) printf("\n"); |
2138 | 4849 } |
6414 | 4850 } |
4851 | |
2138 | 4852 } |
4853 return 0; | |
4854 } | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4855 #endif /* TEST */ |