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