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