Snow: cosmetics
[libav.git] / libavcodec / snow.c
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "avcodec.h"
20 #include "common.h"
21 #include "dsputil.h"
22 #include "snow.h"
23
24 #include "rangecoder.h"
25
26 #include "mpegvideo.h"
27
28 #undef NDEBUG
29 #include <assert.h>
30
31 static const int8_t quant3[256]={
32 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
33 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
34 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
41 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
42 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
43 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
48 };
49 static const int8_t quant3b[256]={
50 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
51 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
52 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
53 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
54 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
55 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
59 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
63 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
64 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
66 };
67 static const int8_t quant3bA[256]={
68 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
69 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
70 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
71 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
72 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
73 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
74 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
75 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
76 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
84 };
85 static const int8_t quant5[256]={
86 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
89 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
95 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
96 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
97 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
98 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
99 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
100 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
101 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
102 };
103 static const int8_t quant7[256]={
104 0, 1, 1, 2, 2, 2, 2, 2, 2, 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, 3, 3, 3, 3, 3, 3, 3, 3,
107 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
108 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
109 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
110 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
111 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
112 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
113 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
114 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
115 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
116 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
117 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
118 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
119 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
120 };
121 static const int8_t quant9[256]={
122 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
123 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
124 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
125 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
126 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
127 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
128 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
129 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
130 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
131 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
132 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
133 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
134 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
135 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
136 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
137 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
138 };
139 static const int8_t quant11[256]={
140 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
141 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
142 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
143 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
144 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
145 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
146 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
147 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
148 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
149 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
150 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
151 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
152 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
153 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
154 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
155 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
156 };
157 static const int8_t quant13[256]={
158 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
159 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
160 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
161 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
162 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
163 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
164 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
165 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
166 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
167 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
168 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
169 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
170 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
171 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
172 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
173 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
174 };
175
176 #if 0 //64*cubic
177 static const uint8_t obmc32[1024]={
178 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,
179 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,
180 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,
181 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,
182 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,
183 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,
184 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,
185 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,
186 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,
187 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,
188 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,
189 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
190 0, 1, 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,
191 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,
192 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,
193 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,
194 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,
195 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,
196 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,
197 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,
198 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,
199 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,
200 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,
201 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,
202 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,
203 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,
204 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,
205 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,
206 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,
207 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,
208 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,
209 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,
210 //error:0.000022
211 };
212 static const uint8_t obmc16[256]={
213 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
214 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
215 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
216 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
217 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
218 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
219 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
220 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
221 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
222 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
223 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
224 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
225 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
226 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
227 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
228 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
229 //error:0.000033
230 };
231 #elif 1 // 64*linear
232 static const uint8_t obmc32[1024]={
233 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
234 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
235 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
236 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
237 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
238 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
239 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
240 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
241 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
242 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
243 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
244 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
245 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
246 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
247 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
248 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
249 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
250 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
251 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
252 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
253 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
254 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
255 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
256 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
257 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
258 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
259 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
260 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
261 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
262 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
263 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
264 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
265 //error:0.000020
266 };
267 static const uint8_t obmc16[256]={
268 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
269 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
270 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
271 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
272 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
273 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
274 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
275 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
276 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
277 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
278 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
279 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
280 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
281 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
282 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
283 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
284 //error:0.000015
285 };
286 #else //64*cos
287 static const uint8_t obmc32[1024]={
288 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,
289 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,
290 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,
291 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,
292 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,
293 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,
294 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,
295 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,
296 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,
297 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,
298 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,
299 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
300 0, 1, 3, 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,
301 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,
302 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,
303 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,
304 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,
305 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,
306 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,
307 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,
308 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,
309 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,
310 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,
311 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,
312 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,
313 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,
314 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,
315 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,
316 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,
317 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,
318 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,
319 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,
320 //error:0.000022
321 };
322 static const uint8_t obmc16[256]={
323 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
324 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
325 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
326 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
327 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
328 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
329 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
330 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
331 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
332 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
333 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
334 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
335 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
336 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
337 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
338 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
339 //error:0.000022
340 };
341 #endif
342
343 //linear *64
344 static const uint8_t obmc8[64]={
345 4, 12, 20, 28, 28, 20, 12, 4,
346 12, 36, 60, 84, 84, 60, 36, 12,
347 20, 60,100,140,140,100, 60, 20,
348 28, 84,140,196,196,140, 84, 28,
349 28, 84,140,196,196,140, 84, 28,
350 20, 60,100,140,140,100, 60, 20,
351 12, 36, 60, 84, 84, 60, 36, 12,
352 4, 12, 20, 28, 28, 20, 12, 4,
353 //error:0.000000
354 };
355
356 //linear *64
357 static const uint8_t obmc4[16]={
358 16, 48, 48, 16,
359 48,144,144, 48,
360 48,144,144, 48,
361 16, 48, 48, 16,
362 //error:0.000000
363 };
364
365 static const uint8_t *obmc_tab[4]={
366 obmc32, obmc16, obmc8, obmc4
367 };
368
369 typedef struct BlockNode{
370 int16_t mx;
371 int16_t my;
372 uint8_t ref;
373 uint8_t color[3];
374 uint8_t type;
375 //#define TYPE_SPLIT 1
376 #define BLOCK_INTRA 1
377 #define BLOCK_OPT 2
378 //#define TYPE_NOCOLOR 4
379 uint8_t level; //FIXME merge into type?
380 }BlockNode;
381
382 static const BlockNode null_block= { //FIXME add border maybe
383 .color= {128,128,128},
384 .mx= 0,
385 .my= 0,
386 .ref= 0,
387 .type= 0,
388 .level= 0,
389 };
390
391 #define LOG2_MB_SIZE 4
392 #define MB_SIZE (1<<LOG2_MB_SIZE)
393
394 typedef struct x_and_coeff{
395 int16_t x;
396 uint16_t coeff;
397 } x_and_coeff;
398
399 typedef struct SubBand{
400 int level;
401 int stride;
402 int width;
403 int height;
404 int qlog; ///< log(qscale)/log[2^(1/6)]
405 DWTELEM *buf;
406 int buf_x_offset;
407 int buf_y_offset;
408 int stride_line; ///< Stride measured in lines, not pixels.
409 x_and_coeff * x_coeff;
410 struct SubBand *parent;
411 uint8_t state[/*7*2*/ 7 + 512][32];
412 }SubBand;
413
414 typedef struct Plane{
415 int width;
416 int height;
417 SubBand band[MAX_DECOMPOSITIONS][4];
418 }Plane;
419
420 typedef struct SnowContext{
421 // 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)
422
423 AVCodecContext *avctx;
424 RangeCoder c;
425 DSPContext dsp;
426 AVFrame new_picture;
427 AVFrame input_picture; ///< new_picture with the internal linesizes
428 AVFrame current_picture;
429 AVFrame last_picture[MAX_REF_FRAMES];
430 AVFrame mconly_picture;
431 // uint8_t q_context[16];
432 uint8_t header_state[32];
433 uint8_t block_state[128 + 32*128];
434 int keyframe;
435 int always_reset;
436 int version;
437 int spatial_decomposition_type;
438 int temporal_decomposition_type;
439 int spatial_decomposition_count;
440 int temporal_decomposition_count;
441 int max_ref_frames;
442 int ref_frames;
443 int16_t (*ref_mvs[MAX_REF_FRAMES])[2];
444 uint32_t *ref_scores[MAX_REF_FRAMES];
445 DWTELEM *spatial_dwt_buffer;
446 int colorspace_type;
447 int chroma_h_shift;
448 int chroma_v_shift;
449 int spatial_scalability;
450 int qlog;
451 int lambda;
452 int lambda2;
453 int pass1_rc;
454 int mv_scale;
455 int qbias;
456 #define QBIAS_SHIFT 3
457 int b_width;
458 int b_height;
459 int block_max_depth;
460 Plane plane[MAX_PLANES];
461 BlockNode *block;
462 #define ME_CACHE_SIZE 1024
463 int me_cache[ME_CACHE_SIZE];
464 int me_cache_generation;
465 slice_buffer sb;
466
467 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)
468 }SnowContext;
469
470 typedef struct {
471 DWTELEM *b0;
472 DWTELEM *b1;
473 DWTELEM *b2;
474 DWTELEM *b3;
475 int y;
476 } dwt_compose_t;
477
478 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
479 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
480
481 static void iterative_me(SnowContext *s);
482
483 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
484 {
485 int i;
486
487 buf->base_buffer = base_buffer;
488 buf->line_count = line_count;
489 buf->line_width = line_width;
490 buf->data_count = max_allocated_lines;
491 buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
492 buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
493
494 for (i = 0; i < max_allocated_lines; i++)
495 {
496 buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
497 }
498
499 buf->data_stack_top = max_allocated_lines - 1;
500 }
501
502 static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
503 {
504 int offset;
505 DWTELEM * buffer;
506
507 // av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
508
509 assert(buf->data_stack_top >= 0);
510 // assert(!buf->line[line]);
511 if (buf->line[line])
512 return buf->line[line];
513
514 offset = buf->line_width * line;
515 buffer = buf->data_stack[buf->data_stack_top];
516 buf->data_stack_top--;
517 buf->line[line] = buffer;
518
519 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
520
521 return buffer;
522 }
523
524 static void slice_buffer_release(slice_buffer * buf, int line)
525 {
526 int offset;
527 DWTELEM * buffer;
528
529 assert(line >= 0 && line < buf->line_count);
530 assert(buf->line[line]);
531
532 offset = buf->line_width * line;
533 buffer = buf->line[line];
534 buf->data_stack_top++;
535 buf->data_stack[buf->data_stack_top] = buffer;
536 buf->line[line] = NULL;
537
538 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
539 }
540
541 static void slice_buffer_flush(slice_buffer * buf)
542 {
543 int i;
544 for (i = 0; i < buf->line_count; i++)
545 {
546 if (buf->line[i])
547 {
548 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
549 slice_buffer_release(buf, i);
550 }
551 }
552 }
553
554 static void slice_buffer_destroy(slice_buffer * buf)
555 {
556 int i;
557 slice_buffer_flush(buf);
558
559 for (i = buf->data_count - 1; i >= 0; i--)
560 {
561 assert(buf->data_stack[i]);
562 av_freep(&buf->data_stack[i]);
563 }
564 assert(buf->data_stack);
565 av_freep(&buf->data_stack);
566 assert(buf->line);
567 av_freep(&buf->line);
568 }
569
570 #ifdef __sgi
571 // Avoid a name clash on SGI IRIX
572 #undef qexp
573 #endif
574 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
575 static uint8_t qexp[QROOT];
576
577 static inline int mirror(int v, int m){
578 while((unsigned)v > (unsigned)m){
579 v=-v;
580 if(v<0) v+= 2*m;
581 }
582 return v;
583 }
584
585 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
586 int i;
587
588 if(v){
589 const int a= ABS(v);
590 const int e= av_log2(a);
591 #if 1
592 const int el= FFMIN(e, 10);
593 put_rac(c, state+0, 0);
594
595 for(i=0; i<el; i++){
596 put_rac(c, state+1+i, 1); //1..10
597 }
598 for(; i<e; i++){
599 put_rac(c, state+1+9, 1); //1..10
600 }
601 put_rac(c, state+1+FFMIN(i,9), 0);
602
603 for(i=e-1; i>=el; i--){
604 put_rac(c, state+22+9, (a>>i)&1); //22..31
605 }
606 for(; i>=0; i--){
607 put_rac(c, state+22+i, (a>>i)&1); //22..31
608 }
609
610 if(is_signed)
611 put_rac(c, state+11 + el, v < 0); //11..21
612 #else
613
614 put_rac(c, state+0, 0);
615 if(e<=9){
616 for(i=0; i<e; i++){
617 put_rac(c, state+1+i, 1); //1..10
618 }
619 put_rac(c, state+1+i, 0);
620
621 for(i=e-1; i>=0; i--){
622 put_rac(c, state+22+i, (a>>i)&1); //22..31
623 }
624
625 if(is_signed)
626 put_rac(c, state+11 + e, v < 0); //11..21
627 }else{
628 for(i=0; i<e; i++){
629 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
630 }
631 put_rac(c, state+1+FFMIN(i,9), 0);
632
633 for(i=e-1; i>=0; i--){
634 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
635 }
636
637 if(is_signed)
638 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
639 }
640 #endif
641 }else{
642 put_rac(c, state+0, 1);
643 }
644 }
645
646 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
647 if(get_rac(c, state+0))
648 return 0;
649 else{
650 int i, e, a;
651 e= 0;
652 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
653 e++;
654 }
655
656 a= 1;
657 for(i=e-1; i>=0; i--){
658 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
659 }
660
661 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
662 return -a;
663 else
664 return a;
665 }
666 }
667
668 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
669 int i;
670 int r= log2>=0 ? 1<<log2 : 1;
671
672 assert(v>=0);
673 assert(log2>=-4);
674
675 while(v >= r){
676 put_rac(c, state+4+log2, 1);
677 v -= r;
678 log2++;
679 if(log2>0) r+=r;
680 }
681 put_rac(c, state+4+log2, 0);
682
683 for(i=log2-1; i>=0; i--){
684 put_rac(c, state+31-i, (v>>i)&1);
685 }
686 }
687
688 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
689 int i;
690 int r= log2>=0 ? 1<<log2 : 1;
691 int v=0;
692
693 assert(log2>=-4);
694
695 while(get_rac(c, state+4+log2)){
696 v+= r;
697 log2++;
698 if(log2>0) r+=r;
699 }
700
701 for(i=log2-1; i>=0; i--){
702 v+= get_rac(c, state+31-i)<<i;
703 }
704
705 return v;
706 }
707
708 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){
709 const int mirror_left= !highpass;
710 const int mirror_right= (width&1) ^ highpass;
711 const int w= (width>>1) - 1 + (highpass & width);
712 int i;
713
714 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
715 if(mirror_left){
716 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
717 dst += dst_step;
718 src += src_step;
719 }
720
721 for(i=0; i<w; i++){
722 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
723 }
724
725 if(mirror_right){
726 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
727 }
728 }
729
730 #ifndef lift5
731 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){
732 const int mirror_left= !highpass;
733 const int mirror_right= (width&1) ^ highpass;
734 const int w= (width>>1) - 1 + (highpass & width);
735 int i;
736
737 if(mirror_left){
738 int r= 3*2*ref[0];
739 r += r>>4;
740 r += r>>8;
741 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
742 dst += dst_step;
743 src += src_step;
744 }
745
746 for(i=0; i<w; i++){
747 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
748 r += r>>4;
749 r += r>>8;
750 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
751 }
752
753 if(mirror_right){
754 int r= 3*2*ref[w*ref_step];
755 r += r>>4;
756 r += r>>8;
757 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
758 }
759 }
760 #endif
761
762 #ifndef liftS
763 static always_inline void liftS(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){
764 const int mirror_left= !highpass;
765 const int mirror_right= (width&1) ^ highpass;
766 const int w= (width>>1) - 1 + (highpass & width);
767 int i;
768
769 assert(shift == 4);
770 #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
771 if(mirror_left){
772 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
773 dst += dst_step;
774 src += src_step;
775 }
776
777 for(i=0; i<w; i++){
778 dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
779 }
780
781 if(mirror_right){
782 dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
783 }
784 }
785 #endif
786
787
788 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
789 int x, i;
790
791 for(x=start; x<width; x+=2){
792 int64_t sum=0;
793
794 for(i=0; i<n; i++){
795 int x2= x + 2*i - n + 1;
796 if (x2< 0) x2= -x2;
797 else if(x2>=width) x2= 2*width-x2-2;
798 sum += coeffs[i]*(int64_t)dst[x2];
799 }
800 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
801 else dst[x] += (sum + (1<<shift)/2)>>shift;
802 }
803 }
804
805 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
806 int x, y, i;
807 for(y=start; y<height; y+=2){
808 for(x=0; x<width; x++){
809 int64_t sum=0;
810
811 for(i=0; i<n; i++){
812 int y2= y + 2*i - n + 1;
813 if (y2< 0) y2= -y2;
814 else if(y2>=height) y2= 2*height-y2-2;
815 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
816 }
817 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
818 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
819 }
820 }
821 }
822
823 #define SCALEX 1
824 #define LX0 0
825 #define LX1 1
826
827 #if 0 // more accurate 9/7
828 #define N1 2
829 #define SHIFT1 14
830 #define COEFFS1 (int[]){-25987,-25987}
831 #define N2 2
832 #define SHIFT2 19
833 #define COEFFS2 (int[]){-27777,-27777}
834 #define N3 2
835 #define SHIFT3 15
836 #define COEFFS3 (int[]){28931,28931}
837 #define N4 2
838 #define SHIFT4 15
839 #define COEFFS4 (int[]){14533,14533}
840 #elif 1 // 13/7 CRF
841 #define N1 4
842 #define SHIFT1 4
843 #define COEFFS1 (int[]){1,-9,-9,1}
844 #define N2 4
845 #define SHIFT2 4
846 #define COEFFS2 (int[]){-1,5,5,-1}
847 #define N3 0
848 #define SHIFT3 1
849 #define COEFFS3 NULL
850 #define N4 0
851 #define SHIFT4 1
852 #define COEFFS4 NULL
853 #elif 1 // 3/5
854 #define LX0 1
855 #define LX1 0
856 #define SCALEX 0.5
857 #define N1 2
858 #define SHIFT1 1
859 #define COEFFS1 (int[]){1,1}
860 #define N2 2
861 #define SHIFT2 2
862 #define COEFFS2 (int[]){-1,-1}
863 #define N3 0
864 #define SHIFT3 0
865 #define COEFFS3 NULL
866 #define N4 0
867 #define SHIFT4 0
868 #define COEFFS4 NULL
869 #elif 1 // 11/5
870 #define N1 0
871 #define SHIFT1 1
872 #define COEFFS1 NULL
873 #define N2 2
874 #define SHIFT2 2
875 #define COEFFS2 (int[]){-1,-1}
876 #define N3 2
877 #define SHIFT3 0
878 #define COEFFS3 (int[]){-1,-1}
879 #define N4 4
880 #define SHIFT4 7
881 #define COEFFS4 (int[]){-5,29,29,-5}
882 #define SCALEX 4
883 #elif 1 // 9/7 CDF
884 #define N1 2
885 #define SHIFT1 7
886 #define COEFFS1 (int[]){-203,-203}
887 #define N2 2
888 #define SHIFT2 12
889 #define COEFFS2 (int[]){-217,-217}
890 #define N3 2
891 #define SHIFT3 7
892 #define COEFFS3 (int[]){113,113}
893 #define N4 2
894 #define SHIFT4 9
895 #define COEFFS4 (int[]){227,227}
896 #define SCALEX 1
897 #elif 1 // 7/5 CDF
898 #define N1 0
899 #define SHIFT1 1
900 #define COEFFS1 NULL
901 #define N2 2
902 #define SHIFT2 2
903 #define COEFFS2 (int[]){-1,-1}
904 #define N3 2
905 #define SHIFT3 0
906 #define COEFFS3 (int[]){-1,-1}
907 #define N4 2
908 #define SHIFT4 4
909 #define COEFFS4 (int[]){3,3}
910 #elif 1 // 9/7 MN
911 #define N1 4
912 #define SHIFT1 4
913 #define COEFFS1 (int[]){1,-9,-9,1}
914 #define N2 2
915 #define SHIFT2 2
916 #define COEFFS2 (int[]){1,1}
917 #define N3 0
918 #define SHIFT3 1
919 #define COEFFS3 NULL
920 #define N4 0
921 #define SHIFT4 1
922 #define COEFFS4 NULL
923 #else // 13/7 CRF
924 #define N1 4
925 #define SHIFT1 4
926 #define COEFFS1 (int[]){1,-9,-9,1}
927 #define N2 4
928 #define SHIFT2 4
929 #define COEFFS2 (int[]){-1,5,5,-1}
930 #define N3 0
931 #define SHIFT3 1
932 #define COEFFS3 NULL
933 #define N4 0
934 #define SHIFT4 1
935 #define COEFFS4 NULL
936 #endif
937 static void horizontal_decomposeX(DWTELEM *b, int width){
938 DWTELEM temp[width];
939 const int width2= width>>1;
940 const int w2= (width+1)>>1;
941 int x;
942
943 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
944 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
945 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
946 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
947
948 for(x=0; x<width2; x++){
949 temp[x ]= b[2*x ];
950 temp[x+w2]= b[2*x + 1];
951 }
952 if(width&1)
953 temp[x ]= b[2*x ];
954 memcpy(b, temp, width*sizeof(int));
955 }
956
957 static void horizontal_composeX(DWTELEM *b, int width){
958 DWTELEM temp[width];
959 const int width2= width>>1;
960 int x;
961 const int w2= (width+1)>>1;
962
963 memcpy(temp, b, width*sizeof(int));
964 for(x=0; x<width2; x++){
965 b[2*x ]= temp[x ];
966 b[2*x + 1]= temp[x+w2];
967 }
968 if(width&1)
969 b[2*x ]= temp[x ];
970
971 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
972 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
973 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
974 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
975 }
976
977 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
978 int x, y;
979
980 for(y=0; y<height; y++){
981 for(x=0; x<width; x++){
982 buffer[y*stride + x] *= SCALEX;
983 }
984 }
985
986 for(y=0; y<height; y++){
987 horizontal_decomposeX(buffer + y*stride, width);
988 }
989
990 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
991 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
992 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
993 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
994 }
995
996 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
997 int x, y;
998
999 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
1000 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
1001 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
1002 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
1003
1004 for(y=0; y<height; y++){
1005 horizontal_composeX(buffer + y*stride, width);
1006 }
1007
1008 for(y=0; y<height; y++){
1009 for(x=0; x<width; x++){
1010 buffer[y*stride + x] /= SCALEX;
1011 }
1012 }
1013 }
1014
1015 static void horizontal_decompose53i(DWTELEM *b, int width){
1016 DWTELEM temp[width];
1017 const int width2= width>>1;
1018 int x;
1019 const int w2= (width+1)>>1;
1020
1021 for(x=0; x<width2; x++){
1022 temp[x ]= b[2*x ];
1023 temp[x+w2]= b[2*x + 1];
1024 }
1025 if(width&1)
1026 temp[x ]= b[2*x ];
1027 #if 0
1028 {
1029 int A1,A2,A3,A4;
1030 A2= temp[1 ];
1031 A4= temp[0 ];
1032 A1= temp[0+width2];
1033 A1 -= (A2 + A4)>>1;
1034 A4 += (A1 + 1)>>1;
1035 b[0+width2] = A1;
1036 b[0 ] = A4;
1037 for(x=1; x+1<width2; x+=2){
1038 A3= temp[x+width2];
1039 A4= temp[x+1 ];
1040 A3 -= (A2 + A4)>>1;
1041 A2 += (A1 + A3 + 2)>>2;
1042 b[x+width2] = A3;
1043 b[x ] = A2;
1044
1045 A1= temp[x+1+width2];
1046 A2= temp[x+2 ];
1047 A1 -= (A2 + A4)>>1;
1048 A4 += (A1 + A3 + 2)>>2;
1049 b[x+1+width2] = A1;
1050 b[x+1 ] = A4;
1051 }
1052 A3= temp[width-1];
1053 A3 -= A2;
1054 A2 += (A1 + A3 + 2)>>2;
1055 b[width -1] = A3;
1056 b[width2-1] = A2;
1057 }
1058 #else
1059 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1060 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
1061 #endif
1062 }
1063
1064 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1065 int i;
1066
1067 for(i=0; i<width; i++){
1068 b1[i] -= (b0[i] + b2[i])>>1;
1069 }
1070 }
1071
1072 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1073 int i;
1074
1075 for(i=0; i<width; i++){
1076 b1[i] += (b0[i] + b2[i] + 2)>>2;
1077 }
1078 }
1079
1080 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
1081 int y;
1082 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1083 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
1084
1085 for(y=-2; y<height; y+=2){
1086 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1087 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1088
1089 {START_TIMER
1090 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);
1091 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);
1092 STOP_TIMER("horizontal_decompose53i")}
1093
1094 {START_TIMER
1095 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);
1096 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);
1097 STOP_TIMER("vertical_decompose53i*")}
1098
1099 b0=b2;
1100 b1=b3;
1101 }
1102 }
1103
1104 static void horizontal_decompose97i(DWTELEM *b, int width){
1105 DWTELEM temp[width];
1106 const int w2= (width+1)>>1;
1107
1108 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1109 liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1110 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1111 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1112 }
1113
1114
1115 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1116 int i;
1117
1118 for(i=0; i<width; i++){
1119 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1120 }
1121 }
1122
1123 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1124 int i;
1125
1126 for(i=0; i<width; i++){
1127 #ifdef lift5
1128 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1129 #else
1130 int r= 3*(b0[i] + b2[i]);
1131 r+= r>>4;
1132 r+= r>>8;
1133 b1[i] += (r+W_CO)>>W_CS;
1134 #endif
1135 }
1136 }
1137
1138 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1139 int i;
1140
1141 for(i=0; i<width; i++){
1142 #ifdef liftS
1143 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1144 #else
1145 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
1146 #endif
1147 }
1148 }
1149
1150 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1151 int i;
1152
1153 for(i=0; i<width; i++){
1154 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1155 }
1156 }
1157
1158 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1159 int y;
1160 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1161 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1162 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1163 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1164
1165 for(y=-4; y<height; y+=2){
1166 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1167 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1168
1169 {START_TIMER
1170 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width);
1171 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width);
1172 if(width>400){
1173 STOP_TIMER("horizontal_decompose97i")
1174 }}
1175
1176 {START_TIMER
1177 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width);
1178 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width);
1179 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width);
1180 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width);
1181
1182 if(width>400){
1183 STOP_TIMER("vertical_decompose97i")
1184 }}
1185
1186 b0=b2;
1187 b1=b3;
1188 b2=b4;
1189 b3=b5;
1190 }
1191 }
1192
1193 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1194 int level;
1195
1196 for(level=0; level<decomposition_count; level++){
1197 switch(type){
1198 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1199 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1200 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1201 }
1202 }
1203 }
1204
1205 static void horizontal_compose53i(DWTELEM *b, int width){
1206 DWTELEM temp[width];
1207 const int width2= width>>1;
1208 const int w2= (width+1)>>1;
1209 int x;
1210
1211 #if 0
1212 int A1,A2,A3,A4;
1213 A2= temp[1 ];
1214 A4= temp[0 ];
1215 A1= temp[0+width2];
1216 A1 -= (A2 + A4)>>1;
1217 A4 += (A1 + 1)>>1;
1218 b[0+width2] = A1;
1219 b[0 ] = A4;
1220 for(x=1; x+1<width2; x+=2){
1221 A3= temp[x+width2];
1222 A4= temp[x+1 ];
1223 A3 -= (A2 + A4)>>1;
1224 A2 += (A1 + A3 + 2)>>2;
1225 b[x+width2] = A3;
1226 b[x ] = A2;
1227
1228 A1= temp[x+1+width2];
1229 A2= temp[x+2 ];
1230 A1 -= (A2 + A4)>>1;
1231 A4 += (A1 + A3 + 2)>>2;
1232 b[x+1+width2] = A1;
1233 b[x+1 ] = A4;
1234 }
1235 A3= temp[width-1];
1236 A3 -= A2;
1237 A2 += (A1 + A3 + 2)>>2;
1238 b[width -1] = A3;
1239 b[width2-1] = A2;
1240 #else
1241 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1242 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1243 #endif
1244 for(x=0; x<width2; x++){
1245 b[2*x ]= temp[x ];
1246 b[2*x + 1]= temp[x+w2];
1247 }
1248 if(width&1)
1249 b[2*x ]= temp[x ];
1250 }
1251
1252 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1253 int i;
1254
1255 for(i=0; i<width; i++){
1256 b1[i] += (b0[i] + b2[i])>>1;
1257 }
1258 }
1259
1260 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1261 int i;
1262
1263 for(i=0; i<width; i++){
1264 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1265 }
1266 }
1267
1268 static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1269 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
1270 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line);
1271 cs->y = -1;
1272 }
1273
1274 static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1275 cs->b0 = buffer + mirror(-1-1, height-1)*stride;
1276 cs->b1 = buffer + mirror(-1 , height-1)*stride;
1277 cs->y = -1;
1278 }
1279
1280 static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1281 int y= cs->y;
1282
1283 DWTELEM *b0= cs->b0;
1284 DWTELEM *b1= cs->b1;
1285 DWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line);
1286 DWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line);
1287
1288 {START_TIMER
1289 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1290 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1291 STOP_TIMER("vertical_compose53i*")}
1292
1293 {START_TIMER
1294 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1295 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1296 STOP_TIMER("horizontal_compose53i")}
1297
1298 cs->b0 = b2;
1299 cs->b1 = b3;
1300 cs->y += 2;
1301 }
1302
1303 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1304 int y= cs->y;
1305 DWTELEM *b0= cs->b0;
1306 DWTELEM *b1= cs->b1;
1307 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1308 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1309
1310 {START_TIMER
1311 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1312 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1313 STOP_TIMER("vertical_compose53i*")}
1314
1315 {START_TIMER
1316 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1317 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1318 STOP_TIMER("horizontal_compose53i")}
1319
1320 cs->b0 = b2;
1321 cs->b1 = b3;
1322 cs->y += 2;
1323 }
1324
1325 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1326 dwt_compose_t cs;
1327 spatial_compose53i_init(&cs, buffer, height, stride);
1328 while(cs.y <= height)
1329 spatial_compose53i_dy(&cs, buffer, width, height, stride);
1330 }
1331
1332
1333 void ff_snow_horizontal_compose97i(DWTELEM *b, int width){
1334 DWTELEM temp[width];
1335 const int w2= (width+1)>>1;
1336
1337 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1338 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1339 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1340 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1341 }
1342
1343 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1344 int i;
1345
1346 for(i=0; i<width; i++){
1347 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1348 }
1349 }
1350
1351 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1352 int i;
1353
1354 for(i=0; i<width; i++){
1355 #ifdef lift5
1356 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1357 #else
1358 int r= 3*(b0[i] + b2[i]);
1359 r+= r>>4;
1360 r+= r>>8;
1361 b1[i] -= (r+W_CO)>>W_CS;
1362 #endif
1363 }
1364 }
1365
1366 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1367 int i;
1368
1369 for(i=0; i<width; i++){
1370 #ifdef liftS
1371 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1372 #else
1373 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1374 #endif
1375 }
1376 }
1377
1378 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1379 int i;
1380
1381 for(i=0; i<width; i++){
1382 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1383 }
1384 }
1385
1386 void ff_snow_vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1387 int i;
1388
1389 for(i=0; i<width; i++){
1390 #ifndef lift5
1391 int r;
1392 #endif
1393 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1394 #ifdef lift5
1395 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1396 #else
1397 r= 3*(b2[i] + b4[i]);
1398 r+= r>>4;
1399 r+= r>>8;
1400 b3[i] -= (r+W_CO)>>W_CS;
1401 #endif
1402 #ifdef liftS
1403 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1404 #else
1405 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1406 #endif
1407 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1408 }
1409 }
1410
1411 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1412 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1413 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
1414 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1415 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1416 cs->y = -3;
1417 }
1418
1419 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1420 cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1421 cs->b1 = buffer + mirror(-3 , height-1)*stride;
1422 cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1423 cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1424 cs->y = -3;
1425 }
1426
1427 static void spatial_compose97i_dy_buffered(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1428 int y = cs->y;
1429
1430 DWTELEM *b0= cs->b0;
1431 DWTELEM *b1= cs->b1;
1432 DWTELEM *b2= cs->b2;
1433 DWTELEM *b3= cs->b3;
1434 DWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line);
1435 DWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line);
1436
1437 {START_TIMER
1438 if(y>0 && y+4<height){
1439 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1440 }else{
1441 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1442 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1443 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1444 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1445 }
1446 if(width>400){
1447 STOP_TIMER("vertical_compose97i")}}
1448
1449 {START_TIMER
1450 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width);
1451 if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width);
1452 if(width>400 && y+0<(unsigned)height){
1453 STOP_TIMER("horizontal_compose97i")}}
1454
1455 cs->b0=b2;
1456 cs->b1=b3;
1457 cs->b2=b4;
1458 cs->b3=b5;
1459 cs->y += 2;
1460 }
1461
1462 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1463 int y = cs->y;
1464 DWTELEM *b0= cs->b0;
1465 DWTELEM *b1= cs->b1;
1466 DWTELEM *b2= cs->b2;
1467 DWTELEM *b3= cs->b3;
1468 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1469 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1470
1471 {START_TIMER
1472 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1473 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1474 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1475 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1476 if(width>400){
1477 STOP_TIMER("vertical_compose97i")}}
1478
1479 {START_TIMER
1480 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width);
1481 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width);
1482 if(width>400 && b0 <= b2){
1483 STOP_TIMER("horizontal_compose97i")}}
1484
1485 cs->b0=b2;
1486 cs->b1=b3;
1487 cs->b2=b4;
1488 cs->b3=b5;
1489 cs->y += 2;
1490 }
1491
1492 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1493 dwt_compose_t cs;
1494 spatial_compose97i_init(&cs, buffer, height, stride);
1495 while(cs.y <= height)
1496 spatial_compose97i_dy(&cs, buffer, width, height, stride);
1497 }
1498
1499 static void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
1500 int level;
1501 for(level=decomposition_count-1; level>=0; level--){
1502 switch(type){
1503 case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1504 case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1505 /* not slicified yet */
1506 case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1507 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1508 }
1509 }
1510 }
1511
1512 static void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1513 int level;
1514 for(level=decomposition_count-1; level>=0; level--){
1515 switch(type){
1516 case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1517 case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1518 /* not slicified yet */
1519 case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1520 }
1521 }
1522 }
1523
1524 static void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1525 const int support = type==1 ? 3 : 5;
1526 int level;
1527 if(type==2) return;
1528
1529 for(level=decomposition_count-1; level>=0; level--){
1530 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1531 switch(type){
1532 case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1533 break;
1534 case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1535 break;
1536 case 2: break;
1537 }
1538 }
1539 }
1540 }
1541
1542 static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
1543 const int support = type==1 ? 3 : 5;
1544 int level;
1545 if(type==2) return;
1546
1547 for(level=decomposition_count-1; level>=0; level--){
1548 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1549 switch(type){
1550 case 0: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1551 break;
1552 case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1553 break;
1554 case 2: break;
1555 }
1556 }
1557 }
1558 }
1559
1560 static void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1561 if(type==2){
1562 int level;
1563 for(level=decomposition_count-1; level>=0; level--)
1564 spatial_composeX (buffer, width>>level, height>>level, stride<<level);
1565 }else{
1566 dwt_compose_t cs[MAX_DECOMPOSITIONS];
1567 int y;
1568 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1569 for(y=0; y<height; y+=4)
1570 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1571 }
1572 }
1573
1574 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1575 const int w= b->width;
1576 const int h= b->height;
1577 int x, y;
1578
1579 if(1){
1580 int run=0;
1581 int runs[w*h];
1582 int run_index=0;
1583 int max_index;
1584
1585 for(y=0; y<h; y++){
1586 for(x=0; x<w; x++){
1587 int v, p=0;
1588 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1589 v= src[x + y*stride];
1590
1591 if(y){
1592 t= src[x + (y-1)*stride];
1593 if(x){
1594 lt= src[x - 1 + (y-1)*stride];
1595 }
1596 if(x + 1 < w){
1597 rt= src[x + 1 + (y-1)*stride];
1598 }
1599 }
1600 if(x){
1601 l= src[x - 1 + y*stride];
1602 /*if(x > 1){
1603 if(orientation==1) ll= src[y + (x-2)*stride];
1604 else ll= src[x - 2 + y*stride];
1605 }*/
1606 }
1607 if(parent){
1608 int px= x>>1;
1609 int py= y>>1;
1610 if(px<b->parent->width && py<b->parent->height)
1611 p= parent[px + py*2*stride];
1612 }
1613 if(!(/*ll|*/l|lt|t|rt|p)){
1614 if(v){
1615 runs[run_index++]= run;
1616 run=0;
1617 }else{
1618 run++;
1619 }
1620 }
1621 }
1622 }
1623 max_index= run_index;
1624 runs[run_index++]= run;
1625 run_index=0;
1626 run= runs[run_index++];
1627
1628 put_symbol2(&s->c, b->state[30], max_index, 0);
1629 if(run_index <= max_index)
1630 put_symbol2(&s->c, b->state[1], run, 3);
1631
1632 for(y=0; y<h; y++){
1633 if(s->c.bytestream_end - s->c.bytestream < w*40){
1634 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1635 return -1;
1636 }
1637 for(x=0; x<w; x++){
1638 int v, p=0;
1639 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1640 v= src[x + y*stride];
1641
1642 if(y){
1643 t= src[x + (y-1)*stride];
1644 if(x){
1645 lt= src[x - 1 + (y-1)*stride];
1646 }
1647 if(x + 1 < w){
1648 rt= src[x + 1 + (y-1)*stride];
1649 }
1650 }
1651 if(x){
1652 l= src[x - 1 + y*stride];
1653 /*if(x > 1){
1654 if(orientation==1) ll= src[y + (x-2)*stride];
1655 else ll= src[x - 2 + y*stride];
1656 }*/
1657 }
1658 if(parent){
1659 int px= x>>1;
1660 int py= y>>1;
1661 if(px<b->parent->width && py<b->parent->height)
1662 p= parent[px + py*2*stride];
1663 }
1664 if(/*ll|*/l|lt|t|rt|p){
1665 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1666
1667 put_rac(&s->c, &b->state[0][context], !!v);
1668 }else{
1669 if(!run){
1670 run= runs[run_index++];
1671
1672 if(run_index <= max_index)
1673 put_symbol2(&s->c, b->state[1], run, 3);
1674 assert(v);
1675 }else{
1676 run--;
1677 assert(!v);
1678 }
1679 }
1680 if(v){
1681 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1682 int l2= 2*ABS(l) + (l<0);
1683 int t2= 2*ABS(t) + (t<0);
1684
1685 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1686 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1687 }
1688 }
1689 }
1690 }
1691 return 0;
1692 }
1693
1694 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1695 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1696 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1697 return encode_subband_c0run(s, b, src, parent, stride, orientation);
1698 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1699 }
1700
1701 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1702 const int w= b->width;
1703 const int h= b->height;
1704 int x,y;
1705
1706 if(1){
1707 int run, runs;
1708 x_and_coeff *xc= b->x_coeff;
1709 x_and_coeff *prev_xc= NULL;
1710 x_and_coeff *prev2_xc= xc;
1711 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1712 x_and_coeff *prev_parent_xc= parent_xc;
1713
1714 runs= get_symbol2(&s->c, b->state[30], 0);
1715 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1716 else run= INT_MAX;
1717
1718 for(y=0; y<h; y++){
1719 int v=0;
1720 int lt=0, t=0, rt=0;
1721
1722 if(y && prev_xc->x == 0){
1723 rt= prev_xc->coeff;
1724 }
1725 for(x=0; x<w; x++){
1726 int p=0;
1727 const int l= v;
1728
1729 lt= t; t= rt;
1730
1731 if(y){
1732 if(prev_xc->x <= x)
1733 prev_xc++;
1734 if(prev_xc->x == x + 1)
1735 rt= prev_xc->coeff;
1736 else
1737 rt=0;
1738 }
1739 if(parent_xc){
1740 if(x>>1 > parent_xc->x){
1741 parent_xc++;
1742 }
1743 if(x>>1 == parent_xc->x){
1744 p= parent_xc->coeff;
1745 }
1746 }
1747 if(/*ll|*/l|lt|t|rt|p){
1748 int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1749
1750 v=get_rac(&s->c, &b->state[0][context]);
1751 if(v){
1752 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1753 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1754
1755 xc->x=x;
1756 (xc++)->coeff= v;
1757 }
1758 }else{
1759 if(!run){
1760 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1761 else run= INT_MAX;
1762 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1763 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1764
1765 xc->x=x;
1766 (xc++)->coeff= v;
1767 }else{
1768 int max_run;
1769 run--;
1770 v=0;
1771
1772 if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1773 else max_run= FFMIN(run, w-x-1);
1774 if(parent_xc)
1775 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1776 x+= max_run;
1777 run-= max_run;
1778 }
1779 }
1780 }
1781 (xc++)->x= w+1; //end marker
1782 prev_xc= prev2_xc;
1783 prev2_xc= xc;
1784
1785 if(parent_xc){
1786 if(y&1){
1787 while(parent_xc->x != parent->width+1)
1788 parent_xc++;
1789 parent_xc++;
1790 prev_parent_xc= parent_xc;
1791 }else{
1792 parent_xc= prev_parent_xc;
1793 }
1794 }
1795 }
1796
1797 (xc++)->x= w+1; //end marker
1798 }
1799 }
1800
1801 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1802 const int w= b->width;
1803 int y;
1804 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1805 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1806 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1807 int new_index = 0;
1808
1809 START_TIMER
1810
1811 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1812 qadd= 0;
1813 qmul= 1<<QEXPSHIFT;
1814 }
1815
1816 /* If we are on the second or later slice, restore our index. */
1817 if (start_y != 0)
1818 new_index = save_state[0];
1819
1820
1821 for(y=start_y; y<h; y++){
1822 int x = 0;
1823 int v;
1824 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1825 memset(line, 0, b->width*sizeof(DWTELEM));
1826 v = b->x_coeff[new_index].coeff;
1827 x = b->x_coeff[new_index++].x;
1828 while(x < w)
1829 {
1830 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1831 register int u= -(v&1);
1832 line[x] = (t^u) - u;
1833
1834 v = b->x_coeff[new_index].coeff;
1835 x = b->x_coeff[new_index++].x;
1836 }
1837 }
1838 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1839 STOP_TIMER("decode_subband")
1840 }
1841
1842 /* Save our variables for the next slice. */
1843 save_state[0] = new_index;
1844
1845 return;
1846 }
1847
1848 static void reset_contexts(SnowContext *s){
1849 int plane_index, level, orientation;
1850
1851 for(plane_index=0; plane_index<3; plane_index++){
1852 for(level=0; level<s->spatial_decomposition_count; level++){
1853 for(orientation=level ? 1:0; orientation<4; orientation++){
1854 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1855 }
1856 }
1857 }
1858 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1859 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1860 }
1861
1862 static int alloc_blocks(SnowContext *s){
1863 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1864 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1865
1866 s->b_width = w;
1867 s->b_height= h;
1868
1869 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1870 return 0;
1871 }
1872
1873 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1874 uint8_t *bytestream= d->bytestream;
1875 uint8_t *bytestream_start= d->bytestream_start;
1876 *d= *s;
1877 d->bytestream= bytestream;
1878 d->bytestream_start= bytestream_start;
1879 }
1880
1881 //near copy & paste from dsputil, FIXME
1882 static int pix_sum(uint8_t * pix, int line_size, int w)
1883 {
1884 int s, i, j;
1885
1886 s = 0;
1887 for (i = 0; i < w; i++) {
1888 for (j = 0; j < w; j++) {
1889 s += pix[0];
1890 pix ++;
1891 }
1892 pix += line_size - w;
1893 }
1894 return s;
1895 }
1896
1897 //near copy & paste from dsputil, FIXME
1898 static int pix_norm1(uint8_t * pix, int line_size, int w)
1899 {
1900 int s, i, j;
1901 uint32_t *sq = squareTbl + 256;
1902
1903 s = 0;
1904 for (i = 0; i < w; i++) {
1905 for (j = 0; j < w; j ++) {
1906 s += sq[pix[0]];
1907 pix ++;
1908 }
1909 pix += line_size - w;
1910 }
1911 return s;
1912 }
1913
1914 static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int ref, int type){
1915 const int w= s->b_width << s->block_max_depth;
1916 const int rem_depth= s->block_max_depth - level;
1917 const int index= (x + y*w) << rem_depth;
1918 const int block_w= 1<<rem_depth;
1919 BlockNode block;
1920 int i,j;
1921
1922 block.color[0]= l;
1923 block.color[1]= cb;
1924 block.color[2]= cr;
1925 block.mx= mx;
1926 block.my= my;
1927 block.ref= ref;
1928 block.type= type;
1929 block.level= level;
1930
1931 for(j=0; j<block_w; j++){
1932 for(i=0; i<block_w; i++){
1933 s->block[index + i + j*w]= block;
1934 }
1935 }
1936 }
1937
1938 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){
1939 const int offset[3]= {
1940 y*c-> stride + x,
1941 ((y*c->uvstride + x)>>1),
1942 ((y*c->uvstride + x)>>1),
1943 };
1944 int i;
1945 for(i=0; i<3; i++){
1946 c->src[0][i]= src [i];
1947 c->ref[0][i]= ref [i] + offset[i];
1948 }
1949 assert(!ref_index);
1950 }
1951
1952 //FIXME copy&paste
1953 #define P_LEFT P[1]
1954 #define P_TOP P[2]
1955 #define P_TOPRIGHT P[3]
1956 #define P_MEDIAN P[4]
1957 #define P_MV1 P[9]
1958 #define FLAG_QPEL 1 //must be 1
1959
1960 static int encode_q_branch(SnowContext *s, int level, int x, int y){
1961 uint8_t p_buffer[1024];
1962 uint8_t i_buffer[1024];
1963 uint8_t p_state[sizeof(s->block_state)];
1964 uint8_t i_state[sizeof(s->block_state)];
1965 RangeCoder pc, ic;
1966 uint8_t *pbbak= s->c.bytestream;
1967 uint8_t *pbbak_start= s->c.bytestream_start;
1968 int score, score2, iscore, i_len, p_len, block_s, sum;
1969 const int w= s->b_width << s->block_max_depth;
1970 const int h= s->b_height << s->block_max_depth;
1971 const int rem_depth= s->block_max_depth - level;
1972 const int index= (x + y*w) << rem_depth;
1973 const int block_w= 1<<(LOG2_MB_SIZE - level);
1974 int trx= (x+1)<<rem_depth;
1975 int try= (y+1)<<rem_depth;
1976 BlockNode *left = x ? &s->block[index-1] : &null_block;
1977 BlockNode *top = y ? &s->block[index-w] : &null_block;
1978 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
1979 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
1980 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
1981 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
1982 int pl = left->color[0];
1983 int pcb= left->color[1];
1984 int pcr= left->color[2];
1985 int pmx= mid_pred(left->mx, top->mx, tr->mx);
1986 int pmy= mid_pred(left->my, top->my, tr->my);
1987 int mx=0, my=0;
1988 int l,cr,cb;
1989 const int stride= s->current_picture.linesize[0];
1990 const int uvstride= s->current_picture.linesize[1];
1991 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w,
1992 s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
1993 s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
1994 int P[10][2];
1995 int16_t last_mv[3][2];
1996 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
1997 const int shift= 1+qpel;
1998 MotionEstContext *c= &s->m.me;
1999 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
2000 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2001 int my_context= av_log2(2*ABS(left->my - top->my));
2002 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2003 int ref, best_ref, ref_score, ref_mx, ref_my;
2004
2005 assert(sizeof(s->block_state) >= 256);
2006 if(s->keyframe){
2007 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, 0, BLOCK_INTRA);
2008 return 0;
2009 }
2010
2011 // clip predictors / edge ?
2012
2013 P_LEFT[0]= left->mx;
2014 P_LEFT[1]= left->my;
2015 P_TOP [0]= top->mx;
2016 P_TOP [1]= top->my;
2017 P_TOPRIGHT[0]= tr->mx;
2018 P_TOPRIGHT[1]= tr->my;
2019
2020 last_mv[0][0]= s->block[index].mx;
2021 last_mv[0][1]= s->block[index].my;
2022 last_mv[1][0]= right->mx;
2023 last_mv[1][1]= right->my;
2024 last_mv[2][0]= bottom->mx;
2025 last_mv[2][1]= bottom->my;
2026
2027 s->m.mb_stride=2;
2028 s->m.mb_x=
2029 s->m.mb_y= 0;
2030 s->m.me.skip= 0;
2031
2032 assert(s->m.me. stride == stride);
2033 assert(s->m.me.uvstride == uvstride);
2034
2035 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2036 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2037 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2038 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2039
2040 c->xmin = - x*block_w - 16+2;
2041 c->ymin = - y*block_w - 16+2;
2042 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2043 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2044
2045 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
2046 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
2047 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
2048 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
2049 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2050 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2051 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2052
2053 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[