Mercurial > libavcodec.hg
annotate snow.c @ 2336:9cd834fc7325 libavcodec
segfault fix
author | michael |
---|---|
date | Sun, 31 Oct 2004 00:42:43 +0000 |
parents | 28eb7b1dcefc |
children | a7ac68734a91 |
rev | line source |
---|---|
2138 | 1 /* |
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
3 * | |
4 * This library is free software; you can redistribute it and/or | |
5 * modify it under the terms of the GNU Lesser General Public | |
6 * License as published by the Free Software Foundation; either | |
7 * version 2 of the License, or (at your option) any later version. | |
8 * | |
9 * This library is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 * Lesser General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU Lesser General Public | |
15 * License along with this library; if not, write to the Free Software | |
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 */ | |
18 | |
19 #include "avcodec.h" | |
20 #include "common.h" | |
21 #include "dsputil.h" | |
2335 | 22 |
23 #include "rangecoder.h" | |
24 #define MID_STATE 128 | |
2138 | 25 |
26 #include "mpegvideo.h" | |
27 | |
28 #undef NDEBUG | |
29 #include <assert.h> | |
30 | |
31 #define MAX_DECOMPOSITIONS 8 | |
32 #define MAX_PLANES 4 | |
33 #define DWTELEM int | |
34 #define QROOT 8 | |
2161 | 35 #define LOSSLESS_QLOG -128 |
2246 | 36 #define FRAC_BITS 8 |
2138 | 37 |
38 static const int8_t quant3[256]={ | |
39 0, 0, 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,-1, | |
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
52 -1,-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, 0, | |
55 }; | |
56 static const int8_t quant3b[256]={ | |
57 0, 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 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
70 -1,-1,-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 }; | |
74 static const int8_t quant5[256]={ | |
75 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
80 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
83 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
84 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
85 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
86 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
88 -2,-2,-2,-2,-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,-1,-1,-1, | |
91 }; | |
92 static const int8_t quant7[256]={ | |
93 0, 1, 1, 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, 3, 3, 3, 3, 3, 3, 3, 3, | |
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
97 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
98 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
99 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
100 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
101 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
102 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
103 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
104 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
105 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-2,-2,-2,-2,-2,-2,-1,-1, | |
109 }; | |
110 static const int8_t quant9[256]={ | |
111 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
112 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
115 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
116 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
117 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
119 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
120 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
121 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
122 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
123 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
125 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
126 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
127 }; | |
128 static const int8_t quant11[256]={ | |
129 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
134 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
135 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
136 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
137 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
138 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
139 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
140 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
144 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
145 }; | |
146 static const int8_t quant13[256]={ | |
147 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
148 4, 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, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
151 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
152 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
153 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
154 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
155 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
156 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
157 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
158 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
159 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
160 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
162 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
163 }; | |
164 | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
165 #define LOG2_OBMC_MAX 6 |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
166 #define OBMC_MAX (1<<(LOG2_OBMC_MAX)) |
2138 | 167 #if 0 //64*cubic |
168 static const uint8_t obmc32[1024]={ | |
169 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, | |
170 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
171 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
172 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, | |
173 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0, | |
174 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0, | |
175 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0, | |
176 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0, | |
177 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0, | |
178 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0, | |
179 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0, | |
180 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0, | |
181 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0, | |
182 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0, | |
183 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0, | |
184 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0, | |
185 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0, | |
186 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0, | |
187 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0, | |
188 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0, | |
189 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0, | |
190 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0, | |
191 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0, | |
192 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0, | |
193 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0, | |
194 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0, | |
195 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0, | |
196 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0, | |
197 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, | |
198 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
199 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
200 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, | |
201 //error:0.000022 | |
202 }; | |
203 static const uint8_t obmc16[256]={ | |
204 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
205 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0, | |
206 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0, | |
207 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0, | |
208 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0, | |
209 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0, | |
210 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1, | |
211 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1, | |
212 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1, | |
213 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1, | |
214 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0, | |
215 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0, | |
216 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0, | |
217 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0, | |
218 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0, | |
219 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
220 //error:0.000033 | |
221 }; | |
222 #elif 1 // 64*linear | |
223 static const uint8_t obmc32[1024]={ | |
224 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, | |
225 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, | |
226 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0, | |
227 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0, | |
228 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1, | |
229 1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1, | |
230 1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1, | |
231 1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1, | |
232 1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1, | |
233 1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1, | |
234 1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1, | |
235 1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1, | |
236 2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2, | |
237 2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2, | |
238 2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2, | |
239 2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2, | |
240 2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2, | |
241 2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2, | |
242 2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2, | |
243 2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2, | |
244 1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1, | |
245 1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1, | |
246 1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1, | |
247 1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1, | |
248 1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1, | |
249 1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1, | |
250 1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1, | |
251 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1, | |
252 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0, | |
253 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0, | |
254 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, | |
255 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, | |
256 //error:0.000020 | |
257 }; | |
258 static const uint8_t obmc16[256]={ | |
259 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0, | |
260 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1, | |
261 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1, | |
262 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2, | |
263 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2, | |
264 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3, | |
265 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3, | |
266 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4, | |
267 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4, | |
268 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3, | |
269 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3, | |
270 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2, | |
271 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2, | |
272 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1, | |
273 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1, | |
274 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0, | |
275 //error:0.000015 | |
276 }; | |
277 #else //64*cos | |
278 static const uint8_t obmc32[1024]={ | |
279 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, | |
280 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
281 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
282 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, | |
283 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0, | |
284 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0, | |
285 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0, | |
286 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0, | |
287 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0, | |
288 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0, | |
289 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0, | |
290 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0, | |
291 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0, | |
292 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0, | |
293 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0, | |
294 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0, | |
295 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0, | |
296 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0, | |
297 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0, | |
298 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0, | |
299 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0, | |
300 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0, | |
301 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0, | |
302 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0, | |
303 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0, | |
304 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0, | |
305 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0, | |
306 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0, | |
307 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, | |
308 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
309 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
310 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, | |
311 //error:0.000022 | |
312 }; | |
313 static const uint8_t obmc16[256]={ | |
314 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
315 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0, | |
316 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0, | |
317 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0, | |
318 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0, | |
319 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1, | |
320 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1, | |
321 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0, | |
322 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0, | |
323 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1, | |
324 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1, | |
325 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0, | |
326 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0, | |
327 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0, | |
328 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0, | |
329 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
330 //error:0.000022 | |
331 }; | |
332 #endif | |
333 | |
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
|
334 //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
|
335 static const uint8_t obmc8[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
|
336 1, 3, 5, 7, 7, 5, 3, 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
|
337 3, 9,15,21,21,15, 9, 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
|
338 5,15,25,35,35,25,15, 5, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
339 7,21,35,49,49,35,21, 7, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
340 7,21,35,49,49,35,21, 7, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
341 5,15,25,35,35,25,15, 5, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
342 3, 9,15,21,21,15, 9, 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
|
343 1, 3, 5, 7, 7, 5, 3, 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
|
344 //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
|
345 }; |
70b27300a496
quad 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 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
347 //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
|
348 static const uint8_t obmc4[16]={ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
349 4,12,12, 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
|
350 12,36,36,12, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
351 12,36,36,12, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
352 4,12,12, 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
|
353 //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
|
354 }; |
70b27300a496
quad 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 |
70b27300a496
quad 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 static const uint8_t *obmc_tab[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
|
357 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
|
358 }; |
70b27300a496
quad 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 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
360 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
|
361 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
|
362 int16_t my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
363 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
|
364 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
|
365 //#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
|
366 #define BLOCK_INTRA 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
|
367 //#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
|
368 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
|
369 }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
|
370 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
371 #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
|
372 #define MB_SIZE (1<<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
|
373 |
2138 | 374 typedef struct SubBand{ |
375 int level; | |
376 int stride; | |
377 int width; | |
378 int height; | |
379 int qlog; ///< log(qscale)/log[2^(1/6)] | |
380 DWTELEM *buf; | |
2192 | 381 int16_t *x; |
2193 | 382 DWTELEM *coeff; |
2138 | 383 struct SubBand *parent; |
384 uint8_t state[/*7*2*/ 7 + 512][32]; | |
385 }SubBand; | |
386 | |
387 typedef struct Plane{ | |
388 int width; | |
389 int height; | |
390 SubBand band[MAX_DECOMPOSITIONS][4]; | |
391 }Plane; | |
392 | |
393 typedef struct SnowContext{ | |
394 // MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX) | |
395 | |
396 AVCodecContext *avctx; | |
2335 | 397 RangeCoder c; |
2138 | 398 DSPContext dsp; |
399 AVFrame input_picture; | |
400 AVFrame current_picture; | |
401 AVFrame last_picture; | |
402 AVFrame mconly_picture; | |
403 // uint8_t q_context[16]; | |
404 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
|
405 uint8_t block_state[128 + 32*128]; |
2138 | 406 int keyframe; |
2199 | 407 int always_reset; |
2138 | 408 int version; |
409 int spatial_decomposition_type; | |
410 int temporal_decomposition_type; | |
411 int spatial_decomposition_count; | |
412 int temporal_decomposition_count; | |
413 DWTELEM *spatial_dwt_buffer; | |
414 int colorspace_type; | |
415 int chroma_h_shift; | |
416 int chroma_v_shift; | |
417 int spatial_scalability; | |
418 int 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
|
419 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
|
420 int lambda2; |
2138 | 421 int mv_scale; |
422 int qbias; | |
423 #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
|
424 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
|
425 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
|
426 int block_max_depth; |
2138 | 427 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
|
428 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
|
429 |
2138 | 430 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX) |
431 }SnowContext; | |
432 | |
2246 | 433 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0 |
2138 | 434 static const uint8_t qexp[8]={ |
435 128, 140, 152, 166, 181, 197, 215, 235 | |
436 // 64, 70, 76, 83, 91, 99, 108, 117 | |
437 // 32, 35, 38, 41, 45, 49, 54, 59 | |
438 // 16, 17, 19, 21, 23, 25, 27, 29 | |
439 // 8, 9, 10, 10, 11, 12, 13, 15 | |
440 }; | |
441 | |
442 static inline int mirror(int v, int m){ | |
443 if (v<0) return -v; | |
444 else if(v>m) return 2*m-v; | |
445 else return v; | |
446 } | |
447 | |
2335 | 448 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
2138 | 449 int i; |
450 | |
451 if(v){ | |
452 const int a= ABS(v); | |
453 const int e= av_log2(a); | |
454 #if 1 | |
455 const int el= FFMIN(e, 10); | |
2335 | 456 put_rac(c, state+0, 0); |
2138 | 457 |
458 for(i=0; i<el; i++){ | |
2335 | 459 put_rac(c, state+1+i, 1); //1..10 |
2138 | 460 } |
461 for(; i<e; i++){ | |
2335 | 462 put_rac(c, state+1+9, 1); //1..10 |
2138 | 463 } |
2335 | 464 put_rac(c, state+1+FFMIN(i,9), 0); |
2138 | 465 |
466 for(i=e-1; i>=el; i--){ | |
2335 | 467 put_rac(c, state+22+9, (a>>i)&1); //22..31 |
2138 | 468 } |
469 for(; i>=0; i--){ | |
2335 | 470 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 471 } |
472 | |
473 if(is_signed) | |
2335 | 474 put_rac(c, state+11 + el, v < 0); //11..21 |
2138 | 475 #else |
476 | |
2335 | 477 put_rac(c, state+0, 0); |
2138 | 478 if(e<=9){ |
479 for(i=0; i<e; i++){ | |
2335 | 480 put_rac(c, state+1+i, 1); //1..10 |
2138 | 481 } |
2335 | 482 put_rac(c, state+1+i, 0); |
2138 | 483 |
484 for(i=e-1; i>=0; i--){ | |
2335 | 485 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 486 } |
487 | |
488 if(is_signed) | |
2335 | 489 put_rac(c, state+11 + e, v < 0); //11..21 |
2138 | 490 }else{ |
491 for(i=0; i<e; i++){ | |
2335 | 492 put_rac(c, state+1+FFMIN(i,9), 1); //1..10 |
2138 | 493 } |
2335 | 494 put_rac(c, state+1+FFMIN(i,9), 0); |
2138 | 495 |
496 for(i=e-1; i>=0; i--){ | |
2335 | 497 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 |
2138 | 498 } |
499 | |
500 if(is_signed) | |
2335 | 501 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21 |
2138 | 502 } |
503 #endif | |
504 }else{ | |
2335 | 505 put_rac(c, state+0, 1); |
2138 | 506 } |
507 } | |
508 | |
2335 | 509 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
510 if(get_rac(c, state+0)) | |
2138 | 511 return 0; |
512 else{ | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
513 int i, e, a; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
514 e= 0; |
2335 | 515 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
|
516 e++; |
2138 | 517 } |
518 | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
519 a= 1; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
520 for(i=e-1; i>=0; i--){ |
2335 | 521 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
|
522 } |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
523 |
2335 | 524 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21 |
2138 | 525 return -a; |
526 else | |
527 return a; | |
528 } | |
529 } | |
530 | |
2335 | 531 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
|
532 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
533 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
|
534 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
535 assert(v>=0); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
536 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
537 |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
538 while(v >= r){ |
2335 | 539 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
|
540 v -= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
541 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
542 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
|
543 } |
2335 | 544 put_rac(c, state+4+log2, 0); |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
545 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
546 for(i=log2-1; i>=0; i--){ |
2335 | 547 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
|
548 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
549 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
550 |
2335 | 551 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
|
552 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
553 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
|
554 int v=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
555 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
556 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
557 |
2335 | 558 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
|
559 v+= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
560 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
561 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
|
562 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
563 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
564 for(i=log2-1; i>=0; i--){ |
2335 | 565 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
|
566 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
567 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
568 return v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
569 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
570 |
2138 | 571 static always_inline void lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){ |
572 const int mirror_left= !highpass; | |
573 const int mirror_right= (width&1) ^ highpass; | |
574 const int w= (width>>1) - 1 + (highpass & width); | |
575 int i; | |
576 | |
577 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) | |
578 if(mirror_left){ | |
579 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); | |
580 dst += dst_step; | |
581 src += src_step; | |
582 } | |
583 | |
584 for(i=0; i<w; i++){ | |
585 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse); | |
586 } | |
587 | |
588 if(mirror_right){ | |
589 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse); | |
590 } | |
591 } | |
592 | |
593 static always_inline void lift5(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){ | |
594 const int mirror_left= !highpass; | |
595 const int mirror_right= (width&1) ^ highpass; | |
596 const int w= (width>>1) - 1 + (highpass & width); | |
597 int i; | |
598 | |
599 if(mirror_left){ | |
600 int r= 3*2*ref[0]; | |
601 r += r>>4; | |
602 r += r>>8; | |
603 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse); | |
604 dst += dst_step; | |
605 src += src_step; | |
606 } | |
607 | |
608 for(i=0; i<w; i++){ | |
609 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]); | |
610 r += r>>4; | |
611 r += r>>8; | |
612 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse); | |
613 } | |
614 | |
615 if(mirror_right){ | |
616 int r= 3*2*ref[w*ref_step]; | |
617 r += r>>4; | |
618 r += r>>8; | |
619 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse); | |
620 } | |
621 } | |
622 | |
623 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
624 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){ |
2138 | 625 int x, i; |
626 | |
627 for(x=start; x<width; x+=2){ | |
628 int64_t sum=0; | |
629 | |
630 for(i=0; i<n; i++){ | |
631 int x2= x + 2*i - n + 1; | |
632 if (x2< 0) x2= -x2; | |
633 else if(x2>=width) x2= 2*width-x2-2; | |
634 sum += coeffs[i]*(int64_t)dst[x2]; | |
635 } | |
636 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift; | |
637 else dst[x] += (sum + (1<<shift)/2)>>shift; | |
638 } | |
639 } | |
640 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
641 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){ |
2138 | 642 int x, y, i; |
643 for(y=start; y<height; y+=2){ | |
644 for(x=0; x<width; x++){ | |
645 int64_t sum=0; | |
646 | |
647 for(i=0; i<n; i++){ | |
648 int y2= y + 2*i - n + 1; | |
649 if (y2< 0) y2= -y2; | |
650 else if(y2>=height) y2= 2*height-y2-2; | |
651 sum += coeffs[i]*(int64_t)dst[x + y2*stride]; | |
652 } | |
653 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift; | |
654 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift; | |
655 } | |
656 } | |
657 } | |
658 | |
659 #define SCALEX 1 | |
660 #define LX0 0 | |
661 #define LX1 1 | |
662 | |
2139 | 663 #if 0 // more accurate 9/7 |
2138 | 664 #define N1 2 |
665 #define SHIFT1 14 | |
666 #define COEFFS1 (int[]){-25987,-25987} | |
667 #define N2 2 | |
668 #define SHIFT2 19 | |
669 #define COEFFS2 (int[]){-27777,-27777} | |
670 #define N3 2 | |
671 #define SHIFT3 15 | |
672 #define COEFFS3 (int[]){28931,28931} | |
673 #define N4 2 | |
674 #define SHIFT4 15 | |
675 #define COEFFS4 (int[]){14533,14533} | |
676 #elif 1 // 13/7 CRF | |
677 #define N1 4 | |
678 #define SHIFT1 4 | |
679 #define COEFFS1 (int[]){1,-9,-9,1} | |
2139 | 680 #define N2 4 |
2138 | 681 #define SHIFT2 4 |
682 #define COEFFS2 (int[]){-1,5,5,-1} | |
683 #define N3 0 | |
684 #define SHIFT3 1 | |
685 #define COEFFS3 NULL | |
686 #define N4 0 | |
687 #define SHIFT4 1 | |
688 #define COEFFS4 NULL | |
689 #elif 1 // 3/5 | |
690 #define LX0 1 | |
691 #define LX1 0 | |
692 #define SCALEX 0.5 | |
693 #define N1 2 | |
694 #define SHIFT1 1 | |
695 #define COEFFS1 (int[]){1,1} | |
696 #define N2 2 | |
697 #define SHIFT2 2 | |
698 #define COEFFS2 (int[]){-1,-1} | |
699 #define N3 0 | |
700 #define SHIFT3 0 | |
701 #define COEFFS3 NULL | |
702 #define N4 0 | |
703 #define SHIFT4 0 | |
704 #define COEFFS4 NULL | |
705 #elif 1 // 11/5 | |
706 #define N1 0 | |
707 #define SHIFT1 1 | |
708 #define COEFFS1 NULL | |
709 #define N2 2 | |
710 #define SHIFT2 2 | |
711 #define COEFFS2 (int[]){-1,-1} | |
712 #define N3 2 | |
713 #define SHIFT3 0 | |
714 #define COEFFS3 (int[]){-1,-1} | |
715 #define N4 4 | |
716 #define SHIFT4 7 | |
717 #define COEFFS4 (int[]){-5,29,29,-5} | |
718 #define SCALEX 4 | |
719 #elif 1 // 9/7 CDF | |
720 #define N1 2 | |
721 #define SHIFT1 7 | |
722 #define COEFFS1 (int[]){-203,-203} | |
723 #define N2 2 | |
724 #define SHIFT2 12 | |
725 #define COEFFS2 (int[]){-217,-217} | |
726 #define N3 2 | |
727 #define SHIFT3 7 | |
728 #define COEFFS3 (int[]){113,113} | |
729 #define N4 2 | |
730 #define SHIFT4 9 | |
731 #define COEFFS4 (int[]){227,227} | |
732 #define SCALEX 1 | |
733 #elif 1 // 7/5 CDF | |
734 #define N1 0 | |
735 #define SHIFT1 1 | |
736 #define COEFFS1 NULL | |
737 #define N2 2 | |
738 #define SHIFT2 2 | |
739 #define COEFFS2 (int[]){-1,-1} | |
740 #define N3 2 | |
741 #define SHIFT3 0 | |
742 #define COEFFS3 (int[]){-1,-1} | |
743 #define N4 2 | |
744 #define SHIFT4 4 | |
745 #define COEFFS4 (int[]){3,3} | |
746 #elif 1 // 9/7 MN | |
747 #define N1 4 | |
748 #define SHIFT1 4 | |
749 #define COEFFS1 (int[]){1,-9,-9,1} | |
750 #define N2 2 | |
751 #define SHIFT2 2 | |
752 #define COEFFS2 (int[]){1,1} | |
753 #define N3 0 | |
754 #define SHIFT3 1 | |
755 #define COEFFS3 NULL | |
756 #define N4 0 | |
757 #define SHIFT4 1 | |
758 #define COEFFS4 NULL | |
759 #else // 13/7 CRF | |
760 #define N1 4 | |
761 #define SHIFT1 4 | |
762 #define COEFFS1 (int[]){1,-9,-9,1} | |
763 #define N2 4 | |
764 #define SHIFT2 4 | |
765 #define COEFFS2 (int[]){-1,5,5,-1} | |
766 #define N3 0 | |
767 #define SHIFT3 1 | |
768 #define COEFFS3 NULL | |
769 #define N4 0 | |
770 #define SHIFT4 1 | |
771 #define COEFFS4 NULL | |
772 #endif | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
773 static void horizontal_decomposeX(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
|
774 DWTELEM temp[width]; |
2138 | 775 const int width2= width>>1; |
776 const int w2= (width+1)>>1; | |
777 int A1,A2,A3,A4, x; | |
778 | |
779 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0); | |
780 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0); | |
781 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0); | |
782 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0); | |
783 | |
784 for(x=0; x<width2; x++){ | |
785 temp[x ]= b[2*x ]; | |
786 temp[x+w2]= b[2*x + 1]; | |
787 } | |
788 if(width&1) | |
789 temp[x ]= b[2*x ]; | |
790 memcpy(b, temp, width*sizeof(int)); | |
791 } | |
792 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
793 static void horizontal_composeX(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
|
794 DWTELEM temp[width]; |
2138 | 795 const int width2= width>>1; |
796 int A1,A2,A3,A4, x; | |
797 const int w2= (width+1)>>1; | |
798 | |
799 memcpy(temp, b, width*sizeof(int)); | |
800 for(x=0; x<width2; x++){ | |
801 b[2*x ]= temp[x ]; | |
802 b[2*x + 1]= temp[x+w2]; | |
803 } | |
804 if(width&1) | |
805 b[2*x ]= temp[x ]; | |
806 | |
807 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1); | |
808 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1); | |
809 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1); | |
810 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1); | |
811 } | |
812 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
813 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){ |
2138 | 814 int x, y; |
815 | |
816 for(y=0; y<height; y++){ | |
817 for(x=0; x<width; x++){ | |
818 buffer[y*stride + x] *= SCALEX; | |
819 } | |
820 } | |
821 | |
822 for(y=0; y<height; y++){ | |
823 horizontal_decomposeX(buffer + y*stride, width); | |
824 } | |
825 | |
826 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0); | |
827 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0); | |
828 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0); | |
829 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0); | |
830 } | |
831 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
832 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){ |
2138 | 833 int x, y; |
834 | |
835 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1); | |
836 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1); | |
837 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1); | |
838 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1); | |
839 | |
840 for(y=0; y<height; y++){ | |
841 horizontal_composeX(buffer + y*stride, width); | |
842 } | |
843 | |
844 for(y=0; y<height; y++){ | |
845 for(x=0; x<width; x++){ | |
846 buffer[y*stride + x] /= SCALEX; | |
847 } | |
848 } | |
849 } | |
850 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
851 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
|
852 DWTELEM temp[width]; |
2138 | 853 const int width2= width>>1; |
854 int A1,A2,A3,A4, x; | |
855 const int w2= (width+1)>>1; | |
856 | |
857 for(x=0; x<width2; x++){ | |
858 temp[x ]= b[2*x ]; | |
859 temp[x+w2]= b[2*x + 1]; | |
860 } | |
861 if(width&1) | |
862 temp[x ]= b[2*x ]; | |
863 #if 0 | |
864 A2= temp[1 ]; | |
865 A4= temp[0 ]; | |
866 A1= temp[0+width2]; | |
867 A1 -= (A2 + A4)>>1; | |
868 A4 += (A1 + 1)>>1; | |
869 b[0+width2] = A1; | |
870 b[0 ] = A4; | |
871 for(x=1; x+1<width2; x+=2){ | |
872 A3= temp[x+width2]; | |
873 A4= temp[x+1 ]; | |
874 A3 -= (A2 + A4)>>1; | |
875 A2 += (A1 + A3 + 2)>>2; | |
876 b[x+width2] = A3; | |
877 b[x ] = A2; | |
878 | |
879 A1= temp[x+1+width2]; | |
880 A2= temp[x+2 ]; | |
881 A1 -= (A2 + A4)>>1; | |
882 A4 += (A1 + A3 + 2)>>2; | |
883 b[x+1+width2] = A1; | |
884 b[x+1 ] = A4; | |
885 } | |
886 A3= temp[width-1]; | |
887 A3 -= A2; | |
888 A2 += (A1 + A3 + 2)>>2; | |
889 b[width -1] = A3; | |
890 b[width2-1] = A2; | |
891 #else | |
892 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0); | |
893 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0); | |
894 #endif | |
895 } | |
896 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
897 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 898 int i; |
899 | |
900 for(i=0; i<width; i++){ | |
901 b1[i] -= (b0[i] + b2[i])>>1; | |
902 } | |
903 } | |
904 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
905 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 906 int i; |
907 | |
908 for(i=0; i<width; i++){ | |
909 b1[i] += (b0[i] + b2[i] + 2)>>2; | |
910 } | |
911 } | |
912 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
913 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 914 int y; |
2138 | 915 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride; |
916 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride; | |
917 | |
918 for(y=-2; y<height; y+=2){ | |
919 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
920 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
921 | |
922 {START_TIMER | |
923 if(b1 <= b3) horizontal_decompose53i(b2, width); | |
924 if(y+2 < height) horizontal_decompose53i(b3, width); | |
925 STOP_TIMER("horizontal_decompose53i")} | |
926 | |
927 {START_TIMER | |
928 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width); | |
929 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width); | |
930 STOP_TIMER("vertical_decompose53i*")} | |
931 | |
932 b0=b2; | |
933 b1=b3; | |
934 } | |
935 } | |
936 | |
937 #define lift5 lift | |
938 #if 1 | |
939 #define W_AM 3 | |
940 #define W_AO 0 | |
941 #define W_AS 1 | |
942 | |
943 #define W_BM 1 | |
944 #define W_BO 8 | |
945 #define W_BS 4 | |
946 | |
947 #undef lift5 | |
948 #define W_CM 9999 | |
949 #define W_CO 2 | |
950 #define W_CS 2 | |
951 | |
952 #define W_DM 15 | |
953 #define W_DO 16 | |
954 #define W_DS 5 | |
955 #elif 0 | |
956 #define W_AM 55 | |
957 #define W_AO 16 | |
958 #define W_AS 5 | |
959 | |
960 #define W_BM 3 | |
961 #define W_BO 32 | |
962 #define W_BS 6 | |
963 | |
964 #define W_CM 127 | |
965 #define W_CO 64 | |
966 #define W_CS 7 | |
967 | |
968 #define W_DM 7 | |
969 #define W_DO 8 | |
970 #define W_DS 4 | |
971 #elif 0 | |
972 #define W_AM 97 | |
973 #define W_AO 32 | |
974 #define W_AS 6 | |
975 | |
976 #define W_BM 63 | |
977 #define W_BO 512 | |
978 #define W_BS 10 | |
979 | |
980 #define W_CM 13 | |
981 #define W_CO 8 | |
982 #define W_CS 4 | |
983 | |
984 #define W_DM 15 | |
985 #define W_DO 16 | |
986 #define W_DS 5 | |
987 | |
988 #else | |
989 | |
990 #define W_AM 203 | |
991 #define W_AO 64 | |
992 #define W_AS 7 | |
993 | |
994 #define W_BM 217 | |
995 #define W_BO 2048 | |
996 #define W_BS 12 | |
997 | |
998 #define W_CM 113 | |
999 #define W_CO 64 | |
1000 #define W_CS 7 | |
1001 | |
1002 #define W_DM 227 | |
1003 #define W_DO 128 | |
1004 #define W_DS 9 | |
1005 #endif | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1006 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
|
1007 DWTELEM temp[width]; |
2138 | 1008 const int w2= (width+1)>>1; |
1009 | |
1010 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0); | |
1011 lift (temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0); | |
1012 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0); | |
1013 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0); | |
1014 } | |
1015 | |
1016 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1017 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1018 int i; |
1019 | |
1020 for(i=0; i<width; i++){ | |
1021 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1022 } | |
1023 } | |
1024 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1025 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1026 int i; |
1027 | |
1028 for(i=0; i<width; i++){ | |
1029 #ifdef lift5 | |
1030 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1031 #else | |
1032 int r= 3*(b0[i] + b2[i]); | |
1033 r+= r>>4; | |
1034 r+= r>>8; | |
1035 b1[i] += (r+W_CO)>>W_CS; | |
1036 #endif | |
1037 } | |
1038 } | |
1039 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1040 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1041 int i; |
1042 | |
1043 for(i=0; i<width; i++){ | |
1044 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; | |
1045 } | |
1046 } | |
1047 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1048 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1049 int i; |
1050 | |
1051 for(i=0; i<width; i++){ | |
1052 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1053 } | |
1054 } | |
1055 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1056 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 1057 int y; |
2138 | 1058 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride; |
1059 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride; | |
1060 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride; | |
1061 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride; | |
1062 | |
1063 for(y=-4; y<height; y+=2){ | |
1064 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
1065 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
1066 | |
1067 {START_TIMER | |
1068 if(b3 <= b5) horizontal_decompose97i(b4, width); | |
1069 if(y+4 < height) horizontal_decompose97i(b5, width); | |
1070 if(width>400){ | |
1071 STOP_TIMER("horizontal_decompose97i") | |
1072 }} | |
1073 | |
1074 {START_TIMER | |
1075 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width); | |
1076 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width); | |
1077 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width); | |
1078 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width); | |
1079 | |
1080 if(width>400){ | |
1081 STOP_TIMER("vertical_decompose97i") | |
1082 }} | |
1083 | |
1084 b0=b2; | |
1085 b1=b3; | |
1086 b2=b4; | |
1087 b3=b5; | |
1088 } | |
1089 } | |
1090 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1091 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1092 int level; |
1093 | |
2164 | 1094 for(level=0; level<decomposition_count; level++){ |
1095 switch(type){ | |
2138 | 1096 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break; |
1097 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break; | |
1098 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break; | |
1099 } | |
1100 } | |
1101 } | |
1102 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1103 static void horizontal_compose53i(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
|
1104 DWTELEM temp[width]; |
2138 | 1105 const int width2= width>>1; |
1106 const int w2= (width+1)>>1; | |
1107 int A1,A2,A3,A4, x; | |
1108 | |
1109 #if 0 | |
1110 A2= temp[1 ]; | |
1111 A4= temp[0 ]; | |
1112 A1= temp[0+width2]; | |
1113 A1 -= (A2 + A4)>>1; | |
1114 A4 += (A1 + 1)>>1; | |
1115 b[0+width2] = A1; | |
1116 b[0 ] = A4; | |
1117 for(x=1; x+1<width2; x+=2){ | |
1118 A3= temp[x+width2]; | |
1119 A4= temp[x+1 ]; | |
1120 A3 -= (A2 + A4)>>1; | |
1121 A2 += (A1 + A3 + 2)>>2; | |
1122 b[x+width2] = A3; | |
1123 b[x ] = A2; | |
1124 | |
1125 A1= temp[x+1+width2]; | |
1126 A2= temp[x+2 ]; | |
1127 A1 -= (A2 + A4)>>1; | |
1128 A4 += (A1 + A3 + 2)>>2; | |
1129 b[x+1+width2] = A1; | |
1130 b[x+1 ] = A4; | |
1131 } | |
1132 A3= temp[width-1]; | |
1133 A3 -= A2; | |
1134 A2 += (A1 + A3 + 2)>>2; | |
1135 b[width -1] = A3; | |
1136 b[width2-1] = A2; | |
1137 #else | |
1138 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1); | |
1139 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1); | |
1140 #endif | |
1141 for(x=0; x<width2; x++){ | |
1142 b[2*x ]= temp[x ]; | |
1143 b[2*x + 1]= temp[x+w2]; | |
1144 } | |
1145 if(width&1) | |
1146 b[2*x ]= temp[x ]; | |
1147 } | |
1148 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1149 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1150 int i; |
1151 | |
1152 for(i=0; i<width; i++){ | |
1153 b1[i] += (b0[i] + b2[i])>>1; | |
1154 } | |
1155 } | |
1156 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1157 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1158 int i; |
1159 | |
1160 for(i=0; i<width; i++){ | |
1161 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
1162 } | |
1163 } | |
1164 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1165 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 1166 int y; |
2138 | 1167 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride; |
1168 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride; | |
1169 | |
1170 for(y=-1; y<=height; y+=2){ | |
1171 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
1172 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
1173 | |
1174 {START_TIMER | |
1175 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width); | |
1176 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width); | |
1177 STOP_TIMER("vertical_compose53i*")} | |
1178 | |
1179 {START_TIMER | |
1180 if(y-1 >= 0) horizontal_compose53i(b0, width); | |
1181 if(b0 <= b2) horizontal_compose53i(b1, width); | |
1182 STOP_TIMER("horizontal_compose53i")} | |
1183 | |
1184 b0=b2; | |
1185 b1=b3; | |
1186 } | |
1187 } | |
1188 | |
1189 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1190 static void horizontal_compose97i(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
|
1191 DWTELEM temp[width]; |
2138 | 1192 const int w2= (width+1)>>1; |
1193 | |
1194 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1); | |
1195 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1); | |
1196 lift (b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1); | |
1197 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1); | |
1198 } | |
1199 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1200 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1201 int i; |
1202 | |
1203 for(i=0; i<width; i++){ | |
1204 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1205 } | |
1206 } | |
1207 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1208 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1209 int i; |
1210 | |
1211 for(i=0; i<width; i++){ | |
1212 #ifdef lift5 | |
1213 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1214 #else | |
1215 int r= 3*(b0[i] + b2[i]); | |
1216 r+= r>>4; | |
1217 r+= r>>8; | |
1218 b1[i] -= (r+W_CO)>>W_CS; | |
1219 #endif | |
1220 } | |
1221 } | |
1222 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1223 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1224 int i; |
1225 | |
1226 for(i=0; i<width; i++){ | |
1227 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; | |
1228 } | |
1229 } | |
1230 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1231 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 1232 int i; |
1233 | |
1234 for(i=0; i<width; i++){ | |
1235 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1236 } | |
1237 } | |
1238 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1239 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 1240 int y; |
2138 | 1241 DWTELEM *b0= buffer + mirror(-3-1, height-1)*stride; |
1242 DWTELEM *b1= buffer + mirror(-3 , height-1)*stride; | |
1243 DWTELEM *b2= buffer + mirror(-3+1, height-1)*stride; | |
1244 DWTELEM *b3= buffer + mirror(-3+2, height-1)*stride; | |
1245 | |
1246 for(y=-3; y<=height; y+=2){ | |
1247 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
1248 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
1249 | |
1250 if(stride == width && y+4 < height && 0){ | |
1251 int x; | |
1252 for(x=0; x<width/2; x++) | |
1253 b5[x] += 64*2; | |
1254 for(; x<width; x++) | |
1255 b5[x] += 169*2; | |
1256 } | |
1257 | |
1258 {START_TIMER | |
1259 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width); | |
1260 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width); | |
1261 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width); | |
1262 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width); | |
1263 if(width>400){ | |
1264 STOP_TIMER("vertical_compose97i")}} | |
1265 | |
1266 {START_TIMER | |
1267 if(y-1>= 0) horizontal_compose97i(b0, width); | |
1268 if(b0 <= b2) horizontal_compose97i(b1, width); | |
1269 if(width>400 && b0 <= b2){ | |
1270 STOP_TIMER("horizontal_compose97i")}} | |
1271 | |
1272 b0=b2; | |
1273 b1=b3; | |
1274 b2=b4; | |
1275 b3=b5; | |
1276 } | |
1277 } | |
1278 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1279 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1280 int level; |
1281 | |
2164 | 1282 for(level=decomposition_count-1; level>=0; level--){ |
1283 switch(type){ | |
2138 | 1284 case 0: spatial_compose97i(buffer, width>>level, height>>level, stride<<level); break; |
1285 case 1: spatial_compose53i(buffer, width>>level, height>>level, stride<<level); break; | |
1286 case 2: spatial_composeX (buffer, width>>level, height>>level, stride<<level); break; | |
1287 } | |
1288 } | |
1289 } | |
1290 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1291 static void encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1292 const int w= b->width; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1293 const int h= b->height; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1294 int x, y; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1295 |
2138 | 1296 if(1){ |
1297 int run=0; | |
2149 | 1298 int runs[w*h]; |
2138 | 1299 int run_index=0; |
1300 | |
1301 for(y=0; y<h; y++){ | |
1302 for(x=0; x<w; x++){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1303 int v, p=0; |
2144 | 1304 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
2149 | 1305 v= src[x + y*stride]; |
2138 | 1306 |
1307 if(y){ | |
2149 | 1308 t= src[x + (y-1)*stride]; |
2138 | 1309 if(x){ |
2149 | 1310 lt= src[x - 1 + (y-1)*stride]; |
2138 | 1311 } |
1312 if(x + 1 < w){ | |
2149 | 1313 rt= src[x + 1 + (y-1)*stride]; |
2138 | 1314 } |
1315 } | |
1316 if(x){ | |
2149 | 1317 l= src[x - 1 + y*stride]; |
2144 | 1318 /*if(x > 1){ |
1319 if(orientation==1) ll= src[y + (x-2)*stride]; | |
1320 else ll= src[x - 2 + y*stride]; | |
2138 | 1321 }*/ |
1322 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1323 if(parent){ |
2149 | 1324 int px= x>>1; |
1325 int py= y>>1; | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1326 if(px<b->parent->width && py<b->parent->height) |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1327 p= parent[px + py*2*stride]; |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1328 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1329 if(!(/*ll|*/l|lt|t|rt|p)){ |
2138 | 1330 if(v){ |
1331 runs[run_index++]= run; | |
1332 run=0; | |
1333 }else{ | |
1334 run++; | |
1335 } | |
1336 } | |
1337 } | |
1338 } | |
1339 runs[run_index++]= run; | |
1340 run_index=0; | |
1341 run= runs[run_index++]; | |
1342 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1343 put_symbol2(&s->c, b->state[1], run, 3); |
2138 | 1344 |
1345 for(y=0; y<h; y++){ | |
1346 for(x=0; x<w; x++){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1347 int v, p=0; |
2144 | 1348 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
2149 | 1349 v= src[x + y*stride]; |
2138 | 1350 |
1351 if(y){ | |
2149 | 1352 t= src[x + (y-1)*stride]; |
2138 | 1353 if(x){ |
2149 | 1354 lt= src[x - 1 + (y-1)*stride]; |
2138 | 1355 } |
1356 if(x + 1 < w){ | |
2149 | 1357 rt= src[x + 1 + (y-1)*stride]; |
2138 | 1358 } |
1359 } | |
1360 if(x){ | |
2149 | 1361 l= src[x - 1 + y*stride]; |
2144 | 1362 /*if(x > 1){ |
1363 if(orientation==1) ll= src[y + (x-2)*stride]; | |
1364 else ll= src[x - 2 + y*stride]; | |
2138 | 1365 }*/ |
1366 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1367 if(parent){ |
2149 | 1368 int px= x>>1; |
1369 int py= y>>1; | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1370 if(px<b->parent->width && py<b->parent->height) |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1371 p= parent[px + py*2*stride]; |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1372 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1373 if(/*ll|*/l|lt|t|rt|p){ |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1374 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1375 |
2335 | 1376 put_rac(&s->c, &b->state[0][context], !!v); |
2138 | 1377 }else{ |
1378 if(!run){ | |
1379 run= runs[run_index++]; | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1380 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1381 put_symbol2(&s->c, b->state[1], run, 3); |
2138 | 1382 assert(v); |
1383 }else{ | |
1384 run--; | |
1385 assert(!v); | |
1386 } | |
1387 } | |
1388 if(v){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1389 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1390 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
1391 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4); |
2335 | 1392 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0); |
2138 | 1393 } |
1394 } | |
1395 } | |
1396 } | |
1397 } | |
1398 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1399 static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1400 // encode_subband_qtree(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1401 // encode_subband_z0run(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1402 encode_subband_c0run(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1403 // encode_subband_dzr(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1404 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1405 |
2149 | 1406 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
2138 | 1407 const int w= b->width; |
1408 const int h= b->height; | |
1409 int x,y; | |
2195 | 1410 const int qlog= clip(s->qlog + b->qlog, 0, 128); |
1411 int qmul= qexp[qlog&7]<<(qlog>>3); | |
1412 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; | |
1413 | |
2197 | 1414 START_TIMER |
1415 | |
2195 | 1416 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){ |
1417 qadd= 0; | |
1418 qmul= 1<<QEXPSHIFT; | |
1419 } | |
2138 | 1420 |
1421 if(1){ | |
1422 int run; | |
2192 | 1423 int index=0; |
1424 int prev_index=-1; | |
1425 int prev2_index=0; | |
1426 int parent_index= 0; | |
1427 int prev_parent_index= 0; | |
1428 | |
2138 | 1429 for(y=0; y<b->height; y++) |
1430 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM)); | |
1431 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1432 run= get_symbol2(&s->c, b->state[1], 3); |
2138 | 1433 for(y=0; y<h; y++){ |
2193 | 1434 int v=0; |
1435 int lt=0, t=0, rt=0; | |
1436 | |
2194 | 1437 if(y && b->x[prev_index] == 0){ |
1438 rt= b->coeff[prev_index]; | |
2193 | 1439 } |
2138 | 1440 for(x=0; x<w; x++){ |
2193 | 1441 int p=0; |
1442 const int l= v; | |
1443 | |
1444 lt= t; t= rt; | |
1445 | |
2194 | 1446 if(y){ |
2195 | 1447 if(b->x[prev_index] <= x) |
2194 | 1448 prev_index++; |
1449 if(b->x[prev_index] == x + 1) | |
1450 rt= b->coeff[prev_index]; | |
1451 else | |
1452 rt=0; | |
1453 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1454 if(parent){ |
2192 | 1455 if(x>>1 > b->parent->x[parent_index]){ |
1456 parent_index++; | |
1457 } | |
2194 | 1458 if(x>>1 == b->parent->x[parent_index]){ |
1459 p= b->parent->coeff[parent_index]; | |
1460 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1461 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1462 if(/*ll|*/l|lt|t|rt|p){ |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1463 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1464 |
2335 | 1465 v=get_rac(&s->c, &b->state[0][context]); |
2138 | 1466 }else{ |
1467 if(!run){ | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1468 run= get_symbol2(&s->c, b->state[1], 3); |
2138 | 1469 v=1; |
1470 }else{ | |
1471 run--; | |
1472 v=0; | |
2191 | 1473 |
2192 | 1474 if(y && parent){ |
1475 int max_run; | |
1476 | |
1477 max_run= FFMIN(run, b->x[prev_index] - x - 2); | |
1478 max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1); | |
1479 x+= max_run; | |
1480 run-= max_run; | |
2191 | 1481 } |
2138 | 1482 } |
1483 } | |
1484 if(v){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1485 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
1486 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1; |
2335 | 1487 if(get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])){ |
2195 | 1488 src[x + y*stride]=-(( v*qmul + qadd)>>(QEXPSHIFT)); |
2138 | 1489 v= -v; |
2195 | 1490 }else{ |
1491 src[x + y*stride]= (( v*qmul + qadd)>>(QEXPSHIFT)); | |
1492 } | |
2194 | 1493 b->x[index]=x; //FIXME interleave x/coeff |
1494 b->coeff[index++]= v; | |
2192 | 1495 } |
1496 } | |
1497 b->x[index++]= w+1; //end marker | |
1498 prev_index= prev2_index; | |
1499 prev2_index= index; | |
1500 | |
1501 if(parent){ | |
1502 while(b->parent->x[parent_index] != b->parent->width+1) | |
1503 parent_index++; | |
1504 parent_index++; | |
1505 if(y&1){ | |
1506 prev_parent_index= parent_index; | |
1507 }else{ | |
1508 parent_index= prev_parent_index; | |
2138 | 1509 } |
1510 } | |
1511 } | |
2192 | 1512 b->x[index++]= w+1; //end marker |
2191 | 1513 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){ |
2138 | 1514 STOP_TIMER("decode_subband") |
1515 } | |
1516 | |
1517 return; | |
1518 } | |
1519 } | |
1520 | |
1521 static void reset_contexts(SnowContext *s){ | |
1522 int plane_index, level, orientation; | |
1523 | |
2199 | 1524 for(plane_index=0; plane_index<3; plane_index++){ |
2138 | 1525 for(level=0; level<s->spatial_decomposition_count; level++){ |
1526 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
2335 | 1527 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state)); |
2138 | 1528 } |
1529 } | |
1530 } | |
2335 | 1531 memset(s->header_state, MID_STATE, sizeof(s->header_state)); |
1532 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
|
1533 } |
70b27300a496
quad 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 |
70b27300a496
quad 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 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
|
1536 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
|
1537 int h= -((-s->avctx->height)>>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
|
1538 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1539 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
|
1540 s->b_height= h; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1541 |
70b27300a496
quad 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 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
|
1543 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
|
1544 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1545 |
2335 | 1546 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){ |
1547 uint8_t *bytestream= d->bytestream; | |
1548 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
|
1549 *d= *s; |
2335 | 1550 d->bytestream= bytestream; |
1551 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
|
1552 } |
70b27300a496
quad 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 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1554 //near copy & paste from dsputil, FIXME |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1555 static int pix_sum(uint8_t * pix, int line_size, int 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
|
1556 { |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1557 int s, i, 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
|
1558 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1559 s = 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
|
1560 for (i = 0; i < 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
|
1561 for (j = 0; j < 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
|
1562 s += pix[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
|
1563 pix ++; |
70b27300a496
quad 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 } |
70b27300a496
quad 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 pix += line_size - 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
|
1566 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1567 return 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
|
1568 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1569 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1570 //near copy & paste from dsputil, FIXME |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1571 static int pix_norm1(uint8_t * pix, int line_size, int 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
|
1572 { |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1573 int s, i, 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
|
1574 uint32_t *sq = squareTbl + 256; |
70b27300a496
quad 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 |
70b27300a496
quad 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 s = 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 for (i = 0; i < 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
|
1578 for (j = 0; j < 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
|
1579 s += sq[pix[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
|
1580 pix ++; |
70b27300a496
quad 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 pix += line_size - 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
|
1583 } |
70b27300a496
quad 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 return 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
|
1585 } |
70b27300a496
quad 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 static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int 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
|
1588 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
|
1589 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
|
1590 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
|
1591 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
|
1592 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
|
1593 int i,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
|
1594 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1595 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
|
1596 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
|
1597 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
|
1598 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
|
1599 block.my= my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1600 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
|
1601 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
|
1602 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1603 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
|
1604 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
|
1605 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
|
1606 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1607 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1608 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1609 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1610 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
|
1611 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
|
1612 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
|
1613 ((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
|
1614 ((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
|
1615 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1616 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
|
1617 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
|
1618 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
|
1619 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
|
1620 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1621 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
|
1622 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1623 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1624 //FIXME copy&paste |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1625 #define P_LEFT P[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
|
1626 #define P_TOP P[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
|
1627 #define P_TOPRIGHT P[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
|
1628 #define P_MEDIAN P[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
|
1629 #define P_MV1 P[9] |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1630 #define FLAG_QPEL 1 //must be 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
|
1631 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1632 static int encode_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
|
1633 uint8_t p_buffer[1024]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1634 uint8_t i_buffer[1024]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1635 uint8_t p_state[sizeof(s->block_state)]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1636 uint8_t i_state[sizeof(s->block_state)]; |
2335 | 1637 RangeCoder pc, ic; |
1638 uint8_t *pbbak= s->c.bytestream; | |
1639 uint8_t *pbbak_start= s->c.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
|
1640 int score, score2, iscore, i_len, p_len, block_s, sum; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1641 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
|
1642 const int h= s->b_height << 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
|
1643 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
|
1644 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
|
1645 const int block_w= 1<<(LOG2_MB_SIZE - 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
|
1646 static BlockNode null_block= { //FIXME add border maybe |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1647 .color= {128,128,128}, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1648 .mx= 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
|
1649 .my= 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
|
1650 .type= 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
|
1651 .level= 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
|
1652 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1653 int trx= (x+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
|
1654 int try= (y+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
|
1655 BlockNode *left = x ? &s->block[index-1] : &null_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
|
1656 BlockNode *top = y ? &s->block[index-w] : &null_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
|
1657 BlockNode *right = trx<w ? &s->block[index+1] : &null_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
|
1658 BlockNode *bottom= try<h ? &s->block[index+w] : &null_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
|
1659 BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1660 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1661 int pl = 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
|
1662 int pcb= 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
|
1663 int pcr= left->color[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
|
1664 int pmx= mid_pred(left->mx, top->mx, tr->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
|
1665 int pmy= mid_pred(left->my, top->my, tr->my); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1666 int mx=0, my=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
|
1667 int l,cr,cb, 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
|
1668 const int stride= s->current_picture.linesize[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
|
1669 const int uvstride= s->current_picture.linesize[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
|
1670 const int instride= s->input_picture.linesize[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
|
1671 const int uvinstride= s->input_picture.linesize[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
|
1672 uint8_t *new_l = s->input_picture.data[0] + (x + y* instride)*block_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
|
1673 uint8_t *new_cb= s->input_picture.data[1] + (x + y*uvinstride)*block_w/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
|
1674 uint8_t *new_cr= s->input_picture.data[2] + (x + y*uvinstride)*block_w/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
|
1675 uint8_t current_mb[3][stride*block_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
|
1676 uint8_t *current_data[3]= {¤t_mb[0][0], ¤t_mb[1][0], ¤t_mb[2][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
|
1677 int P[10][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
|
1678 int16_t last_mv[3][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
|
1679 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1680 const int shift= 1+qpel; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1681 MotionEstContext *c= &s->m.me; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1682 int mx_context= av_log2(2*ABS(left->mx - top->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
|
1683 int my_context= av_log2(2*ABS(left->my - top->my)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1684 int s_context= 2*left->level + 2*top->level + tl->level + tr->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
|
1685 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1686 assert(sizeof(s->block_state) >= 256); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1687 if(s->keyframe){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1688 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1689 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
|
1690 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1691 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1692 //FIXME optimize |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1693 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
|
1694 memcpy(¤t_mb[0][0] + stride*i, new_l + instride*i, block_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
|
1695 for(i=0; i<block_w>>1; 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
|
1696 memcpy(¤t_mb[1][0] + uvstride*i, new_cb + uvinstride*i, block_w>>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
|
1697 for(i=0; i<block_w>>1; 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
|
1698 memcpy(¤t_mb[2][0] + uvstride*i, new_cr + uvinstride*i, block_w>>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
|
1699 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1700 // clip predictors / edge ? |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1701 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1702 P_LEFT[0]= left->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
|
1703 P_LEFT[1]= left->my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1704 P_TOP [0]= top->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
|
1705 P_TOP [1]= top->my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1706 P_TOPRIGHT[0]= tr->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
|
1707 P_TOPRIGHT[1]= tr->my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1708 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1709 last_mv[0][0]= s->block[index].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
|
1710 last_mv[0][1]= s->block[index].my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1711 last_mv[1][0]= right->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
|
1712 last_mv[1][1]= right->my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1713 last_mv[2][0]= bottom->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
|
1714 last_mv[2][1]= bottom->my; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1715 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1716 s->m.mb_stride=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
|
1717 s->m.mb_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
|
1718 s->m.mb_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
|
1719 s->m.me.skip= 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
|
1720 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1721 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*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
|
1722 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1723 assert(s->m.me. stride == stride); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1724 assert(s->m.me.uvstride == uvstride); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1725 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1726 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1727 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1728 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1729 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1730 |
2206 | 1731 c->xmin = - x*block_w - 16+2; |
1732 c->ymin = - y*block_w - 16+2; | |
1733 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2; | |
1734 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-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
|
1735 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1736 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<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
|
1737 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<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
|
1738 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<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
|
1739 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<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
|
1740 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<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
|
1741 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1742 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<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
|
1743 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1744 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[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
|
1745 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[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
|
1746 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1747 if (!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
|
1748 c->pred_x= P_LEFT[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
|
1749 c->pred_y= P_LEFT[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
|
1750 } 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
|
1751 c->pred_x = P_MEDIAN[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
|
1752 c->pred_y = P_MEDIAN[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
|
1753 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1754 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1755 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1756 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_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
|
1757 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1758 assert(mx >= c->xmin); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1759 assert(mx <= c->xmax); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1760 assert(my >= c->ymin); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1761 assert(my <= c->ymax); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1762 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1763 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_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
|
1764 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 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
|
1765 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1766 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1767 // subpel search |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1768 pc= s->c; |
2335 | 1769 pc.bytestream_start= |
1770 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo | |
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
|
1771 memcpy(p_state, s->block_state, sizeof(s->block_state)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1772 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1773 if(level!=s->block_max_depth) |
2335 | 1774 put_rac(&pc, &p_state[4 + s_context], 1); |
1775 put_rac(&pc, &p_state[1 + left->type + top->type], 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
|
1776 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 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
|
1777 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1); |
2335 | 1778 p_len= pc.bytestream - pc.bytestream_start; |
1779 score += (s->lambda2*(p_len*8 | |
1780 + (pc.outstanding_count - s->c.outstanding_count)*8 | |
1781 + (-av_log2(pc.range) + av_log2(s->c.range)) | |
1782 ))>>FF_LAMBDA_SHIFT; | |
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
|
1783 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1784 block_s= block_w*block_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
|
1785 sum = pix_sum(¤t_mb[0][0], stride, block_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
|
1786 l= (sum + block_s/2)/block_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
|
1787 iscore = pix_norm1(¤t_mb[0][0], stride, block_w) - 2*l*sum + l*l*block_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
|
1788 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1789 block_s= block_w*block_w>>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
|
1790 sum = pix_sum(¤t_mb[1][0], uvstride, block_w>>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
|
1791 cb= (sum + block_s/2)/block_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
|
1792 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_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
|
1793 sum = pix_sum(¤t_mb[2][0], uvstride, block_w>>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
|
1794 cr= (sum + block_s/2)/block_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
|
1795 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_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
|
1796 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1797 ic= s->c; |
2335 | 1798 ic.bytestream_start= |
1799 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo | |
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
|
1800 memcpy(i_state, s->block_state, sizeof(s->block_state)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1801 if(level!=s->block_max_depth) |
2335 | 1802 put_rac(&ic, &i_state[4 + s_context], 1); |
1803 put_rac(&ic, &i_state[1 + left->type + top->type], 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
|
1804 put_symbol(&ic, &i_state[32], l-pl , 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
|
1805 put_symbol(&ic, &i_state[64], cb-pcb, 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
|
1806 put_symbol(&ic, &i_state[96], cr-pcr, 1); |
2335 | 1807 i_len= ic.bytestream - ic.bytestream_start; |
1808 iscore += (s->lambda2*(i_len*8 | |
1809 + (ic.outstanding_count - s->c.outstanding_count)*8 | |
1810 + (-av_log2(ic.range) + av_log2(s->c.range)) | |
1811 ))>>FF_LAMBDA_SHIFT; | |
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
|
1812 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1813 // assert(score==256*256*256*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
|
1814 assert(iscore < 255*255*256 + s->lambda2*10); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1815 assert(iscore >= 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
|
1816 assert(l>=0 && l<=255); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1817 assert(pl>=0 && pl<=255); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1818 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1819 if(level==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
|
1820 int varc= iscore >> 8; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1821 int vard= score >> 8; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1822 if (vard <= 64 || vard < varc) |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1823 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1824 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
|
1825 c->scene_change_score+= s->m.qscale; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1826 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1827 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1828 if(level!=s->block_max_depth){ |
2335 | 1829 put_rac(&s->c, &s->block_state[4 + s_context], 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
|
1830 score2 = encode_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
|
1831 score2+= encode_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
|
1832 score2+= encode_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
|
1833 score2+= encode_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
|
1834 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1835 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1836 if(score2 < score && score2 < iscore) |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1837 return score2; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1838 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1839 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1840 if(iscore < score){ |
2335 | 1841 memcpy(pbbak, i_buffer, i_len); |
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
|
1842 s->c= ic; |
2335 | 1843 s->c.bytestream_start= pbbak_start; |
1844 s->c.bytestream= pbbak + i_len; | |
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
|
1845 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1846 memcpy(s->block_state, i_state, sizeof(s->block_state)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1847 return iscore; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1848 }else{ |
2335 | 1849 memcpy(pbbak, p_buffer, p_len); |
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
|
1850 s->c= pc; |
2335 | 1851 s->c.bytestream_start= pbbak_start; |
1852 s->c.bytestream= pbbak + p_len; | |
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
|
1853 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 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
|
1854 memcpy(s->block_state, p_state, sizeof(s->block_state)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1855 return score; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1856 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1857 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1858 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1859 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
|
1860 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
|
1861 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
|
1862 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
|
1863 static BlockNode null_block= { //FIXME add border maybe |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1864 .color= {128,128,128}, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1865 .mx= 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
|
1866 .my= 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
|
1867 .type= 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
|
1868 .level= 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
|
1869 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1870 int trx= (x+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
|
1871 BlockNode *left = x ? &s->block[index-1] : &null_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
|
1872 BlockNode *top = y ? &s->block[index-w] : &null_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
|
1873 BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1874 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1875 int s_context= 2*left->level + 2*top->level + tl->level + tr->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
|
1876 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1877 if(s->keyframe){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1878 set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, BLOCK_INTRA); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1879 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
|
1880 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1881 |
2335 | 1882 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){ |
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
|
1883 int 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
|
1884 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
|
1885 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
|
1886 int cr= left->color[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
|
1887 int mx= mid_pred(left->mx, top->mx, tr->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
|
1888 int my= mid_pred(left->my, top->my, tr->my); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1889 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->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
|
1890 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1891 |
2335 | 1892 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
|
1893 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1894 if(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
|
1895 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
|
1896 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
|
1897 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
|
1898 }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
|
1899 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 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
|
1900 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 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
|
1901 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1902 set_blocks(s, level, x, y, l, cb, cr, mx, my, 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
|
1903 }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
|
1904 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
|
1905 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
|
1906 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
|
1907 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
|
1908 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1909 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1910 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1911 static void encode_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
|
1912 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
|
1913 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
|
1914 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
|
1915 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1916 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
|
1917 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
|
1918 encode_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
|
1919 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1920 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1921 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1922 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1923 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
|
1924 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
|
1925 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
|
1926 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
|
1927 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1928 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
|
1929 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
|
1930 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
|
1931 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1932 } |
2138 | 1933 } |
1934 | |
1935 static void mc_block(uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int b_w, int b_h, int dx, int dy){ | |
1936 int x, y; | |
2221 | 1937 START_TIMER |
2138 | 1938 for(y=0; y < b_h+5; y++){ |
1939 for(x=0; x < b_w; x++){ | |
2221 | 1940 int a0= src[x ]; |
1941 int a1= src[x + 1]; | |
1942 int a2= src[x + 2]; | |
1943 int a3= src[x + 3]; | |
1944 int a4= src[x + 4]; | |
1945 int a5= src[x + 5]; | |
2138 | 1946 // int am= 9*(a1+a2) - (a0+a3); |
1947 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); | |
1948 // int am= 18*(a2+a3) - 2*(a1+a4); | |
1949 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3; | |
1950 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3; | |
1951 | |
1952 // if(b_w==16) am= 8*(a1+a2); | |
1953 | |
2221 | 1954 if(dx<8) tmp[x]= (32*a2*( 8-dx) + am* dx + 128)>>8; |
1955 else tmp[x]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8; | |
2138 | 1956 |
1957 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6; | |
1958 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6; | |
1959 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6; | |
1960 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/ | |
1961 } | |
2221 | 1962 tmp += stride; |
1963 src += stride; | |
2138 | 1964 } |
2221 | 1965 tmp -= (b_h+5)*stride; |
1966 | |
2138 | 1967 for(y=0; y < b_h; y++){ |
1968 for(x=0; x < b_w; x++){ | |
2221 | 1969 int a0= tmp[x + 0*stride]; |
1970 int a1= tmp[x + 1*stride]; | |
1971 int a2= tmp[x + 2*stride]; | |
1972 int a3= tmp[x + 3*stride]; | |
1973 int a4= tmp[x + 4*stride]; | |
1974 int a5= tmp[x + 5*stride]; | |
2138 | 1975 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); |
1976 // int am= 18*(a2+a3) - 2*(a1+a4); | |
1977 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3; | |
1978 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/ | |
1979 | |
1980 // if(b_w==16) am= 8*(a1+a2); | |
1981 | |
2221 | 1982 if(dy<8) dst[x]= (32*a2*( 8-dy) + am* dy + 128)>>8; |
1983 else dst[x]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8; | |
2138 | 1984 |
1985 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6; | |
1986 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6; | |
1987 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6; | |
1988 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/ | |
1989 } | |
2221 | 1990 dst += stride; |
1991 tmp += stride; | |
2138 | 1992 } |
2221 | 1993 STOP_TIMER("mc_block") |
2138 | 1994 } |
1995 | |
1996 #define mca(dx,dy,b_w)\ | |
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1997 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\ |
2138 | 1998 uint8_t tmp[stride*(b_w+5)];\ |
1999 assert(h==b_w);\ | |
2000 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\ | |
2001 } | |
2002 | |
2003 mca( 0, 0,16) | |
2004 mca( 8, 0,16) | |
2005 mca( 0, 8,16) | |
2006 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
|
2007 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
|
2008 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
|
2009 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
|
2010 mca( 8, 8,8) |
2138 | 2011 |
2206 | 2012 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ |
2013 if(block->type){ | |
2014 int x, y; | |
2015 const int color= block->color[plane_index]; | |
2138 | 2016 for(y=0; y < b_h; y++){ |
2017 for(x=0; x < b_w; x++){ | |
2206 | 2018 dst[x + y*stride]= color; |
2138 | 2019 } |
2020 } | |
2021 }else{ | |
2206 | 2022 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale; |
2023 int mx= block->mx*scale; | |
2024 int my= block->my*scale; | |
2223 | 2025 const int dx= mx&15; |
2026 const int dy= my&15; | |
2206 | 2027 sx += (mx>>4) - 2; |
2028 sy += (my>>4) - 2; | |
2029 src += sx + sy*stride; | |
2030 if( (unsigned)sx >= w - b_w - 4 | |
2031 || (unsigned)sy >= h - b_h - 4){ | |
2032 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h); | |
2033 src= tmp + MB_SIZE; | |
2138 | 2034 } |
2223 | 2035 if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16)) |
2036 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy); | |
2037 else | |
2038 s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride); | |
2138 | 2039 } |
2040 } | |
2041 | |
2206 | 2042 static always_inline int same_block(BlockNode *a, BlockNode *b){ |
2043 return !((a->mx - b->mx) | (a->my - b->my) | a->type | b->type); | |
2044 } | |
2045 | |
2046 //FIXME name clenup (b_w, block_w, b_width stuff) | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2047 static always_inline void add_yblock(SnowContext *s, DWTELEM *dst, uint8_t *dst8, uint8_t *src, 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 plane_index){ |
2206 | 2048 const int b_width = s->b_width << s->block_max_depth; |
2049 const int b_height= s->b_height << s->block_max_depth; | |
2050 const int b_stride= b_width; | |
2051 BlockNode *lt= &s->block[b_x + b_y*b_stride]; | |
2052 BlockNode *rt= lt+1; | |
2053 BlockNode *lb= lt+b_stride; | |
2054 BlockNode *rb= lb+1; | |
2055 uint8_t *block[4]; | |
2056 uint8_t tmp[src_stride*(b_h+5)]; //FIXME align | |
2057 int x,y; | |
2058 | |
2059 if(b_x<0){ | |
2060 lt= rt; | |
2061 lb= rb; | |
2062 }else if(b_x + 1 >= b_width){ | |
2063 rt= lt; | |
2064 rb= lb; | |
2065 } | |
2066 if(b_y<0){ | |
2067 lt= lb; | |
2068 rt= rb; | |
2069 }else if(b_y + 1 >= b_height){ | |
2070 lb= lt; | |
2071 rb= rt; | |
2072 } | |
2073 | |
2074 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16 | |
2075 obmc -= src_x; | |
2076 b_w += src_x; | |
2077 src_x=0; | |
2078 }else if(src_x + b_w > w){ | |
2079 b_w = w - src_x; | |
2080 } | |
2081 if(src_y<0){ | |
2082 obmc -= src_y*obmc_stride; | |
2083 b_h += src_y; | |
2084 src_y=0; | |
2085 }else if(src_y + b_h> h){ | |
2086 b_h = h - src_y; | |
2087 } | |
2088 | |
2089 if(b_w<=0 || b_h<=0) return; | |
2090 | |
2091 assert(src_stride > 7*MB_SIZE); | |
2092 dst += src_x + src_y*dst_stride; | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2093 dst8+= src_x + src_y*src_stride; |
2206 | 2094 // src += src_x + src_y*src_stride; |
2095 | |
2096 block[0]= tmp+3*MB_SIZE; | |
2097 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h); | |
2098 | |
2099 if(same_block(lt, rt)){ | |
2100 block[1]= block[0]; | |
2101 }else{ | |
2102 block[1]= tmp + 4*MB_SIZE; | |
2103 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h); | |
2104 } | |
2105 | |
2106 if(same_block(lt, lb)){ | |
2107 block[2]= block[0]; | |
2108 }else if(same_block(rt, lb)){ | |
2109 block[2]= block[1]; | |
2110 }else{ | |
2111 block[2]= tmp+5*MB_SIZE; | |
2112 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h); | |
2113 } | |
2114 | |
2115 if(same_block(lt, rb) ){ | |
2116 block[3]= block[0]; | |
2117 }else if(same_block(rt, rb)){ | |
2118 block[3]= block[1]; | |
2119 }else if(same_block(lb, rb)){ | |
2120 block[3]= block[2]; | |
2121 }else{ | |
2122 block[3]= tmp+6*MB_SIZE; | |
2123 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h); | |
2124 } | |
2125 #if 0 | |
2126 for(y=0; y<b_h; y++){ | |
2127 for(x=0; x<b_w; x++){ | |
2128 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX); | |
2129 if(add) dst[x + y*dst_stride] += v; | |
2130 else dst[x + y*dst_stride] -= v; | |
2131 } | |
2132 } | |
2133 for(y=0; y<b_h; y++){ | |
2134 uint8_t *obmc2= obmc + (obmc_stride>>1); | |
2135 for(x=0; x<b_w; x++){ | |
2136 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX); | |
2137 if(add) dst[x + y*dst_stride] += v; | |
2138 else dst[x + y*dst_stride] -= v; | |
2139 } | |
2140 } | |
2141 for(y=0; y<b_h; y++){ | |
2142 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2143 for(x=0; x<b_w; x++){ | |
2144 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX); | |
2145 if(add) dst[x + y*dst_stride] += v; | |
2146 else dst[x + y*dst_stride] -= v; | |
2147 } | |
2148 } | |
2149 for(y=0; y<b_h; y++){ | |
2150 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2151 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2152 for(x=0; x<b_w; x++){ | |
2153 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX); | |
2154 if(add) dst[x + y*dst_stride] += v; | |
2155 else dst[x + y*dst_stride] -= v; | |
2156 } | |
2157 } | |
2158 #else | |
2159 for(y=0; y<b_h; y++){ | |
2160 //FIXME ugly missue of obmc_stride | |
2161 uint8_t *obmc1= obmc + y*obmc_stride; | |
2162 uint8_t *obmc2= obmc1+ (obmc_stride>>1); | |
2163 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); | |
2164 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2165 for(x=0; x<b_w; x++){ | |
2166 int v= obmc1[x] * block[3][x + y*src_stride] | |
2167 +obmc2[x] * block[2][x + y*src_stride] | |
2168 +obmc3[x] * block[1][x + y*src_stride] | |
2169 +obmc4[x] * block[0][x + y*src_stride]; | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2170 |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2171 v <<= 8 - LOG2_OBMC_MAX; |
2246 | 2172 if(FRAC_BITS != 8){ |
2173 v += 1<<(7 - FRAC_BITS); | |
2174 v >>= 8 - FRAC_BITS; | |
2175 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2176 if(add){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2177 v += dst[x + y*dst_stride]; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2178 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2179 if(v&(~255)) v= ~(v>>31); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2180 dst8[x + y*src_stride] = v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2181 }else{ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2182 dst[x + y*dst_stride] -= v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2183 } |
2206 | 2184 } |
2185 } | |
2186 #endif | |
2187 } | |
2188 | |
2189 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){ | |
2138 | 2190 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
|
2191 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
|
2192 const int mb_h= s->b_height << s->block_max_depth; |
2138 | 2193 int x, y, mb_x, mb_y; |
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
|
2194 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
|
2195 int block_w = plane_index ? block_size/2 : block_size; |
2206 | 2196 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
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
|
2197 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
|
2198 int ref_stride= s->current_picture.linesize[plane_index]; |
2138 | 2199 uint8_t *ref = s->last_picture.data[plane_index]; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2200 uint8_t *dst8= s->current_picture.data[plane_index]; |
2138 | 2201 int w= p->width; |
2202 int h= p->height; | |
2197 | 2203 START_TIMER |
2138 | 2204 |
2206 | 2205 if(s->keyframe || (s->avctx->debug&512)){ |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2206 if(add){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2207 for(y=0; y<h; y++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2208 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2209 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
|
2210 v >>= FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2211 if(v&(~255)) v= ~(v>>31); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2212 dst8[x + y*ref_stride]= v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2213 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2214 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2215 }else{ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2216 for(y=0; y<h; y++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2217 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2218 buf[x + y*w]-= 128<<FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2219 } |
2206 | 2220 } |
2138 | 2221 } |
2206 | 2222 |
2223 return; | |
2138 | 2224 } |
2225 | |
2206 | 2226 for(mb_y=0; mb_y<=mb_h; mb_y++){ |
2227 for(mb_x=0; mb_x<=mb_w; mb_x++){ | |
2197 | 2228 START_TIMER |
2206 | 2229 |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2230 add_yblock(s, buf, dst8, ref, obmc, |
2206 | 2231 block_w*mb_x - block_w/2, |
2138 | 2232 block_w*mb_y - block_w/2, |
2206 | 2233 block_w, block_w, |
2138 | 2234 w, h, |
2206 | 2235 w, ref_stride, obmc_stride, |
2236 mb_x - 1, mb_y - 1, | |
2237 add, plane_index); | |
2238 | |
2239 STOP_TIMER("add_yblock") | |
2138 | 2240 } |
2241 } | |
2197 | 2242 |
2243 STOP_TIMER("predict_plane") | |
2138 | 2244 } |
2245 | |
2246 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){ | |
2247 const int level= b->level; | |
2248 const int w= b->width; | |
2249 const int h= b->height; | |
2250 const int qlog= clip(s->qlog + b->qlog, 0, 128); | |
2251 const int qmul= qexp[qlog&7]<<(qlog>>3); | |
2150 | 2252 int x,y, thres1, thres2; |
2253 START_TIMER | |
2138 | 2254 |
2255 assert(QROOT==8); | |
2256 | |
2161 | 2257 if(s->qlog == LOSSLESS_QLOG) return; |
2258 | |
2138 | 2259 bias= bias ? 0 : (3*qmul)>>3; |
2150 | 2260 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
2261 thres2= 2*thres1; | |
2138 | 2262 |
2263 if(!bias){ | |
2264 for(y=0; y<h; y++){ | |
2265 for(x=0; x<w; x++){ | |
2150 | 2266 int i= src[x + y*stride]; |
2267 | |
2268 if((unsigned)(i+thres1) > thres2){ | |
2269 if(i>=0){ | |
2270 i<<= QEXPSHIFT; | |
2271 i/= qmul; //FIXME optimize | |
2272 src[x + y*stride]= i; | |
2273 }else{ | |
2274 i= -i; | |
2275 i<<= QEXPSHIFT; | |
2276 i/= qmul; //FIXME optimize | |
2277 src[x + y*stride]= -i; | |
2278 } | |
2279 }else | |
2280 src[x + y*stride]= 0; | |
2138 | 2281 } |
2282 } | |
2283 }else{ | |
2284 for(y=0; y<h; y++){ | |
2285 for(x=0; x<w; x++){ | |
2286 int i= src[x + y*stride]; | |
2287 | |
2150 | 2288 if((unsigned)(i+thres1) > thres2){ |
2289 if(i>=0){ | |
2290 i<<= QEXPSHIFT; | |
2291 i= (i + bias) / qmul; //FIXME optimize | |
2292 src[x + y*stride]= i; | |
2293 }else{ | |
2294 i= -i; | |
2295 i<<= QEXPSHIFT; | |
2296 i= (i + bias) / qmul; //FIXME optimize | |
2297 src[x + y*stride]= -i; | |
2298 } | |
2299 }else | |
2300 src[x + y*stride]= 0; | |
2138 | 2301 } |
2302 } | |
2303 } | |
2150 | 2304 if(level+1 == s->spatial_decomposition_count){ |
2305 // STOP_TIMER("quantize") | |
2306 } | |
2138 | 2307 } |
2308 | |
2309 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){ | |
2310 const int w= b->width; | |
2311 const int h= b->height; | |
2312 const int qlog= clip(s->qlog + b->qlog, 0, 128); | |
2313 const int qmul= qexp[qlog&7]<<(qlog>>3); | |
2314 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; | |
2315 int x,y; | |
2195 | 2316 START_TIMER |
2138 | 2317 |
2161 | 2318 if(s->qlog == LOSSLESS_QLOG) return; |
2319 | |
2138 | 2320 assert(QROOT==8); |
2321 | |
2322 for(y=0; y<h; y++){ | |
2323 for(x=0; x<w; x++){ | |
2324 int i= src[x + y*stride]; | |
2325 if(i<0){ | |
2326 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
2327 }else if(i>0){ | |
2328 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
2329 } | |
2330 } | |
2331 } | |
2195 | 2332 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){ |
2333 STOP_TIMER("dquant") | |
2334 } | |
2138 | 2335 } |
2336 | |
2337 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){ | |
2338 const int w= b->width; | |
2339 const int h= b->height; | |
2340 int x,y; | |
2341 | |
2342 for(y=h-1; y>=0; y--){ | |
2343 for(x=w-1; x>=0; x--){ | |
2344 int i= x + y*stride; | |
2345 | |
2346 if(x){ | |
2347 if(use_median){ | |
2348 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
2349 else src[i] -= src[i - 1]; | |
2350 }else{ | |
2351 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
2352 else src[i] -= src[i - 1]; | |
2353 } | |
2354 }else{ | |
2355 if(y) src[i] -= src[i - stride]; | |
2356 } | |
2357 } | |
2358 } | |
2359 } | |
2360 | |
2361 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){ | |
2362 const int w= b->width; | |
2363 const int h= b->height; | |
2364 int x,y; | |
2365 | |
2366 for(y=0; y<h; y++){ | |
2367 for(x=0; x<w; x++){ | |
2368 int i= x + y*stride; | |
2369 | |
2370 if(x){ | |
2371 if(use_median){ | |
2372 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
2373 else src[i] += src[i - 1]; | |
2374 }else{ | |
2375 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
2376 else src[i] += src[i - 1]; | |
2377 } | |
2378 }else{ | |
2379 if(y) src[i] += src[i - stride]; | |
2380 } | |
2381 } | |
2382 } | |
2383 } | |
2384 | |
2385 static void encode_header(SnowContext *s){ | |
2386 int plane_index, level, orientation; | |
2335 | 2387 uint8_t kstate[32]; |
2388 | |
2389 memset(kstate, MID_STATE, sizeof(kstate)); | |
2138 | 2390 |
2335 | 2391 put_rac(&s->c, kstate, s->keyframe); |
2199 | 2392 if(s->keyframe || s->always_reset) |
2393 reset_contexts(s); | |
2138 | 2394 if(s->keyframe){ |
2395 put_symbol(&s->c, s->header_state, s->version, 0); | |
2335 | 2396 put_rac(&s->c, s->header_state, s->always_reset); |
2138 | 2397 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); |
2398 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); | |
2399 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); | |
2400 put_symbol(&s->c, s->header_state, s->colorspace_type, 0); | |
2401 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0); | |
2402 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0); | |
2335 | 2403 put_rac(&s->c, s->header_state, s->spatial_scalability); |
2404 // put_rac(&s->c, s->header_state, s->rate_scalability); | |
2138 | 2405 |
2406 for(plane_index=0; plane_index<2; plane_index++){ | |
2407 for(level=0; level<s->spatial_decomposition_count; level++){ | |
2408 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
2409 if(orientation==2) continue; | |
2410 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); | |
2411 } | |
2412 } | |
2413 } | |
2414 } | |
2415 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0); | |
2416 put_symbol(&s->c, s->header_state, s->qlog, 1); | |
2417 put_symbol(&s->c, s->header_state, s->mv_scale, 0); | |
2418 put_symbol(&s->c, s->header_state, s->qbias, 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
|
2419 put_symbol(&s->c, s->header_state, s->block_max_depth, 0); |
2138 | 2420 } |
2421 | |
2422 static int decode_header(SnowContext *s){ | |
2423 int plane_index, level, orientation; | |
2335 | 2424 uint8_t kstate[32]; |
2138 | 2425 |
2335 | 2426 memset(kstate, MID_STATE, sizeof(kstate)); |
2427 | |
2428 s->keyframe= get_rac(&s->c, kstate); | |
2199 | 2429 if(s->keyframe || s->always_reset) |
2430 reset_contexts(s); | |
2138 | 2431 if(s->keyframe){ |
2432 s->version= get_symbol(&s->c, s->header_state, 0); | |
2433 if(s->version>0){ | |
2434 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version); | |
2435 return -1; | |
2436 } | |
2335 | 2437 s->always_reset= get_rac(&s->c, s->header_state); |
2138 | 2438 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0); |
2439 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0); | |
2440 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0); | |
2441 s->colorspace_type= get_symbol(&s->c, s->header_state, 0); | |
2442 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0); | |
2443 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0); | |
2335 | 2444 s->spatial_scalability= get_rac(&s->c, s->header_state); |
2445 // s->rate_scalability= get_rac(&s->c, s->header_state); | |
2138 | 2446 |
2447 for(plane_index=0; plane_index<3; plane_index++){ | |
2448 for(level=0; level<s->spatial_decomposition_count; level++){ | |
2449 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
2450 int q; | |
2451 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; | |
2452 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; | |
2453 else q= get_symbol(&s->c, s->header_state, 1); | |
2454 s->plane[plane_index].band[level][orientation].qlog= q; | |
2455 } | |
2456 } | |
2457 } | |
2458 } | |
2459 | |
2460 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0); | |
2461 if(s->spatial_decomposition_type > 2){ | |
2462 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type); | |
2463 return -1; | |
2464 } | |
2465 | |
2466 s->qlog= get_symbol(&s->c, s->header_state, 1); | |
2467 s->mv_scale= get_symbol(&s->c, s->header_state, 0); | |
2468 s->qbias= get_symbol(&s->c, s->header_state, 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
|
2469 s->block_max_depth= get_symbol(&s->c, s->header_state, 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
|
2470 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2471 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
|
2472 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2473 |
2138 | 2474 static int common_init(AVCodecContext *avctx){ |
2475 SnowContext *s = avctx->priv_data; | |
2476 int width, height; | |
2477 int level, orientation, plane_index, dec; | |
2478 | |
2479 s->avctx= avctx; | |
2480 | |
2481 dsputil_init(&s->dsp, avctx); | |
2482 | |
2483 #define mcf(dx,dy)\ | |
2484 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\ | |
2485 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\ | |
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2486 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2487 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2488 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2489 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4]; |
2138 | 2490 |
2491 mcf( 0, 0) | |
2492 mcf( 4, 0) | |
2493 mcf( 8, 0) | |
2494 mcf(12, 0) | |
2495 mcf( 0, 4) | |
2496 mcf( 4, 4) | |
2497 mcf( 8, 4) | |
2498 mcf(12, 4) | |
2499 mcf( 0, 8) | |
2500 mcf( 4, 8) | |
2501 mcf( 8, 8) | |
2502 mcf(12, 8) | |
2503 mcf( 0,12) | |
2504 mcf( 4,12) | |
2505 mcf( 8,12) | |
2506 mcf(12,12) | |
2507 | |
2508 #define mcfh(dx,dy)\ | |
2509 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\ | |
2510 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\ | |
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2511 mc_block_hpel ## dx ## dy ## 16;\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2512 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2513 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\ |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2514 mc_block_hpel ## dx ## dy ## 8; |
2138 | 2515 |
2516 mcfh(0, 0) | |
2517 mcfh(8, 0) | |
2518 mcfh(0, 8) | |
2519 mcfh(8, 8) | |
2520 | |
2521 dec= s->spatial_decomposition_count= 5; | |
2522 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type | |
2523 | |
2524 s->chroma_h_shift= 1; //FIXME XXX | |
2525 s->chroma_v_shift= 1; | |
2526 | |
2527 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift); | |
2528 | |
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
|
2529 width= s->avctx->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
|
2530 height= s->avctx->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
|
2531 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2532 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM)); |
2138 | 2533 |
2534 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 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
|
2535 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0; |
2138 | 2536 |
2537 for(plane_index=0; plane_index<3; plane_index++){ | |
2538 int w= s->avctx->width; | |
2539 int h= s->avctx->height; | |
2540 | |
2541 if(plane_index){ | |
2542 w>>= s->chroma_h_shift; | |
2543 h>>= s->chroma_v_shift; | |
2544 } | |
2545 s->plane[plane_index].width = w; | |
2546 s->plane[plane_index].height= h; | |
2160 | 2547 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h); |
2138 | 2548 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
2549 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2550 SubBand *b= &s->plane[plane_index].band[level][orientation]; | |
2551 | |
2552 b->buf= s->spatial_dwt_buffer; | |
2553 b->level= level; | |
2554 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level); | |
2555 b->width = (w + !(orientation&1))>>1; | |
2556 b->height= (h + !(orientation>1))>>1; | |
2557 | |
2558 if(orientation&1) b->buf += (w+1)>>1; | |
2559 if(orientation>1) b->buf += b->stride>>1; | |
2560 | |
2561 if(level) | |
2562 b->parent= &s->plane[plane_index].band[level-1][orientation]; | |
2193 | 2563 b->x = av_mallocz(((b->width+1) * b->height+1)*sizeof(int16_t)); |
2564 b->coeff= av_mallocz(((b->width+1) * b->height+1)*sizeof(DWTELEM)); | |
2138 | 2565 } |
2566 w= (w+1)>>1; | |
2567 h= (h+1)>>1; | |
2568 } | |
2569 } | |
2570 | |
2571 reset_contexts(s); | |
2572 /* | |
2573 width= s->width= avctx->width; | |
2574 height= s->height= avctx->height; | |
2575 | |
2576 assert(width && height); | |
2577 */ | |
2578 s->avctx->get_buffer(s->avctx, &s->mconly_picture); | |
2579 | |
2580 return 0; | |
2581 } | |
2582 | |
2583 | |
2584 static void calculate_vissual_weight(SnowContext *s, Plane *p){ | |
2585 int width = p->width; | |
2586 int height= p->height; | |
2198 | 2587 int level, orientation, x, y; |
2138 | 2588 |
2589 for(level=0; level<s->spatial_decomposition_count; level++){ | |
2590 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2591 SubBand *b= &p->band[level][orientation]; | |
2592 DWTELEM *buf= b->buf; | |
2593 int64_t error=0; | |
2594 | |
2595 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height); | |
2596 buf[b->width/2 + b->height/2*b->stride]= 256*256; | |
2164 | 2597 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 2598 for(y=0; y<height; y++){ |
2599 for(x=0; x<width; x++){ | |
2600 int64_t d= s->spatial_dwt_buffer[x + y*width]; | |
2601 error += d*d; | |
2602 } | |
2603 } | |
2604 | |
2605 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
2164 | 2606 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/); |
2138 | 2607 } |
2608 } | |
2609 } | |
2610 | |
2611 static int encode_init(AVCodecContext *avctx) | |
2612 { | |
2613 SnowContext *s = avctx->priv_data; | |
2198 | 2614 int plane_index; |
2138 | 2615 |
2151 | 2616 if(avctx->strict_std_compliance >= 0){ |
2617 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n" | |
2618 "use vstrict=-1 to use it anyway\n"); | |
2619 return -1; | |
2620 } | |
2621 | |
2138 | 2622 common_init(avctx); |
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
|
2623 alloc_blocks(s); |
2138 | 2624 |
2625 s->version=0; | |
2626 | |
2627 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t)); | |
2628 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); | |
2629 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); | |
2630 h263_encode_init(&s->m); //mv_penalty | |
2631 | |
2632 for(plane_index=0; plane_index<3; plane_index++){ | |
2633 calculate_vissual_weight(s, &s->plane[plane_index]); | |
2634 } | |
2635 | |
2636 | |
2637 avctx->coded_frame= &s->current_picture; | |
2638 switch(avctx->pix_fmt){ | |
2639 // case PIX_FMT_YUV444P: | |
2640 // case PIX_FMT_YUV422P: | |
2641 case PIX_FMT_YUV420P: | |
2642 case PIX_FMT_GRAY8: | |
2643 // case PIX_FMT_YUV411P: | |
2644 // case PIX_FMT_YUV410P: | |
2645 s->colorspace_type= 0; | |
2646 break; | |
2647 /* case PIX_FMT_RGBA32: | |
2648 s->colorspace= 1; | |
2649 break;*/ | |
2650 default: | |
2651 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); | |
2652 return -1; | |
2653 } | |
2654 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); | |
2655 s->chroma_h_shift= 1; | |
2656 s->chroma_v_shift= 1; | |
2657 return 0; | |
2658 } | |
2659 | |
2660 static int frame_start(SnowContext *s){ | |
2661 AVFrame tmp; | |
2187 | 2662 int w= s->avctx->width; //FIXME round up to x16 ? |
2663 int h= s->avctx->height; | |
2138 | 2664 |
2187 | 2665 if(s->current_picture.data[0]){ |
2666 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH ); | |
2667 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2); | |
2668 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2); | |
2669 } | |
2670 | |
2138 | 2671 tmp= s->last_picture; |
2672 s->last_picture= s->current_picture; | |
2673 s->current_picture= tmp; | |
2674 | |
2675 s->current_picture.reference= 1; | |
2676 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){ | |
2677 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
2678 return -1; | |
2679 } | |
2680 | |
2681 return 0; | |
2682 } | |
2683 | |
2684 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
2685 SnowContext *s = avctx->priv_data; | |
2335 | 2686 RangeCoder * const c= &s->c; |
2138 | 2687 AVFrame *pict = data; |
2688 const int width= s->avctx->width; | |
2689 const int height= s->avctx->height; | |
2198 | 2690 int level, orientation, plane_index; |
2138 | 2691 |
2335 | 2692 ff_init_range_encoder(c, buf, buf_size); |
2693 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
2138 | 2694 |
2695 s->input_picture = *pict; | |
2696 | |
2697 s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; | |
2698 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; | |
2699 | |
2161 | 2700 if(pict->quality){ |
2701 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2)); | |
2702 //<64 >60 | |
2703 s->qlog += 61; | |
2704 }else{ | |
2705 s->qlog= LOSSLESS_QLOG; | |
2706 } | |
2138 | 2707 |
2708 frame_start(s); | |
2199 | 2709 s->current_picture.key_frame= s->keyframe; |
2138 | 2710 |
2711 if(pict->pict_type == P_TYPE){ | |
2712 int block_width = (width +15)>>4; | |
2713 int block_height= (height+15)>>4; | |
2714 int stride= s->current_picture.linesize[0]; | |
2715 | |
2716 assert(s->current_picture.data[0]); | |
2717 assert(s->last_picture.data[0]); | |
2718 | |
2719 s->m.avctx= s->avctx; | |
2720 s->m.current_picture.data[0]= s->current_picture.data[0]; | |
2721 s->m. last_picture.data[0]= s-> last_picture.data[0]; | |
2722 s->m. new_picture.data[0]= s-> input_picture.data[0]; | |
2723 s->m.current_picture_ptr= &s->m.current_picture; | |
2724 s->m. last_picture_ptr= &s->m. last_picture; | |
2725 s->m.linesize= | |
2726 s->m. last_picture.linesize[0]= | |
2727 s->m. new_picture.linesize[0]= | |
2728 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
|
2729 s->m.uvlinesize= s->current_picture.linesize[1]; |
2138 | 2730 s->m.width = width; |
2731 s->m.height= height; | |
2732 s->m.mb_width = block_width; | |
2733 s->m.mb_height= block_height; | |
2734 s->m.mb_stride= s->m.mb_width+1; | |
2735 s->m.b8_stride= 2*s->m.mb_width+1; | |
2736 s->m.f_code=1; | |
2737 s->m.pict_type= pict->pict_type; | |
2738 s->m.me_method= s->avctx->me_method; | |
2739 s->m.me.scene_change_score=0; | |
2740 s->m.flags= s->avctx->flags; | |
2741 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0; | |
2742 s->m.out_format= FMT_H263; | |
2743 s->m.unrestricted_mv= 1; | |
2744 | |
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
|
2745 s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else |
2138 | 2746 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
|
2747 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
|
2748 |
2138 | 2749 s->m.dsp= s->dsp; //move |
2750 ff_init_me(&s->m); | |
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
|
2751 } |
2138 | 2752 |
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
|
2753 redo_frame: |
2138 | 2754 |
2755 s->qbias= pict->pict_type == P_TYPE ? 2 : 0; | |
2756 | |
2757 encode_header(s); | |
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
|
2758 encode_blocks(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
|
2759 |
2138 | 2760 for(plane_index=0; plane_index<3; plane_index++){ |
2761 Plane *p= &s->plane[plane_index]; | |
2762 int w= p->width; | |
2763 int h= p->height; | |
2764 int x, y; | |
2198 | 2765 // int bits= put_bits_count(&s->c.pb); |
2138 | 2766 |
2767 //FIXME optimize | |
2768 if(pict->data[plane_index]) //FIXME gray hack | |
2769 for(y=0; y<h; y++){ | |
2770 for(x=0; x<w; x++){ | |
2246 | 2771 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS; |
2138 | 2772 } |
2773 } | |
2774 predict_plane(s, s->spatial_dwt_buffer, plane_index, 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
|
2775 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2776 if( plane_index==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
|
2777 && pict->pict_type == P_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
|
2778 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){ |
2335 | 2779 ff_init_range_encoder(c, buf, buf_size); |
2780 ff_build_rac_states(c, 0.05*(1LL<<32), 256-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
|
2781 pict->pict_type= FF_I_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
|
2782 s->keyframe=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
|
2783 reset_contexts(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
|
2784 goto redo_frame; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2785 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2786 |
2161 | 2787 if(s->qlog == LOSSLESS_QLOG){ |
2788 for(y=0; y<h; y++){ | |
2789 for(x=0; x<w; x++){ | |
2246 | 2790 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1)))>>FRAC_BITS; |
2161 | 2791 } |
2792 } | |
2793 } | |
2794 | |
2164 | 2795 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 2796 |
2138 | 2797 for(level=0; level<s->spatial_decomposition_count; level++){ |
2798 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2799 SubBand *b= &p->band[level][orientation]; | |
2800 | |
2801 quantize(s, b, b->buf, b->stride, s->qbias); | |
2802 if(orientation==0) | |
2803 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0); | |
2804 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation); | |
2805 assert(b->parent==NULL || b->parent->stride == b->stride*2); | |
2806 if(orientation==0) | |
2807 correlate(s, b, b->buf, b->stride, 1, 0); | |
2808 } | |
2809 } | |
2810 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits); | |
2811 | |
2812 for(level=0; level<s->spatial_decomposition_count; level++){ | |
2813 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2814 SubBand *b= &p->band[level][orientation]; | |
2815 | |
2816 dequantize(s, b, b->buf, b->stride); | |
2817 } | |
2818 } | |
2161 | 2819 |
2164 | 2820 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 2821 if(s->qlog == LOSSLESS_QLOG){ |
2822 for(y=0; y<h; y++){ | |
2823 for(x=0; x<w; x++){ | |
2246 | 2824 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS; |
2161 | 2825 } |
2826 } | |
2827 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2828 {START_TIMER |
2138 | 2829 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2830 STOP_TIMER("pred-conv")} |
2138 | 2831 if(s->avctx->flags&CODEC_FLAG_PSNR){ |
2832 int64_t error= 0; | |
2833 | |
2834 if(pict->data[plane_index]) //FIXME gray hack | |
2835 for(y=0; y<h; y++){ | |
2836 for(x=0; x<w; x++){ | |
2161 | 2837 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]; |
2138 | 2838 error += d*d; |
2839 } | |
2840 } | |
2841 s->avctx->error[plane_index] += error; | |
2232 | 2842 s->current_picture.error[plane_index] = error; |
2138 | 2843 } |
2844 } | |
2845 | |
2846 if(s->last_picture.data[0]) | |
2847 avctx->release_buffer(avctx, &s->last_picture); | |
2848 | |
2849 emms_c(); | |
2850 | |
2335 | 2851 return ff_rac_terminate(c); |
2138 | 2852 } |
2853 | |
2854 static void common_end(SnowContext *s){ | |
2192 | 2855 int plane_index, level, orientation; |
2856 | |
2138 | 2857 av_freep(&s->spatial_dwt_buffer); |
2858 | |
2859 av_freep(&s->m.me.scratchpad); | |
2860 av_freep(&s->m.me.map); | |
2861 av_freep(&s->m.me.score_map); | |
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
|
2862 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2863 av_freep(&s->block); |
2192 | 2864 |
2865 for(plane_index=0; plane_index<3; plane_index++){ | |
2866 for(level=s->spatial_decomposition_count-1; level>=0; level--){ | |
2867 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2868 SubBand *b= &s->plane[plane_index].band[level][orientation]; | |
2869 | |
2870 av_freep(&b->x); | |
2193 | 2871 av_freep(&b->coeff); |
2192 | 2872 } |
2873 } | |
2874 } | |
2138 | 2875 } |
2876 | |
2877 static int encode_end(AVCodecContext *avctx) | |
2878 { | |
2879 SnowContext *s = avctx->priv_data; | |
2880 | |
2881 common_end(s); | |
2882 | |
2883 return 0; | |
2884 } | |
2885 | |
2886 static int decode_init(AVCodecContext *avctx) | |
2887 { | |
2888 // SnowContext *s = avctx->priv_data; | |
2889 | |
2890 common_init(avctx); | |
2891 | |
2892 return 0; | |
2893 } | |
2894 | |
2895 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){ | |
2896 SnowContext *s = avctx->priv_data; | |
2335 | 2897 RangeCoder * const c= &s->c; |
2138 | 2898 int bytes_read; |
2899 AVFrame *picture = data; | |
2198 | 2900 int level, orientation, plane_index; |
2138 | 2901 |
2902 | |
2903 /* no supplementary picture */ | |
2904 if (buf_size == 0) | |
2905 return 0; | |
2906 | |
2335 | 2907 ff_init_range_decoder(c, buf, buf_size); |
2908 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
2138 | 2909 |
2910 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P | |
2911 decode_header(s); | |
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
|
2912 if(!s->block) alloc_blocks(s); |
2138 | 2913 |
2914 frame_start(s); | |
2915 //keyframe flag dupliaction mess FIXME | |
2916 if(avctx->debug&FF_DEBUG_PICT_INFO) | |
2917 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog); | |
2918 | |
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
|
2919 decode_blocks(s); |
2138 | 2920 |
2921 for(plane_index=0; plane_index<3; plane_index++){ | |
2922 Plane *p= &s->plane[plane_index]; | |
2923 int w= p->width; | |
2924 int h= p->height; | |
2925 int x, y; | |
2926 | |
2927 if(s->avctx->debug&2048){ | |
2928 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); | |
2929 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); | |
2930 | |
2931 for(y=0; y<h; y++){ | |
2932 for(x=0; x<w; x++){ | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2933 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]; |
2138 | 2934 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v; |
2935 } | |
2936 } | |
2937 } | |
2938 for(level=0; level<s->spatial_decomposition_count; level++){ | |
2939 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
2940 SubBand *b= &p->band[level][orientation]; | |
2941 | |
2942 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation); | |
2195 | 2943 if(orientation==0){ |
2138 | 2944 correlate(s, b, b->buf, b->stride, 1, 0); |
2195 | 2945 dequantize(s, b, b->buf, b->stride); |
2946 assert(b->buf == s->spatial_dwt_buffer); | |
2947 } | |
2138 | 2948 } |
2949 } | |
2950 | |
2164 | 2951 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 2952 if(s->qlog == LOSSLESS_QLOG){ |
2953 for(y=0; y<h; y++){ | |
2954 for(x=0; x<w; x++){ | |
2246 | 2955 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS; |
2161 | 2956 } |
2957 } | |
2958 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2959 {START_TIMER |
2138 | 2960 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2961 STOP_TIMER("predict_plane conv2")} |
2138 | 2962 } |
2963 | |
2964 emms_c(); | |
2965 | |
2966 if(s->last_picture.data[0]) | |
2967 avctx->release_buffer(avctx, &s->last_picture); | |
2968 | |
2969 if(!(s->avctx->debug&2048)) | |
2970 *picture= s->current_picture; | |
2971 else | |
2972 *picture= s->mconly_picture; | |
2973 | |
2974 *data_size = sizeof(AVFrame); | |
2975 | |
2335 | 2976 bytes_read= c->bytestream - c->bytestream_start; |
2977 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME | |
2138 | 2978 |
2979 return bytes_read; | |
2980 } | |
2981 | |
2982 static int decode_end(AVCodecContext *avctx) | |
2983 { | |
2984 SnowContext *s = avctx->priv_data; | |
2985 | |
2986 common_end(s); | |
2987 | |
2988 return 0; | |
2989 } | |
2990 | |
2991 AVCodec snow_decoder = { | |
2992 "snow", | |
2993 CODEC_TYPE_VIDEO, | |
2994 CODEC_ID_SNOW, | |
2995 sizeof(SnowContext), | |
2996 decode_init, | |
2997 NULL, | |
2998 decode_end, | |
2999 decode_frame, | |
3000 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/, | |
3001 NULL | |
3002 }; | |
3003 | |
3004 AVCodec snow_encoder = { | |
3005 "snow", | |
3006 CODEC_TYPE_VIDEO, | |
3007 CODEC_ID_SNOW, | |
3008 sizeof(SnowContext), | |
3009 encode_init, | |
3010 encode_frame, | |
3011 encode_end, | |
3012 }; | |
3013 | |
3014 | |
3015 #if 0 | |
3016 #undef malloc | |
3017 #undef free | |
3018 #undef printf | |
3019 | |
3020 int main(){ | |
3021 int width=256; | |
3022 int height=256; | |
3023 int buffer[2][width*height]; | |
3024 SnowContext s; | |
3025 int i; | |
3026 s.spatial_decomposition_count=6; | |
3027 s.spatial_decomposition_type=1; | |
3028 | |
3029 printf("testing 5/3 DWT\n"); | |
3030 for(i=0; i<width*height; i++) | |
3031 buffer[0][i]= buffer[1][i]= random()%54321 - 12345; | |
3032 | |
2164 | 3033 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
3034 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
2138 | 3035 |
3036 for(i=0; i<width*height; i++) | |
3037 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]); | |
3038 | |
3039 printf("testing 9/7 DWT\n"); | |
3040 s.spatial_decomposition_type=0; | |
3041 for(i=0; i<width*height; i++) | |
3042 buffer[0][i]= buffer[1][i]= random()%54321 - 12345; | |
3043 | |
2164 | 3044 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
3045 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
2138 | 3046 |
3047 for(i=0; i<width*height; i++) | |
3048 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]); | |
3049 | |
3050 printf("testing AC coder\n"); | |
3051 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 3052 ff_init_range_encoder(&s.c, buffer[0], 256*256); |
2138 | 3053 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
3054 | |
3055 for(i=-256; i<256; i++){ | |
3056 START_TIMER | |
3057 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1); | |
3058 STOP_TIMER("put_symbol") | |
3059 } | |
2335 | 3060 ff_rac_terminate(&s.c); |
2138 | 3061 |
3062 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 3063 ff_init_range_decoder(&s.c, buffer[0], 256*256); |
2138 | 3064 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
3065 | |
3066 for(i=-256; i<256; i++){ | |
3067 int j; | |
3068 START_TIMER | |
3069 j= get_symbol(&s.c, s.header_state, 1); | |
3070 STOP_TIMER("get_symbol") | |
3071 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j); | |
3072 } | |
3073 { | |
3074 int level, orientation, x, y; | |
3075 int64_t errors[8][4]; | |
3076 int64_t g=0; | |
3077 | |
3078 memset(errors, 0, sizeof(errors)); | |
3079 s.spatial_decomposition_count=3; | |
3080 s.spatial_decomposition_type=0; | |
3081 for(level=0; level<s.spatial_decomposition_count; level++){ | |
3082 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
3083 int w= width >> (s.spatial_decomposition_count-level); | |
3084 int h= height >> (s.spatial_decomposition_count-level); | |
3085 int stride= width << (s.spatial_decomposition_count-level); | |
3086 DWTELEM *buf= buffer[0]; | |
3087 int64_t error=0; | |
3088 | |
3089 if(orientation&1) buf+=w; | |
3090 if(orientation>1) buf+=stride>>1; | |
3091 | |
3092 memset(buffer[0], 0, sizeof(int)*width*height); | |
3093 buf[w/2 + h/2*stride]= 256*256; | |
2164 | 3094 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3095 for(y=0; y<height; y++){ |
3096 for(x=0; x<width; x++){ | |
3097 int64_t d= buffer[0][x + y*width]; | |
3098 error += d*d; | |
3099 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d); | |
3100 } | |
3101 if(ABS(height/2-y)<9 && level==2) printf("\n"); | |
3102 } | |
3103 error= (int)(sqrt(error)+0.5); | |
3104 errors[level][orientation]= error; | |
3105 if(g) g=ff_gcd(g, error); | |
3106 else g= error; | |
3107 } | |
3108 } | |
3109 printf("static int const visual_weight[][4]={\n"); | |
3110 for(level=0; level<s.spatial_decomposition_count; level++){ | |
3111 printf(" {"); | |
3112 for(orientation=0; orientation<4; orientation++){ | |
3113 printf("%8lld,", errors[level][orientation]/g); | |
3114 } | |
3115 printf("},\n"); | |
3116 } | |
3117 printf("};\n"); | |
3118 { | |
3119 int level=2; | |
3120 int orientation=3; | |
3121 int w= width >> (s.spatial_decomposition_count-level); | |
3122 int h= height >> (s.spatial_decomposition_count-level); | |
3123 int stride= width << (s.spatial_decomposition_count-level); | |
3124 DWTELEM *buf= buffer[0]; | |
3125 int64_t error=0; | |
3126 | |
3127 buf+=w; | |
3128 buf+=stride>>1; | |
3129 | |
3130 memset(buffer[0], 0, sizeof(int)*width*height); | |
3131 #if 1 | |
3132 for(y=0; y<height; y++){ | |
3133 for(x=0; x<width; x++){ | |
3134 int tab[4]={0,2,3,1}; | |
3135 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)]; | |
3136 } | |
3137 } | |
2164 | 3138 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3139 #else |
3140 for(y=0; y<h; y++){ | |
3141 for(x=0; x<w; x++){ | |
3142 buf[x + y*stride ]=169; | |
3143 buf[x + y*stride-w]=64; | |
3144 } | |
3145 } | |
2164 | 3146 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3147 #endif |
3148 for(y=0; y<height; y++){ | |
3149 for(x=0; x<width; x++){ | |
3150 int64_t d= buffer[0][x + y*width]; | |
3151 error += d*d; | |
3152 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d); | |
3153 } | |
3154 if(ABS(height/2-y)<9) printf("\n"); | |
3155 } | |
3156 } | |
3157 | |
3158 } | |
3159 return 0; | |
3160 } | |
3161 #endif | |
3162 |