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