2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
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.
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.
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
23 #include "rangecoder.h"
26 #include "mpegvideo.h"
31 #define MAX_DECOMPOSITIONS 8
35 #define QROOT (1<<QSHIFT)
36 #define LOSSLESS_QLOG -128
39 static const int8_t quant3[256]={
40 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
57 static const int8_t quant3b[256]={
58 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
65 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
72 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
73 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75 static const int8_t quant3bA[256]={
76 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
84 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
85 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
86 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
87 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
88 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
89 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
90 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
91 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
93 static const int8_t quant5[256]={
94 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
96 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
97 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-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,-2,-2,
106 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
107 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
108 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
109 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
111 static const int8_t quant7[256]={
112 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
113 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
114 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
115 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
116 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
118 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
119 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
120 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
121 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
122 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
123 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
124 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
125 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
126 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
127 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
129 static const int8_t quant9[256]={
130 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
131 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
132 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
133 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
134 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
135 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
136 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
137 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
138 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
139 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-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,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
145 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
147 static const int8_t quant11[256]={
148 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
149 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
150 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
151 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
152 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
153 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
154 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
155 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
160 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
162 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
163 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
165 static const int8_t quant13[256]={
166 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
167 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
168 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
169 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
170 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
171 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
172 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
173 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
174 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
175 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
176 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
177 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
178 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
179 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
180 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
181 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
184 #define LOG2_OBMC_MAX 6
185 #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
187 static const uint8_t obmc32[1024]={
188 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,
189 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,
190 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,
191 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,
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, 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,
194 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
195 0, 1, 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,
196 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,
197 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,
198 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,
199 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,
200 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,
201 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,
202 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,
203 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,
204 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,
205 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,
206 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,
207 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,
208 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,
209 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,
210 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,
211 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,
212 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,
213 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,
214 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,
215 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,
216 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,
217 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,
218 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,
219 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,
222 static const uint8_t obmc16[256]={
223 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
224 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
225 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
226 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
227 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
228 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
229 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
230 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
231 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
232 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
233 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
234 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
235 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
236 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
237 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
238 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
242 static const uint8_t obmc32[1024]={
243 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,
244 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,
245 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,
246 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,
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 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,
249 1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
250 1, 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,
251 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,
252 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,
253 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,
254 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,
255 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,
256 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,
257 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,
258 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,
259 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,
260 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,
261 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,
262 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,
263 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,
264 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,
265 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,
266 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,
267 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,
268 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,
269 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,
270 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,
271 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,
272 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,
273 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,
274 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,
277 static const uint8_t obmc16[256]={
278 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
279 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
280 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
281 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
282 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
283 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
284 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
285 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
286 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
287 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
288 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
289 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
290 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
291 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
292 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
293 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
297 static const uint8_t obmc32[1024]={
298 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,
299 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,
300 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,
301 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,
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, 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,
304 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
305 0, 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,
306 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,
307 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,
308 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,
309 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,
310 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,
311 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,
312 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,
313 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,
314 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,
315 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,
316 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,
317 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,
318 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,
319 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,
320 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,
321 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,
322 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,
323 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,
324 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,
325 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,
326 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,
327 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,
328 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,
329 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,
332 static const uint8_t obmc16[256]={
333 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
334 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
335 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
336 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
337 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
338 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
339 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
340 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
341 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
342 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
343 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
344 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
345 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
346 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
347 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
348 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
354 static const uint8_t obmc8[64]={
355 1, 3, 5, 7, 7, 5, 3, 1,
356 3, 9,15,21,21,15, 9, 3,
357 5,15,25,35,35,25,15, 5,
358 7,21,35,49,49,35,21, 7,
359 7,21,35,49,49,35,21, 7,
360 5,15,25,35,35,25,15, 5,
361 3, 9,15,21,21,15, 9, 3,
362 1, 3, 5, 7, 7, 5, 3, 1,
367 static const uint8_t obmc4[16]={
375 static const uint8_t *obmc_tab[4]={
376 obmc32, obmc16, obmc8, obmc4
379 typedef struct BlockNode{
384 //#define TYPE_SPLIT 1
385 #define BLOCK_INTRA 1
387 //#define TYPE_NOCOLOR 4
388 uint8_t level; //FIXME merge into type?
391 static const BlockNode null_block= { //FIXME add border maybe
392 .color= {128,128,128},
399 #define LOG2_MB_SIZE 4
400 #define MB_SIZE (1<<LOG2_MB_SIZE)
402 typedef struct x_and_coeff{
407 typedef struct SubBand{
412 int qlog; ///< log(qscale)/log[2^(1/6)]
416 int stride_line; ///< Stride measured in lines, not pixels.
417 x_and_coeff * x_coeff;
418 struct SubBand *parent;
419 uint8_t state[/*7*2*/ 7 + 512][32];
422 typedef struct Plane{
425 SubBand band[MAX_DECOMPOSITIONS][4];
428 /** Used to minimize the amount of memory used in order to optimize cache performance. **/
430 DWTELEM * * line; ///< For use by idwt and predict_slices.
431 DWTELEM * * data_stack; ///< Used for internal purposes.
436 DWTELEM * base_buffer; ///< Buffer that this structure is caching.
439 typedef struct SnowContext{
440 // 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)
442 AVCodecContext *avctx;
446 AVFrame input_picture; ///< new_picture with the internal linesizes
447 AVFrame current_picture;
448 AVFrame last_picture;
449 AVFrame mconly_picture;
450 // uint8_t q_context[16];
451 uint8_t header_state[32];
452 uint8_t block_state[128 + 32*128];
456 int spatial_decomposition_type;
457 int temporal_decomposition_type;
458 int spatial_decomposition_count;
459 int temporal_decomposition_count;
460 DWTELEM *spatial_dwt_buffer;
464 int spatial_scalability;
470 #define QBIAS_SHIFT 3
474 Plane plane[MAX_PLANES];
476 #define ME_CACHE_SIZE 1024
477 int me_cache[ME_CACHE_SIZE];
478 int me_cache_generation;
481 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)
492 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
493 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
495 static void iterative_me(SnowContext *s);
497 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
501 buf->base_buffer = base_buffer;
502 buf->line_count = line_count;
503 buf->line_width = line_width;
504 buf->data_count = max_allocated_lines;
505 buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
506 buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
508 for (i = 0; i < max_allocated_lines; i++)
510 buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
513 buf->data_stack_top = max_allocated_lines - 1;
516 static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
521 // av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
523 assert(buf->data_stack_top >= 0);
524 // assert(!buf->line[line]);
526 return buf->line[line];
528 offset = buf->line_width * line;
529 buffer = buf->data_stack[buf->data_stack_top];
530 buf->data_stack_top--;
531 buf->line[line] = buffer;
533 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
538 static void slice_buffer_release(slice_buffer * buf, int line)
543 assert(line >= 0 && line < buf->line_count);
544 assert(buf->line[line]);
546 offset = buf->line_width * line;
547 buffer = buf->line[line];
548 buf->data_stack_top++;
549 buf->data_stack[buf->data_stack_top] = buffer;
550 buf->line[line] = NULL;
552 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
555 static void slice_buffer_flush(slice_buffer * buf)
558 for (i = 0; i < buf->line_count; i++)
562 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
563 slice_buffer_release(buf, i);
568 static void slice_buffer_destroy(slice_buffer * buf)
571 slice_buffer_flush(buf);
573 for (i = buf->data_count - 1; i >= 0; i--)
575 assert(buf->data_stack[i]);
576 av_free(buf->data_stack[i]);
578 assert(buf->data_stack);
579 av_free(buf->data_stack);
585 // Avoid a name clash on SGI IRIX
588 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
589 static uint8_t qexp[QROOT];
591 static inline int mirror(int v, int m){
592 while((unsigned)v > (unsigned)m){
599 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
604 const int e= av_log2(a);
606 const int el= FFMIN(e, 10);
607 put_rac(c, state+0, 0);
610 put_rac(c, state+1+i, 1); //1..10
613 put_rac(c, state+1+9, 1); //1..10
615 put_rac(c, state+1+FFMIN(i,9), 0);
617 for(i=e-1; i>=el; i--){
618 put_rac(c, state+22+9, (a>>i)&1); //22..31
621 put_rac(c, state+22+i, (a>>i)&1); //22..31
625 put_rac(c, state+11 + el, v < 0); //11..21
628 put_rac(c, state+0, 0);
631 put_rac(c, state+1+i, 1); //1..10
633 put_rac(c, state+1+i, 0);
635 for(i=e-1; i>=0; i--){
636 put_rac(c, state+22+i, (a>>i)&1); //22..31
640 put_rac(c, state+11 + e, v < 0); //11..21
643 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
645 put_rac(c, state+1+FFMIN(i,9), 0);
647 for(i=e-1; i>=0; i--){
648 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
652 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
656 put_rac(c, state+0, 1);
660 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
661 if(get_rac(c, state+0))
666 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
671 for(i=e-1; i>=0; i--){
672 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
675 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
682 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
684 int r= log2>=0 ? 1<<log2 : 1;
690 put_rac(c, state+4+log2, 1);
695 put_rac(c, state+4+log2, 0);
697 for(i=log2-1; i>=0; i--){
698 put_rac(c, state+31-i, (v>>i)&1);
702 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
704 int r= log2>=0 ? 1<<log2 : 1;
709 while(get_rac(c, state+4+log2)){
715 for(i=log2-1; i>=0; i--){
716 v+= get_rac(c, state+31-i)<<i;
722 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){
723 const int mirror_left= !highpass;
724 const int mirror_right= (width&1) ^ highpass;
725 const int w= (width>>1) - 1 + (highpass & width);
728 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
730 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
736 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
740 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
744 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){
745 const int mirror_left= !highpass;
746 const int mirror_right= (width&1) ^ highpass;
747 const int w= (width>>1) - 1 + (highpass & width);
754 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
760 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
763 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
767 int r= 3*2*ref[w*ref_step];
770 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
774 static always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
775 const int mirror_left= !highpass;
776 const int mirror_right= (width&1) ^ highpass;
777 const int w= (width>>1) - 1 + (highpass & width);
781 #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
783 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
789 dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
793 dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
798 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
801 for(x=start; x<width; x+=2){
805 int x2= x + 2*i - n + 1;
807 else if(x2>=width) x2= 2*width-x2-2;
808 sum += coeffs[i]*(int64_t)dst[x2];
810 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
811 else dst[x] += (sum + (1<<shift)/2)>>shift;
815 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
817 for(y=start; y<height; y+=2){
818 for(x=0; x<width; x++){
822 int y2= y + 2*i - n + 1;
824 else if(y2>=height) y2= 2*height-y2-2;
825 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
827 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
828 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
837 #if 0 // more accurate 9/7
840 #define COEFFS1 (int[]){-25987,-25987}
843 #define COEFFS2 (int[]){-27777,-27777}
846 #define COEFFS3 (int[]){28931,28931}
849 #define COEFFS4 (int[]){14533,14533}
853 #define COEFFS1 (int[]){1,-9,-9,1}
856 #define COEFFS2 (int[]){-1,5,5,-1}
869 #define COEFFS1 (int[]){1,1}
872 #define COEFFS2 (int[]){-1,-1}
885 #define COEFFS2 (int[]){-1,-1}
888 #define COEFFS3 (int[]){-1,-1}
891 #define COEFFS4 (int[]){-5,29,29,-5}
896 #define COEFFS1 (int[]){-203,-203}
899 #define COEFFS2 (int[]){-217,-217}
902 #define COEFFS3 (int[]){113,113}
905 #define COEFFS4 (int[]){227,227}
913 #define COEFFS2 (int[]){-1,-1}
916 #define COEFFS3 (int[]){-1,-1}
919 #define COEFFS4 (int[]){3,3}
923 #define COEFFS1 (int[]){1,-9,-9,1}
926 #define COEFFS2 (int[]){1,1}
936 #define COEFFS1 (int[]){1,-9,-9,1}
939 #define COEFFS2 (int[]){-1,5,5,-1}
947 static void horizontal_decomposeX(DWTELEM *b, int width){
949 const int width2= width>>1;
950 const int w2= (width+1)>>1;
953 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
954 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
955 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
956 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
958 for(x=0; x<width2; x++){
960 temp[x+w2]= b[2*x + 1];
964 memcpy(b, temp, width*sizeof(int));
967 static void horizontal_composeX(DWTELEM *b, int width){
969 const int width2= width>>1;
971 const int w2= (width+1)>>1;
973 memcpy(temp, b, width*sizeof(int));
974 for(x=0; x<width2; x++){
976 b[2*x + 1]= temp[x+w2];
981 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
982 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
983 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
984 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
987 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
990 for(y=0; y<height; y++){
991 for(x=0; x<width; x++){
992 buffer[y*stride + x] *= SCALEX;
996 for(y=0; y<height; y++){
997 horizontal_decomposeX(buffer + y*stride, width);
1000 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
1001 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
1002 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
1003 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
1006 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
1009 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
1010 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
1011 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
1012 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
1014 for(y=0; y<height; y++){
1015 horizontal_composeX(buffer + y*stride, width);
1018 for(y=0; y<height; y++){
1019 for(x=0; x<width; x++){
1020 buffer[y*stride + x] /= SCALEX;
1025 static void horizontal_decompose53i(DWTELEM *b, int width){
1026 DWTELEM temp[width];
1027 const int width2= width>>1;
1029 const int w2= (width+1)>>1;
1031 for(x=0; x<width2; x++){
1033 temp[x+w2]= b[2*x + 1];
1047 for(x=1; x+1<width2; x+=2){
1051 A2 += (A1 + A3 + 2)>>2;
1055 A1= temp[x+1+width2];
1058 A4 += (A1 + A3 + 2)>>2;
1064 A2 += (A1 + A3 + 2)>>2;
1069 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1070 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
1074 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1077 for(i=0; i<width; i++){
1078 b1[i] -= (b0[i] + b2[i])>>1;
1082 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1085 for(i=0; i<width; i++){
1086 b1[i] += (b0[i] + b2[i] + 2)>>2;
1090 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
1092 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1093 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
1095 for(y=-2; y<height; y+=2){
1096 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1097 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1100 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);
1101 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);
1102 STOP_TIMER("horizontal_decompose53i")}
1105 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);
1106 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);
1107 STOP_TIMER("vertical_decompose53i*")}
1184 static void horizontal_decompose97i(DWTELEM *b, int width){
1185 DWTELEM temp[width];
1186 const int w2= (width+1)>>1;
1188 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1189 liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1190 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1191 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1195 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1198 for(i=0; i<width; i++){
1199 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1203 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1206 for(i=0; i<width; i++){
1208 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1210 int r= 3*(b0[i] + b2[i]);
1213 b1[i] += (r+W_CO)>>W_CS;
1218 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1221 for(i=0; i<width; i++){
1223 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1225 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
1230 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1233 for(i=0; i<width; i++){
1234 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1238 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1240 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1241 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1242 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1243 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1245 for(y=-4; y<height; y+=2){
1246 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1247 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1250 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width);
1251 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width);
1253 STOP_TIMER("horizontal_decompose97i")
1257 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width);
1258 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width);
1259 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width);
1260 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width);
1263 STOP_TIMER("vertical_decompose97i")
1273 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1276 for(level=0; level<decomposition_count; level++){
1278 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1279 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1280 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1285 static void horizontal_compose53i(DWTELEM *b, int width){
1286 DWTELEM temp[width];
1287 const int width2= width>>1;
1288 const int w2= (width+1)>>1;
1300 for(x=1; x+1<width2; x+=2){
1304 A2 += (A1 + A3 + 2)>>2;
1308 A1= temp[x+1+width2];
1311 A4 += (A1 + A3 + 2)>>2;
1317 A2 += (A1 + A3 + 2)>>2;
1321 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1322 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1324 for(x=0; x<width2; x++){
1326 b[2*x + 1]= temp[x+w2];
1332 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1335 for(i=0; i<width; i++){
1336 b1[i] += (b0[i] + b2[i])>>1;
1340 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1343 for(i=0; i<width; i++){
1344 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1348 static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1349 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
1350 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line);
1354 static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1355 cs->b0 = buffer + mirror(-1-1, height-1)*stride;
1356 cs->b1 = buffer + mirror(-1 , height-1)*stride;
1360 static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1362 int mirror0 = mirror(y-1, height-1);
1363 int mirror1 = mirror(y , height-1);
1364 int mirror2 = mirror(y+1, height-1);
1365 int mirror3 = mirror(y+2, height-1);
1367 DWTELEM *b0= cs->b0;
1368 DWTELEM *b1= cs->b1;
1369 DWTELEM *b2= slice_buffer_get_line(sb, mirror2 * stride_line);
1370 DWTELEM *b3= slice_buffer_get_line(sb, mirror3 * stride_line);
1373 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1374 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1375 STOP_TIMER("vertical_compose53i*")}
1378 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1379 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1380 STOP_TIMER("horizontal_compose53i")}
1387 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1389 DWTELEM *b0= cs->b0;
1390 DWTELEM *b1= cs->b1;
1391 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1392 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1395 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1396 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1397 STOP_TIMER("vertical_compose53i*")}
1400 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1401 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1402 STOP_TIMER("horizontal_compose53i")}
1409 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1411 spatial_compose53i_init(&cs, buffer, height, stride);
1412 while(cs.y <= height)
1413 spatial_compose53i_dy(&cs, buffer, width, height, stride);
1417 static void horizontal_compose97i(DWTELEM *b, int width){
1418 DWTELEM temp[width];
1419 const int w2= (width+1)>>1;
1421 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1422 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1423 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1424 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1427 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1430 for(i=0; i<width; i++){
1431 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1435 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1438 for(i=0; i<width; i++){
1440 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1442 int r= 3*(b0[i] + b2[i]);
1445 b1[i] -= (r+W_CO)>>W_CS;
1450 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1453 for(i=0; i<width; i++){
1455 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1457 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1462 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1465 for(i=0; i<width; i++){
1466 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1470 static void vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1473 for(i=0; i<width; i++){
1477 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1479 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1481 r= 3*(b2[i] + b4[i]);
1484 b3[i] -= (r+W_CO)>>W_CS;
1487 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1489 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1491 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1495 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1496 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1497 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
1498 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1499 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1503 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1504 cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1505 cs->b1 = buffer + mirror(-3 , height-1)*stride;
1506 cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1507 cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1511 static void spatial_compose97i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1514 int mirror0 = mirror(y - 1, height - 1);
1515 int mirror1 = mirror(y + 0, height - 1);
1516 int mirror2 = mirror(y + 1, height - 1);
1517 int mirror3 = mirror(y + 2, height - 1);
1518 int mirror4 = mirror(y + 3, height - 1);
1519 int mirror5 = mirror(y + 4, height - 1);
1520 DWTELEM *b0= cs->b0;
1521 DWTELEM *b1= cs->b1;
1522 DWTELEM *b2= cs->b2;
1523 DWTELEM *b3= cs->b3;
1524 DWTELEM *b4= slice_buffer_get_line(sb, mirror4 * stride_line);
1525 DWTELEM *b5= slice_buffer_get_line(sb, mirror5 * stride_line);
1528 if(y>0 && y+4<height){
1529 vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1531 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1532 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1533 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1534 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1537 STOP_TIMER("vertical_compose97i")}}
1540 if(y-1<(unsigned)height) horizontal_compose97i(b0, width);
1541 if(y+0<(unsigned)height) horizontal_compose97i(b1, width);
1542 if(width>400 && mirror0 <= mirror2){
1543 STOP_TIMER("horizontal_compose97i")}}
1552 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1554 DWTELEM *b0= cs->b0;
1555 DWTELEM *b1= cs->b1;
1556 DWTELEM *b2= cs->b2;
1557 DWTELEM *b3= cs->b3;
1558 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1559 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1561 if(stride == width && y+4 < height && 0){
1563 for(x=0; x<width/2; x++)
1570 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1571 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1572 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1573 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1575 STOP_TIMER("vertical_compose97i")}}
1578 if(y-1<(unsigned)height) horizontal_compose97i(b0, width);
1579 if(y+0<(unsigned)height) horizontal_compose97i(b1, width);
1580 if(width>400 && b0 <= b2){
1581 STOP_TIMER("horizontal_compose97i")}}
1590 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1592 spatial_compose97i_init(&cs, buffer, height, stride);
1593 while(cs.y <= height)
1594 spatial_compose97i_dy(&cs, buffer, width, height, stride);
1597 void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
1599 for(level=decomposition_count-1; level>=0; level--){
1601 case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1602 case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1603 /* not slicified yet */
1604 case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1605 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1610 void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1612 for(level=decomposition_count-1; level>=0; level--){
1614 case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1615 case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1616 /* not slicified yet */
1617 case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1622 void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1623 const int support = type==1 ? 3 : 5;
1627 for(level=decomposition_count-1; level>=0; level--){
1628 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1630 case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1632 case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1640 void ff_spatial_idwt_buffered_slice(dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
1641 const int support = type==1 ? 3 : 5;
1645 for(level=decomposition_count-1; level>=0; level--){
1646 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1648 case 0: spatial_compose97i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1650 case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1658 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1661 for(level=decomposition_count-1; level>=0; level--)
1662 spatial_composeX (buffer, width>>level, height>>level, stride<<level);
1664 dwt_compose_t cs[MAX_DECOMPOSITIONS];
1666 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1667 for(y=0; y<height; y+=4)
1668 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1672 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1673 const int w= b->width;
1674 const int h= b->height;
1686 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1687 v= src[x + y*stride];
1690 t= src[x + (y-1)*stride];
1692 lt= src[x - 1 + (y-1)*stride];
1695 rt= src[x + 1 + (y-1)*stride];
1699 l= src[x - 1 + y*stride];
1701 if(orientation==1) ll= src[y + (x-2)*stride];
1702 else ll= src[x - 2 + y*stride];
1708 if(px<b->parent->width && py<b->parent->height)
1709 p= parent[px + py*2*stride];
1711 if(!(/*ll|*/l|lt|t|rt|p)){
1713 runs[run_index++]= run;
1721 max_index= run_index;
1722 runs[run_index++]= run;
1724 run= runs[run_index++];
1726 put_symbol2(&s->c, b->state[30], max_index, 0);
1727 if(run_index <= max_index)
1728 put_symbol2(&s->c, b->state[1], run, 3);
1731 if(s->c.bytestream_end - s->c.bytestream < w*40){
1732 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1737 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1738 v= src[x + y*stride];
1741 t= src[x + (y-1)*stride];
1743 lt= src[x - 1 + (y-1)*stride];
1746 rt= src[x + 1 + (y-1)*stride];
1750 l= src[x - 1 + y*stride];
1752 if(orientation==1) ll= src[y + (x-2)*stride];
1753 else ll= src[x - 2 + y*stride];
1759 if(px<b->parent->width && py<b->parent->height)
1760 p= parent[px + py*2*stride];
1762 if(/*ll|*/l|lt|t|rt|p){
1763 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1765 put_rac(&s->c, &b->state[0][context], !!v);
1768 run= runs[run_index++];
1770 if(run_index <= max_index)
1771 put_symbol2(&s->c, b->state[1], run, 3);
1779 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1780 int l2= 2*ABS(l) + (l<0);
1781 int t2= 2*ABS(t) + (t<0);
1783 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1784 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1792 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1793 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1794 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1795 return encode_subband_c0run(s, b, src, parent, stride, orientation);
1796 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1799 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1800 const int w= b->width;
1801 const int h= b->height;
1806 x_and_coeff *xc= b->x_coeff;
1807 x_and_coeff *prev_xc= NULL;
1808 x_and_coeff *prev2_xc= xc;
1809 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1810 x_and_coeff *prev_parent_xc= parent_xc;
1812 runs= get_symbol2(&s->c, b->state[30], 0);
1813 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1818 int lt=0, t=0, rt=0;
1820 if(y && prev_xc->x == 0){
1832 if(prev_xc->x == x + 1)
1838 if(x>>1 > parent_xc->x){
1841 if(x>>1 == parent_xc->x){
1842 p= parent_xc->coeff;
1845 if(/*ll|*/l|lt|t|rt|p){
1846 int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1848 v=get_rac(&s->c, &b->state[0][context]);
1850 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1851 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1858 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1860 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1861 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1870 if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1871 else max_run= FFMIN(run, w-x-1);
1873 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1879 (xc++)->x= w+1; //end marker
1885 while(parent_xc->x != parent->width+1)
1888 prev_parent_xc= parent_xc;
1890 parent_xc= prev_parent_xc;
1895 (xc++)->x= w+1; //end marker
1899 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1900 const int w= b->width;
1902 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1903 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1904 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1909 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1914 /* If we are on the second or later slice, restore our index. */
1916 new_index = save_state[0];
1919 for(y=start_y; y<h; y++){
1922 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1923 memset(line, 0, b->width*sizeof(DWTELEM));
1924 v = b->x_coeff[new_index].coeff;
1925 x = b->x_coeff[new_index++].x;
1928 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1929 register int u= -(v&1);
1930 line[x] = (t^u) - u;
1932 v = b->x_coeff[new_index].coeff;
1933 x = b->x_coeff[new_index++].x;
1936 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1937 STOP_TIMER("decode_subband")
1940 /* Save our variables for the next slice. */
1941 save_state[0] = new_index;
1946 static void reset_contexts(SnowContext *s){
1947 int plane_index, level, orientation;
1949 for(plane_index=0; plane_index<3; plane_index++){
1950 for(level=0; level<s->spatial_decomposition_count; level++){
1951 for(orientation=level ? 1:0; orientation<4; orientation++){
1952 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1956 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1957 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1960 static int alloc_blocks(SnowContext *s){
1961 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1962 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1967 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1971 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1972 uint8_t *bytestream= d->bytestream;
1973 uint8_t *bytestream_start= d->bytestream_start;
1975 d->bytestream= bytestream;
1976 d->bytestream_start= bytestream_start;
1979 //near copy & paste from dsputil, FIXME
1980 static int pix_sum(uint8_t * pix, int line_size, int w)
1985 for (i = 0; i < w; i++) {
1986 for (j = 0; j < w; j++) {
1990 pix += line_size - w;
1995 //near copy & paste from dsputil, FIXME
1996 static int pix_norm1(uint8_t * pix, int line_size, int w)
1999 uint32_t *sq = squareTbl + 256;
2002 for (i = 0; i < w; i++) {
2003 for (j = 0; j < w; j ++) {
2007 pix += line_size - w;
2012 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){
2013 const int w= s->b_width << s->block_max_depth;
2014 const int rem_depth= s->block_max_depth - level;
2015 const int index= (x + y*w) << rem_depth;
2016 const int block_w= 1<<rem_depth;
2028 for(j=0; j<block_w; j++){
2029 for(i=0; i<block_w; i++){
2030 s->block[index + i + j*w]= block;
2035 static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){
2036 const int offset[3]= {
2038 ((y*c->uvstride + x)>>1),
2039 ((y*c->uvstride + x)>>1),
2043 c->src[0][i]= src [i];
2044 c->ref[0][i]= ref [i] + offset[i];
2052 #define P_TOPRIGHT P[3]
2053 #define P_MEDIAN P[4]
2055 #define FLAG_QPEL 1 //must be 1
2057 static int encode_q_branch(SnowContext *s, int level, int x, int y){
2058 uint8_t p_buffer[1024];
2059 uint8_t i_buffer[1024];
2060 uint8_t p_state[sizeof(s->block_state)];
2061 uint8_t i_state[sizeof(s->block_state)];
2063 uint8_t *pbbak= s->c.bytestream;
2064 uint8_t *pbbak_start= s->c.bytestream_start;
2065 int score, score2, iscore, i_len, p_len, block_s, sum;
2066 const int w= s->b_width << s->block_max_depth;
2067 const int h= s->b_height << s->block_max_depth;
2068 const int rem_depth= s->block_max_depth - level;
2069 const int index= (x + y*w) << rem_depth;
2070 const int block_w= 1<<(LOG2_MB_SIZE - level);
2071 int trx= (x+1)<<rem_depth;
2072 int try= (y+1)<<rem_depth;
2073 BlockNode *left = x ? &s->block[index-1] : &null_block;
2074 BlockNode *top = y ? &s->block[index-w] : &null_block;
2075 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
2076 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
2077 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2078 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2079 int pl = left->color[0];
2080 int pcb= left->color[1];
2081 int pcr= left->color[2];
2082 int pmx= mid_pred(left->mx, top->mx, tr->mx);
2083 int pmy= mid_pred(left->my, top->my, tr->my);
2086 const int stride= s->current_picture.linesize[0];
2087 const int uvstride= s->current_picture.linesize[1];
2088 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w,
2089 s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
2090 s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
2092 int16_t last_mv[3][2];
2093 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
2094 const int shift= 1+qpel;
2095 MotionEstContext *c= &s->m.me;
2096 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2097 int my_context= av_log2(2*ABS(left->my - top->my));
2098 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2100 assert(sizeof(s->block_state) >= 256);
2102 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2106 // clip predictors / edge ?
2108 P_LEFT[0]= left->mx;
2109 P_LEFT[1]= left->my;
2112 P_TOPRIGHT[0]= tr->mx;
2113 P_TOPRIGHT[1]= tr->my;
2115 last_mv[0][0]= s->block[index].mx;
2116 last_mv[0][1]= s->block[index].my;
2117 last_mv[1][0]= right->mx;
2118 last_mv[1][1]= right->my;
2119 last_mv[2][0]= bottom->mx;
2120 last_mv[2][1]= bottom->my;
2127 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
2129 assert(s->m.me. stride == stride);
2130 assert(s->m.me.uvstride == uvstride);
2132 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2133 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2134 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2135 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2137 c->xmin = - x*block_w - 16+2;
2138 c->ymin = - y*block_w - 16+2;
2139 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2140 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2142 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
2143 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
2144 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
2145 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
2146 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2147 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2148 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2150 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
2151 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
2154 c->pred_x= P_LEFT[0];
2155 c->pred_y= P_LEFT[1];
2157 c->pred_x = P_MEDIAN[0];
2158 c->pred_y = P_MEDIAN[1];
2161 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
2162 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
2164 assert(mx >= c->xmin);
2165 assert(mx <= c->xmax);
2166 assert(my >= c->ymin);
2167 assert(my <= c->ymax);
2169 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
2170 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
2171 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
2175 pc.bytestream_start=
2176 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
2177 memcpy(p_state, s->block_state, sizeof(s->block_state));
2179 if(level!=s->block_max_depth)
2180 put_rac(&pc, &p_state[4 + s_context], 1);
2181 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
2182 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
2183 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
2184 p_len= pc.bytestream - pc.bytestream_start;
2185 score += (s->lambda2*(p_len*8
2186 + (pc.outstanding_count - s->c.outstanding_count)*8
2187 + (-av_log2(pc.range) + av_log2(s->c.range))
2188 ))>>FF_LAMBDA_SHIFT;
2190 block_s= block_w*block_w;
2191 sum = pix_sum(current_data[0], stride, block_w);
2192 l= (sum + block_s/2)/block_s;
2193 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
2195 block_s= block_w*block_w>>2;
2196 sum = pix_sum(current_data[1], uvstride, block_w>>1);
2197 cb= (sum + block_s/2)/block_s;
2198 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
2199 sum = pix_sum(current_data[2], uvstride, block_w>>1);
2200 cr= (sum + block_s/2)/block_s;
2201 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
2204 ic.bytestream_start=
2205 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
2206 memcpy(i_state, s->block_state, sizeof(s->block_state));
2207 if(level!=s->block_max_depth)
2208 put_rac(&ic, &i_state[4 + s_context], 1);
2209 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
2210 put_symbol(&ic, &i_state[32], l-pl , 1);
2211 put_symbol(&ic, &i_state[64], cb-pcb, 1);
2212 put_symbol(&ic, &i_state[96], cr-pcr, 1);
2213 i_len= ic.bytestream - ic.bytestream_start;
2214 iscore += (s->lambda2*(i_len*8
2215 + (ic.outstanding_count - s->c.outstanding_count)*8
2216 + (-av_log2(ic.range) + av_log2(s->c.range))
2217 ))>>FF_LAMBDA_SHIFT;
2219 // assert(score==256*256*256*64-1);
2220 assert(iscore < 255*255*256 + s->lambda2*10);
2221 assert(iscore >= 0);
2222 assert(l>=0 && l<=255);
2223 assert(pl>=0 && pl<=255);
2226 int varc= iscore >> 8;
2227 int vard= score >> 8;
2228 if (vard <= 64 || vard < varc)
2229 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
2231 c->scene_change_score+= s->m.qscale;
2234 if(level!=s->block_max_depth){
2235 put_rac(&s->c, &s->block_state[4 + s_context], 0);
2236 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
2237 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
2238 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
2239 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
2240 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
2242 if(score2 < score && score2 < iscore)
2247 memcpy(pbbak, i_buffer, i_len);
2249 s->c.bytestream_start= pbbak_start;
2250 s->c.bytestream= pbbak + i_len;
2251 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
2252 memcpy(s->block_state, i_state, sizeof(s->block_state));
2255 memcpy(pbbak, p_buffer, p_len);
2257 s->c.bytestream_start= pbbak_start;
2258 s->c.bytestream= pbbak + p_len;
2259 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
2260 memcpy(s->block_state, p_state, sizeof(s->block_state));
2265 static always_inline int same_block(BlockNode *a, BlockNode *b){
2266 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){
2267 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2]));
2269 return !((a->mx - b->mx) | (a->my - b->my) | ((a->type ^ b->type)&BLOCK_INTRA));
2273 static void encode_q_branch2(SnowContext *s, int level, int x, int y){
2274 const int w= s->b_width << s->block_max_depth;
2275 const int rem_depth= s->block_max_depth - level;
2276 const int index= (x + y*w) << rem_depth;
2277 int trx= (x+1)<<rem_depth;
2278 BlockNode *b= &s->block[index];
2279 BlockNode *left = x ? &s->block[index-1] : &null_block;
2280 BlockNode *top = y ? &s->block[index-w] : &null_block;
2281 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2282 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2283 int pl = left->color[0];
2284 int pcb= left->color[1];
2285 int pcr= left->color[2];
2286 int pmx= mid_pred(left->mx, top->mx, tr->mx);
2287 int pmy= mid_pred(left->my, top->my, tr->my);
2288 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2289 int my_context= av_log2(2*ABS(left->my - top->my));
2290 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2293 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2297 if(level!=s->block_max_depth){
2298 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){
2299 put_rac(&s->c, &s->block_state[4 + s_context], 1);
2301 put_rac(&s->c, &s->block_state[4 + s_context], 0);
2302 encode_q_branch2(s, level+1, 2*x+0, 2*y+0);
2303 encode_q_branch2(s, level+1, 2*x+1, 2*y+0);
2304 encode_q_branch2(s, level+1, 2*x+0, 2*y+1);
2305 encode_q_branch2(s, level+1, 2*x+1, 2*y+1);
2309 if(b->type & BLOCK_INTRA){
2310 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1);
2311 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1);
2312 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1);
2313 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1);
2314 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, BLOCK_INTRA);
2316 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0);
2317 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1);
2318 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1);
2319 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, 0);
2323 static void decode_q_branch(SnowContext *s, int level, int x, int y){
2324 const int w= s->b_width << s->block_max_depth;
2325 const int rem_depth= s->block_max_depth - level;
2326 const int index= (x + y*w) << rem_depth;
2327 int trx= (x+1)<<rem_depth;
2328 BlockNode *left = x ? &s->block[index-1] : &null_block;
2329 BlockNode *top = y ? &s->block[index-w] : &null_block;
2330 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2331 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2332 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2335 set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, BLOCK_INTRA);
2339 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
2341 int l = left->color[0];
2342 int cb= left->color[1];
2343 int cr= left->color[2];
2344 int mx= mid_pred(left->mx, top->mx, tr->mx);
2345 int my= mid_pred(left->my, top->my, tr->my);
2346 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
2347 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
2349 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
2352 l += get_symbol(&s->c, &s->block_state[32], 1);
2353 cb+= get_symbol(&s->c, &s->block_state[64], 1);
2354 cr+= get_symbol(&s->c, &s->block_state[96], 1);
2356 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
2357 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
2359 set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
2361 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
2362 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
2363 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
2364 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
2368 static void encode_blocks(SnowContext *s){
2373 if(s->avctx->me_method == ME_ITER && !s->keyframe)
2377 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
2378 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2382 if(s->avctx->me_method == ME_ITER)
2383 encode_q_branch2(s, 0, x, y);
2385 encode_q_branch (s, 0, x, y);
2390 static void decode_blocks(SnowContext *s){
2397 decode_q_branch(s, 0, x, y);
2402 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){
2405 for(y=0; y < b_h+5; y++){
2406 for(x=0; x < b_w; x++){
2413 // int am= 9*(a1+a2) - (a0+a3);
2414 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2415 // int am= 18*(a2+a3) - 2*(a1+a4);
2416 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2417 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2419 // if(b_w==16) am= 8*(a1+a2);
2421 if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8;
2422 else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2424 /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
2425 if(am&(~255)) am= ~(am>>31);
2429 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
2430 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
2431 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
2432 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2437 tmp -= (b_h+5)*stride;
2439 for(y=0; y < b_h; y++){
2440 for(x=0; x < b_w; x++){
2441 int a0= tmp[x + 0*stride];
2442 int a1= tmp[x + 1*stride];
2443 int a2= tmp[x + 2*stride];
2444 int a3= tmp[x + 3*stride];
2445 int a4= tmp[x + 4*stride];
2446 int a5= tmp[x + 5*stride];
2447 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2448 // int am= 18*(a2+a3) - 2*(a1+a4);
2449 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2450 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
2452 // if(b_w==16) am= 8*(a1+a2);
2454 if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8;
2455 else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
2457 if(am&(~255)) am= ~(am>>31);
2460 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
2461 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2462 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2463 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2468 STOP_TIMER("mc_block")
2471 #define mca(dx,dy,b_w)\
2472 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
2473 uint8_t tmp[stride*(b_w+5)];\
2475 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2487 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){
2488 if(block->type & BLOCK_INTRA){
2490 const int color= block->color[plane_index];
2491 for(y=0; y < b_h; y++){
2492 for(x=0; x < b_w; x++){
2493 dst[x + y*stride]= color;
2497 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2498 int mx= block->mx*scale;
2499 int my= block->my*scale;
2500 const int dx= mx&15;
2501 const int dy= my&15;
2504 src += sx + sy*stride;
2505 if( (unsigned)sx >= w - b_w - 4
2506 || (unsigned)sy >= h - b_h - 4){
2507 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2510 if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16))
2511 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2513 s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2517 //FIXME name clenup (b_w, block_w, b_width stuff)
2518 static always_inline void add_yblock_buffered(SnowContext *s, slice_buffer * sb, DWTELEM *old_dst, uint8_t *dst8, uint8_t *src, uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int plane_index){
2519 DWTELEM * dst = NULL;
2520 const int b_width = s->b_width << s->block_max_depth;
2521 const int b_height= s->b_height << s->block_max_depth;
2522 const int b_stride= b_width;
2523 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2524 BlockNode *rt= lt+1;
2525 BlockNode *lb= lt+b_stride;
2526 BlockNode *rb= lb+1;
2528 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2529 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2536 }else if(b_x + 1 >= b_width){
2543 }else if(b_y + 1 >= b_height){
2548 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2552 }else if(src_x + b_w > w){
2556 obmc -= src_y*obmc_stride;
2559 }else if(src_y + b_h> h){
2563 if(b_w<=0 || b_h<=0) return;
2565 assert(src_stride > 2*MB_SIZE + 5);
2566 // old_dst += src_x + src_y*dst_stride;
2567 dst8+= src_x + src_y*src_stride;
2568 // src += src_x + src_y*src_stride;
2570 ptmp= tmp + 3*tmp_step;
2573 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2575 if(same_block(lt, rt)){
2580 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2583 if(same_block(lt, lb)){
2585 }else if(same_block(rt, lb)){
2590 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2593 if(same_block(lt, rb) ){
2595 }else if(same_block(rt, rb)){
2597 }else if(same_block(lb, rb)){
2601 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2604 for(y=0; y<b_h; y++){
2605 for(x=0; x<b_w; x++){
2606 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2607 if(add) dst[x + y*dst_stride] += v;
2608 else dst[x + y*dst_stride] -= v;
2611 for(y=0; y<b_h; y++){
2612 uint8_t *obmc2= obmc + (obmc_stride>>1);
2613 for(x=0; x<b_w; x++){
2614 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2615 if(add) dst[x + y*dst_stride] += v;
2616 else dst[x + y*dst_stride] -= v;
2619 for(y=0; y<b_h; y++){
2620 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2621 for(x=0; x<b_w; x++){
2622 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2623 if(add) dst[x + y*dst_stride] += v;
2624 else dst[x + y*dst_stride] -= v;
2627 for(y=0; y<b_h; y++){
2628 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2629 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2630 for(x=0; x<b_w; x++){
2631 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2632 if(add) dst[x + y*dst_stride] += v;
2633 else dst[x + y*dst_stride] -= v;
2641 for(y=0; y<b_h; y++){
2642 //FIXME ugly missue of obmc_stride
2643 uint8_t *obmc1= obmc + y*obmc_stride;
2644 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2645 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2646 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2647 dst = slice_buffer_get_line(sb, src_y + y);
2648 for(x=0; x<b_w; x++){
2649 int v= obmc1[x] * block[3][x + y*src_stride]
2650 +obmc2[x] * block[2][x + y*src_stride]
2651 +obmc3[x] * block[1][x + y*src_stride]
2652 +obmc4[x] * block[0][x + y*src_stride];
2654 v <<= 8 - LOG2_OBMC_MAX;
2656 v += 1<<(7 - FRAC_BITS);
2657 v >>= 8 - FRAC_BITS;
2660 // v += old_dst[x + y*dst_stride];
2661 v += dst[x + src_x];
2662 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2663 if(v&(~255)) v= ~(v>>31);
2664 dst8[x + y*src_stride] = v;
2666 // old_dst[x + y*dst_stride] -= v;
2667 dst[x + src_x] -= v;
2671 STOP_TIMER("Inner add y block")
2676 //FIXME name clenup (b_w, block_w, b_width stuff)
2677 static always_inline void add_yblock(SnowContext *s, DWTELEM *dst, uint8_t *dst8, uint8_t *src, uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int plane_index){
2678 const int b_width = s->b_width << s->block_max_depth;
2679 const int b_height= s->b_height << s->block_max_depth;
2680 const int b_stride= b_width;
2681 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2682 BlockNode *rt= lt+1;
2683 BlockNode *lb= lt+b_stride;
2684 BlockNode *rb= lb+1;
2686 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2687 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2694 }else if(b_x + 1 >= b_width){
2701 }else if(b_y + 1 >= b_height){
2706 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2710 }else if(src_x + b_w > w){
2714 obmc -= src_y*obmc_stride;
2717 }else if(src_y + b_h> h){
2721 if(b_w<=0 || b_h<=0) return;
2723 assert(src_stride > 2*MB_SIZE + 5);
2724 dst += src_x + src_y*dst_stride;
2725 dst8+= src_x + src_y*src_stride;
2726 // src += src_x + src_y*src_stride;
2728 ptmp= tmp + 3*tmp_step;
2731 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2733 if(same_block(lt, rt)){
2738 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2741 if(same_block(lt, lb)){
2743 }else if(same_block(rt, lb)){
2748 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2751 if(same_block(lt, rb) ){
2753 }else if(same_block(rt, rb)){
2755 }else if(same_block(lb, rb)){
2759 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2762 for(y=0; y<b_h; y++){
2763 for(x=0; x<b_w; x++){
2764 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2765 if(add) dst[x + y*dst_stride] += v;
2766 else dst[x + y*dst_stride] -= v;
2769 for(y=0; y<b_h; y++){
2770 uint8_t *obmc2= obmc + (obmc_stride>>1);
2771 for(x=0; x<b_w; x++){
2772 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2773 if(add) dst[x + y*dst_stride] += v;
2774 else dst[x + y*dst_stride] -= v;
2777 for(y=0; y<b_h; y++){
2778 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2779 for(x=0; x<b_w; x++){
2780 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2781 if(add) dst[x + y*dst_stride] += v;
2782 else dst[x + y*dst_stride] -= v;
2785 for(y=0; y<b_h; y++){
2786 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2787 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2788 for(x=0; x<b_w; x++){
2789 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2790 if(add) dst[x + y*dst_stride] += v;
2791 else dst[x + y*dst_stride] -= v;
2795 for(y=0; y<b_h; y++){
2796 //FIXME ugly missue of obmc_stride
2797 uint8_t *obmc1= obmc + y*obmc_stride;
2798 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2799 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2800 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2801 for(x=0; x<b_w; x++){
2802 int v= obmc1[x] * block[3][x + y*src_stride]
2803 +obmc2[x] * block[2][x + y*src_stride]
2804 +obmc3[x] * block[1][x + y*src_stride]
2805 +obmc4[x] * block[0][x + y*src_stride];
2807 v <<= 8 - LOG2_OBMC_MAX;
2809 v += 1<<(7 - FRAC_BITS);
2810 v >>= 8 - FRAC_BITS;
2813 v += dst[x + y*dst_stride];
2814 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2815 if(v&(~255)) v= ~(v>>31);
2816 dst8[x + y*src_stride] = v;
2818 dst[x + y*dst_stride] -= v;
2825 static always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){
2826 Plane *p= &s->plane[plane_index];
2827 const int mb_w= s->b_width << s->block_max_depth;
2828 const int mb_h= s->b_height << s->block_max_depth;
2830 int block_size = MB_SIZE >> s->block_max_depth;
2831 int block_w = plane_index ? block_size/2 : block_size;
2832 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2833 int obmc_stride= plane_index ? block_size : 2*block_size;
2834 int ref_stride= s->current_picture.linesize[plane_index];
2835 uint8_t *ref = s->last_picture.data[plane_index];
2836 uint8_t *dst8= s->current_picture.data[plane_index];
2841 if(s->keyframe || (s->avctx->debug&512)){
2846 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2848 // DWTELEM * line = slice_buffer_get_line(sb, y);
2849 DWTELEM * line = sb->line[y];
2852 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2853 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2855 if(v&(~255)) v= ~(v>>31);
2856 dst8[x + y*ref_stride]= v;
2860 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2862 // DWTELEM * line = slice_buffer_get_line(sb, y);
2863 DWTELEM * line = sb->line[y];
2866 line[x] -= 128 << FRAC_BITS;
2867 // buf[x + y*w]-= 128<<FRAC_BITS;
2875 for(mb_x=0; mb_x<=mb_w; mb_x++){
2878 add_yblock_buffered(s, sb, old_buffer, dst8, ref, obmc,
2879 block_w*mb_x - block_w/2,
2880 block_w*mb_y - block_w/2,
2883 w, ref_stride, obmc_stride,
2887 STOP_TIMER("add_yblock")
2890 STOP_TIMER("predict_slice")
2893 static always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){
2894 Plane *p= &s->plane[plane_index];
2895 const int mb_w= s->b_width << s->block_max_depth;
2896 const int mb_h= s->b_height << s->block_max_depth;
2898 int block_size = MB_SIZE >> s->block_max_depth;
2899 int block_w = plane_index ? block_size/2 : block_size;
2900 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2901 const int obmc_stride= plane_index ? block_size : 2*block_size;
2902 int ref_stride= s->current_picture.linesize[plane_index];
2903 uint8_t *ref = s->last_picture.data[plane_index];
2904 uint8_t *dst8= s->current_picture.data[plane_index];
2909 if(s->keyframe || (s->avctx->debug&512)){
2914 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2916 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2918 if(v&(~255)) v= ~(v>>31);
2919 dst8[x + y*ref_stride]= v;
2923 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2925 buf[x + y*w]-= 128<<FRAC_BITS;
2933 for(mb_x=0; mb_x<=mb_w; mb_x++){
2936 add_yblock(s, buf, dst8, ref, obmc,
2937 block_w*mb_x - block_w/2,
2938 block_w*mb_y - block_w/2,
2941 w, ref_stride, obmc_stride,
2945 STOP_TIMER("add_yblock")
2948 STOP_TIMER("predict_slice")
2951 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2952 const int mb_h= s->b_height << s->block_max_depth;
2954 for(mb_y=0; mb_y<=mb_h; mb_y++)
2955 predict_slice(s, buf, plane_index, add, mb_y);
2958 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){
2960 Plane *p= &s->plane[plane_index];
2961 const int block_size = MB_SIZE >> s->block_max_depth;
2962 const int block_w = plane_index ? block_size/2 : block_size;
2963 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2964 const int obmc_stride= plane_index ? block_size : 2*block_size;
2965 const int ref_stride= s->current_picture.linesize[plane_index];
2966 uint8_t *ref= s-> last_picture.data[plane_index];
2967 uint8_t *dst= s->current_picture.data[plane_index];
2968 uint8_t *src= s-> input_picture.data[plane_index];
2969 const static DWTELEM zero_dst[4096]; //FIXME
2970 const int b_stride = s->b_width << s->block_max_depth;
2971 const int w= p->width;
2972 const int h= p->height;
2973 int index= mb_x + mb_y*b_stride;
2974 BlockNode *b= &s->block[index];
2975 BlockNode backup= *b;
2979 b->type|= BLOCK_INTRA;
2980 b->color[plane_index]= 0;
2983 int mb_x2= mb_x + (i &1) - 1;
2984 int mb_y2= mb_y + (i>>1) - 1;
2985 int x= block_w*mb_x2 + block_w/2;
2986 int y= block_w*mb_y2 + block_w/2;
2988 add_yblock(s, zero_dst, dst, ref, obmc,
2989 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, plane_index);
2991 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){
2992 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
2993 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride;
2994 int obmc_v= obmc[index];
2995 if(y<0) obmc_v += obmc[index + block_w*obmc_stride];
2996 if(x<0) obmc_v += obmc[index + block_w];
2997 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride];
2998 if(x+block_w>w) obmc_v += obmc[index - block_w];
2999 //FIXME precalc this or simplify it somehow else
3001 ab += (src[x2 + y2*ref_stride] - dst[x2 + y2*ref_stride]) * obmc_v;
3002 aa += obmc_v * obmc_v; //FIXME precalclate this
3008 return clip(((ab<<6) + aa/2)/aa, 0, 255); //FIXME we shouldnt need cliping
3011 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){
3013 Plane *p= &s->plane[plane_index];
3014 const int block_size = MB_SIZE >> s->block_max_depth;
3015 const int block_w = plane_index ? block_size/2 : block_size;
3016 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
3017 const int obmc_stride= plane_index ? block_size : 2*block_size;
3018 const int ref_stride= s->current_picture.linesize[plane_index];
3019 uint8_t *ref= s-> last_picture.data[plane_index];
3020 uint8_t *dst= s->current_picture.data[plane_index];
3021 uint8_t *src= s-> input_picture.data[plane_index];
3022 const static DWTELEM zero_dst[4096]; //FIXME
3023 const int b_stride = s->b_width << s->block_max_depth;
3024 const int b_height = s->b_height<< s->block_max_depth;
3025 const int w= p->width;
3026 const int h= p->height;
3029 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
3032 int mb_x2= mb_x + (i &1) - 1;
3033 int mb_y2= mb_y + (i>>1) - 1;
3034 int x= block_w*mb_x2 + block_w/2;
3035 int y= block_w*mb_y2 + block_w/2;
3037 add_yblock(s, zero_dst, dst, ref, obmc,
3038 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, plane_index);
3040 //FIXME find a cleaner/simpler way to skip the outside stuff
3041 for(y2= y; y2<0; y2++)
3042 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
3043 for(y2= h; y2<y+block_w; y2++)
3044 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
3046 for(y2= y; y2<y+block_w; y2++)
3047 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x);
3050 for(y2= y; y2<y+block_w; y2++)
3051 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w);
3054 assert(block_w== 8 || block_w==16);
3055 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w);
3064 int x= mb_x + (i&1) - (i>>1);
3065 int y= mb_y + (i>>1);
3066 int index= x + y*b_stride;
3067 BlockNode *b = &s->block[index];
3068 BlockNode *left = x ? &s->block[index-1] : &null_block;
3069 BlockNode *top = y ? &s->block[index-b_stride] : &null_block;
3070 BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left;
3071 BlockNode *tr = y && x+1<b_stride ? &s->block[index-b_stride+1] : tl;
3072 int dmx= b->mx - mid_pred(left->mx, top->mx, tr->mx);
3073 int dmy= b->my - mid_pred(left->my, top->my, tr->my);
3074 // int mx_context= av_log2(2*ABS(left->mx - top->mx));
3075 // int my_context= av_log2(2*ABS(left->my - top->my));
3077 if(x<0 || x>=b_stride || y>=b_height)
3084 00001XXXX 15-30 8-15
3086 //FIXME try accurate rate
3087 //FIXME intra and inter predictors if surrounding blocks arent the same type
3088 if(b->type & BLOCK_INTRA){
3089 rate += 3+2*( av_log2(2*ABS(left->color[0] - b->color[0]))
3090 + av_log2(2*ABS(left->color[1] - b->color[1]))
3091 + av_log2(2*ABS(left->color[2] - b->color[2])));
3093 rate += 2*(1 + av_log2(2*ABS(dmx))
3094 + av_log2(2*ABS(dmy))); //FIXME kill the 2* can be merged in lambda
3098 return distortion + rate*penalty_factor;
3101 static always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, int *best_rd){
3102 const int b_stride= s->b_width << s->block_max_depth;
3103 BlockNode *block= &s->block[mb_x + mb_y * b_stride];
3104 BlockNode backup= *block;
3105 int rd, index, value;
3107 assert(mb_x>=0 && mb_y>=0);
3108 assert(mb_x<b_stride);
3111 block->color[0] = p[0];
3112 block->color[1] = p[1];
3113 block->color[2] = p[2];
3114 block->type |= BLOCK_INTRA;
3116 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1);
3117 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6);
3118 if(s->me_cache[index] == value)
3120 s->me_cache[index]= value;
3124 block->type &= ~BLOCK_INTRA;
3127 rd= get_block_rd(s, mb_x, mb_y, 0);
3139 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */
3140 static always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int intra, int *best_rd){
3141 int p[2] = {p0, p1};
3142 return check_block(s, mb_x, mb_y, p, intra, best_rd);
3145 static void iterative_me(SnowContext *s){
3146 int pass, mb_x, mb_y;
3147 const int b_width = s->b_width << s->block_max_depth;
3148 const int b_height= s->b_height << s->block_max_depth;
3149 const int b_stride= b_width;
3152 for(pass=0; pass<50; pass++){
3155 for(mb_y= 0; mb_y<b_height; mb_y++){
3156 for(mb_x= 0; mb_x<b_width; mb_x++){
3157 int dia_change, i, j;
3158 int best_rd= INT_MAX;
3160 const int index= mb_x + mb_y * b_stride;
3161 BlockNode *block= &s->block[index];
3162 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : &null_block;
3163 BlockNode *lb = mb_x ? &s->block[index -1] : &null_block;
3164 BlockNode *rb = mb_x<b_width ? &s->block[index +1] : &null_block;
3165 BlockNode *bb = mb_y<b_height ? &s->block[index+b_stride ] : &null_block;
3166 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : &null_block;
3167 BlockNode *trb= mb_x<b_width && mb_y ? &s->block[index-b_stride+1] : &null_block;
3168 BlockNode *blb= mb_x && mb_y<b_height ? &s->block[index+b_stride-1] : &null_block;
3169 BlockNode *brb= mb_x<b_width && mb_y<b_height ? &s->block[index+b_stride+1] : &null_block;
3171 if(pass && (block->type & BLOCK_OPT))
3173 block->type |= BLOCK_OPT;
3177 if(!s->me_cache_generation)
3178 memset(s->me_cache, 0, sizeof(s->me_cache));
3179 s->me_cache_generation += 1<<22;
3181 // get previous score (cant be cached due to OBMC)
3182 check_block_inter(s, mb_x, mb_y, block->mx, block->my, 0, &best_rd);
3183 check_block_inter(s, mb_x, mb_y, 0, 0, 0, &best_rd);
3184 check_block_inter(s, mb_x, mb_y, tb->mx, tb->my, 0, &best_rd);
3185 check_block_inter(s, mb_x, mb_y, lb->mx, lb->my, 0, &best_rd);
3186 check_block_inter(s, mb_x, mb_y, rb->mx, rb->my, 0, &best_rd);
3187 check_block_inter(s, mb_x, mb_y, bb->mx, bb->my, 0, &best_rd);
3190 //FIXME avoid subpel interpol / round to nearest integer
3193 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){
3195 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), 0, &best_rd);
3196 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), 0, &best_rd);
3197 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), 0, &best_rd);
3198 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), 0, &best_rd);
3204 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
3207 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], 0, &best_rd);
3209 //FIXME or try the standard 2 pass qpel or similar
3212 color[i]= get_dc(s, mb_x, mb_y, i);
3214 check_block(s, mb_x, mb_y, color, 1, &best_rd);
3215 //FIXME RD style color selection
3217 if(!same_block(block, &backup)){
3218 if(tb != &null_block) tb ->type &= ~BLOCK_OPT;
3219 if(lb != &null_block) lb ->type &= ~BLOCK_OPT;
3220 if(rb != &null_block) rb ->type &= ~BLOCK_OPT;
3221 if(bb != &null_block) bb ->type &= ~BLOCK_OPT;
3222 if(tlb!= &null_block) tlb->type &= ~BLOCK_OPT;
3223 if(trb!= &null_block) trb->type &= ~BLOCK_OPT;
3224 if(blb!= &null_block) blb->type &= ~BLOCK_OPT;
3225 if(brb!= &null_block) brb->type &= ~BLOCK_OPT;
3230 av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change);
3236 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
3237 const int level= b->level;
3238 const int w= b->width;
3239 const int h= b->height;
3240 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3241 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3242 int x,y, thres1, thres2;
3245 if(s->qlog == LOSSLESS_QLOG) return;
3247 bias= bias ? 0 : (3*qmul)>>3;
3248 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
3254 int i= src[x + y*stride];
3256 if((unsigned)(i+thres1) > thres2){
3259 i/= qmul; //FIXME optimize
3260 src[x + y*stride]= i;
3264 i/= qmul; //FIXME optimize
3265 src[x + y*stride]= -i;
3268 src[x + y*stride]= 0;
3274 int i= src[x + y*stride];
3276 if((unsigned)(i+thres1) > thres2){
3279 i= (i + bias) / qmul; //FIXME optimize
3280 src[x + y*stride]= i;
3284 i= (i + bias) / qmul; //FIXME optimize
3285 src[x + y*stride]= -i;
3288 src[x + y*stride]= 0;
3292 if(level+1 == s->spatial_decomposition_count){
3293 // STOP_TIMER("quantize")
3297 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
3298 const int w= b->width;
3299 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3300 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3301 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3305 if(s->qlog == LOSSLESS_QLOG) return;
3307 for(y=start_y; y<end_y; y++){
3308 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3309 DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3313 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3315 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
3319 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3320 STOP_TIMER("dquant")
3324 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
3325 const int w= b->width;
3326 const int h= b->height;
3327 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3328 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3329 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3333 if(s->qlog == LOSSLESS_QLOG) return;
3337 int i= src[x + y*stride];
3339 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3341 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
3345 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3346 STOP_TIMER("dquant")
3350 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3351 const int w= b->width;
3352 const int h= b->height;
3355 for(y=h-1; y>=0; y--){
3356 for(x=w-1; x>=0; x--){
3357 int i= x + y*stride;
3361 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3362 else src[i] -= src[i - 1];
3364 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3365 else src[i] -= src[i - 1];
3368 if(y) src[i] -= src[i - stride];
3374 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
3375 const int w= b->width;
3384 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3386 for(y=start_y; y<end_y; y++){
3388 // line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3389 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3393 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
3394 else line[x] += line[x - 1];
3396 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
3397 else line[x] += line[x - 1];
3400 if(y) line[x] += prev[x];
3405 // STOP_TIMER("correlate")
3408 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3409 const int w= b->width;
3410 const int h= b->height;
3415 int i= x + y*stride;
3419 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3420 else src[i] += src[i - 1];
3422 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3423 else src[i] += src[i - 1];
3426 if(y) src[i] += src[i - stride];
3432 static void encode_header(SnowContext *s){
3433 int plane_index, level, orientation;
3436 memset(kstate, MID_STATE, sizeof(kstate));
3438 put_rac(&s->c, kstate, s->keyframe);
3439 if(s->keyframe || s->always_reset)
3442 put_symbol(&s->c, s->header_state, s->version, 0);
3443 put_rac(&s->c, s->header_state, s->always_reset);
3444 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
3445 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
3446 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
3447 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
3448 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
3449 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
3450 put_rac(&s->c, s->header_state, s->spatial_scalability);
3451 // put_rac(&s->c, s->header_state, s->rate_scalability);
3453 for(plane_index=0; plane_index<2; plane_index++){
3454 for(level=0; level<s->spatial_decomposition_count; level++){
3455 for(orientation=level ? 1:0; orientation<4; orientation++){
3456 if(orientation==2) continue;
3457 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
3462 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
3463 put_symbol(&s->c, s->header_state, s->qlog, 1);
3464 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
3465 put_symbol(&s->c, s->header_state, s->qbias, 1);
3466 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
3469 static int decode_header(SnowContext *s){
3470 int plane_index, level, orientation;
3473 memset(kstate, MID_STATE, sizeof(kstate));
3475 s->keyframe= get_rac(&s->c, kstate);
3476 if(s->keyframe || s->always_reset)
3479 s->version= get_symbol(&s->c, s->header_state, 0);
3481 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
3484 s->always_reset= get_rac(&s->c, s->header_state);
3485 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3486 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3487 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3488 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
3489 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
3490 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
3491 s->spatial_scalability= get_rac(&s->c, s->header_state);
3492 // s->rate_scalability= get_rac(&s->c, s->header_state);
3494 for(plane_index=0; plane_index<3; plane_index++){
3495 for(level=0; level<s->spatial_decomposition_count; level++){
3496 for(orientation=level ? 1:0; orientation<4; orientation++){
3498 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
3499 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
3500 else q= get_symbol(&s->c, s->header_state, 1);
3501 s->plane[plane_index].band[level][orientation].qlog= q;
3507 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3508 if(s->spatial_decomposition_type > 2){
3509 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
3513 s->qlog= get_symbol(&s->c, s->header_state, 1);
3514 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
3515 s->qbias= get_symbol(&s->c, s->header_state, 1);
3516 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
3517 if(s->block_max_depth > 1){
3518 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);
3519 s->block_max_depth= 0;
3526 static void init_qexp(){
3530 for(i=0; i<QROOT; i++){
3532 v *= pow(2, 1.0 / QROOT);
3536 static int common_init(AVCodecContext *avctx){
3537 SnowContext *s = avctx->priv_data;
3539 int level, orientation, plane_index, dec;
3543 dsputil_init(&s->dsp, avctx);
3546 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
3547 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
3548 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
3549 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
3550 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
3551 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
3570 #define mcfh(dx,dy)\
3571 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
3572 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
3573 mc_block_hpel ## dx ## dy ## 16;\
3574 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
3575 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
3576 mc_block_hpel ## dx ## dy ## 8;
3586 dec= s->spatial_decomposition_count= 5;
3587 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
3589 s->chroma_h_shift= 1; //FIXME XXX
3590 s->chroma_v_shift= 1;
3592 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
3594 width= s->avctx->width;
3595 height= s->avctx->height;
3597 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
3599 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
3600 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
3602 for(plane_index=0; plane_index<3; plane_index++){
3603 int w= s->avctx->width;
3604 int h= s->avctx->height;
3607 w>>= s->chroma_h_shift;
3608 h>>= s->chroma_v_shift;
3610 s->plane[plane_index].width = w;
3611 s->plane[plane_index].height= h;
3612 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
3613 for(level=s->spatial_decomposition_count-1; level>=0; level--){
3614 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3615 SubBand *b= &s->plane[plane_index].band[level][orientation];
3617 b->buf= s->spatial_dwt_buffer;
3619 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
3620 b->width = (w + !(orientation&1))>>1;
3621 b->height= (h + !(orientation>1))>>1;
3623 b->stride_line = 1 << (s->spatial_decomposition_count - level);
3624 b->buf_x_offset = 0;
3625 b->buf_y_offset = 0;
3629 b->buf_x_offset = (w+1)>>1;
3632 b->buf += b->stride>>1;
3633 b->buf_y_offset = b->stride_line >> 1;
3637 b->parent= &s->plane[plane_index].band[level-1][orientation];
3638 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff));
3647 width= s->width= avctx->width;
3648 height= s->height= avctx->height;
3650 assert(width && height);
3652 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
3658 static void calculate_vissual_weight(SnowContext *s, Plane *p){
3659 int width = p->width;
3660 int height= p->height;
3661 int level, orientation, x, y;
3663 for(level=0; level<s->spatial_decomposition_count; level++){
3664 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3665 SubBand *b= &p->band[level][orientation];
3666 DWTELEM *buf= b->buf;
3669 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
3670 buf[b->width/2 + b->height/2*b->stride]= 256*256;
3671 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3672 for(y=0; y<height; y++){
3673 for(x=0; x<width; x++){
3674 int64_t d= s->spatial_dwt_buffer[x + y*width];
3679 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
3680 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
3685 static int encode_init(AVCodecContext *avctx)
3687 SnowContext *s = avctx->priv_data;
3690 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
3691 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n"
3692 "use vstrict=-2 / -strict -2 to use it anyway\n");
3702 s->m.flags = avctx->flags;
3703 s->m.bit_rate= avctx->bit_rate;
3705 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
3706 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3707 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3708 h263_encode_init(&s->m); //mv_penalty
3710 if(avctx->flags&CODEC_FLAG_PASS1){
3711 if(!avctx->stats_out)
3712 avctx->stats_out = av_mallocz(256);
3714 if(avctx->flags&CODEC_FLAG_PASS2){
3715 if(ff_rate_control_init(&s->m) < 0)
3719 for(plane_index=0; plane_index<3; plane_index++){
3720 calculate_vissual_weight(s, &s->plane[plane_index]);
3724 avctx->coded_frame= &s->current_picture;
3725 switch(avctx->pix_fmt){
3726 // case PIX_FMT_YUV444P:
3727 // case PIX_FMT_YUV422P:
3728 case PIX_FMT_YUV420P:
3730 // case PIX_FMT_YUV411P:
3731 // case PIX_FMT_YUV410P:
3732 s->colorspace_type= 0;
3734 /* case PIX_FMT_RGBA32:
3738 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
3741 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
3742 s->chroma_h_shift= 1;
3743 s->chroma_v_shift= 1;
3745 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp);
3746 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp);
3748 s->avctx->get_buffer(s->avctx, &s->input_picture);
3753 static int frame_start(SnowContext *s){
3755 int w= s->avctx->width; //FIXME round up to x16 ?
3756 int h= s->avctx->height;
3758 if(s->current_picture.data[0]){
3759 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
3760 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
3761 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
3764 tmp= s->last_picture;
3765 s->last_picture= s->current_picture;
3766 s->current_picture= tmp;
3768 s->current_picture.reference= 1;
3769 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
3770 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
3777 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
3778 SnowContext *s = avctx->priv_data;
3779 RangeCoder * const c= &s->c;
3780 AVFrame *pict = data;
3781 const int width= s->avctx->width;
3782 const int height= s->avctx->height;
3783 int level, orientation, plane_index, i, y;
3785 ff_init_range_encoder(c, buf, buf_size);
3786 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3790 for(y=0; y<(height>>shift); y++)
3791 memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]],
3792 &pict->data[i][y * pict->linesize[i]],
3795 s->new_picture = *pict;
3797 if(avctx->flags&CODEC_FLAG_PASS2){
3799 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
3800 s->keyframe= pict->pict_type==FF_I_TYPE;
3801 s->m.picture_number= avctx->frame_number;
3802 pict->quality= ff_rate_estimate_qscale(&s->m, 0);
3804 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
3805 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
3809 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
3811 s->qlog += 61*QROOT/8;
3813 s->qlog= LOSSLESS_QLOG;
3817 s->current_picture.key_frame= s->keyframe;
3819 s->m.current_picture_ptr= &s->m.current_picture;
3820 if(pict->pict_type == P_TYPE){
3821 int block_width = (width +15)>>4;
3822 int block_height= (height+15)>>4;
3823 int stride= s->current_picture.linesize[0];
3825 assert(s->current_picture.data[0]);
3826 assert(s->last_picture.data[0]);
3828 s->m.avctx= s->avctx;
3829 s->m.current_picture.data[0]= s->current_picture.data[0];
3830 s->m. last_picture.data[0]= s-> last_picture.data[0];
3831 s->m. new_picture.data[0]= s-> input_picture.data[0];
3832 s->m. last_picture_ptr= &s->m. last_picture;
3834 s->m. last_picture.linesize[0]=
3835 s->m. new_picture.linesize[0]=
3836 s->m.current_picture.linesize[0]= stride;
3837 s->m.uvlinesize= s->current_picture.linesize[1];
3839 s->m.height= height;
3840 s->m.mb_width = block_width;
3841 s->m.mb_height= block_height;
3842 s->m.mb_stride= s->m.mb_width+1;
3843 s->m.b8_stride= 2*s->m.mb_width+1;
3845 s->m.pict_type= pict->pict_type;
3846 s->m.me_method= s->avctx->me_method;
3847 s->m.me.scene_change_score=0;
3848 s->m.flags= s->avctx->flags;
3849 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
3850 s->m.out_format= FMT_H263;
3851 s->m.unrestricted_mv= 1;
3853 s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
3854 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
3855 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
3857 s->m.dsp= s->dsp; //move
3864 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
3867 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start);
3869 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits;
3871 for(plane_index=0; plane_index<3; plane_index++){
3872 Plane *p= &s->plane[plane_index];
3876 // int bits= put_bits_count(&s->c.pb);
3879 if(pict->data[plane_index]) //FIXME gray hack
3882 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
3885 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
3888 && pict->pict_type == P_TYPE
3889 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
3890 ff_init_range_encoder(c, buf, buf_size);
3891 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3892 pict->pict_type= FF_I_TYPE;
3898 if(s->qlog == LOSSLESS_QLOG){
3901 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS;
3906 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3908 for(level=0; level<s->spatial_decomposition_count; level++){
3909 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3910 SubBand *b= &p->band[level][orientation];
3912 quantize(s, b, b->buf, b->stride, s->qbias);
3914 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
3915 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
3916 assert(b->parent==NULL || b->parent->stride == b->stride*2);
3918 correlate(s, b, b->buf, b->stride, 1, 0);
3921 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
3923 for(level=0; level<s->spatial_decomposition_count; level++){
3924 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3925 SubBand *b= &p->band[level][orientation];
3927 dequantize(s, b, b->buf, b->stride);
3931 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3932 if(s->qlog == LOSSLESS_QLOG){
3935 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
3940 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3941 STOP_TIMER("pred-conv")}
3942 if(s->avctx->flags&CODEC_FLAG_PSNR){
3945 if(pict->data[plane_index]) //FIXME gray hack
3948 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x];
3952 s->avctx->error[plane_index] += error;
3953 s->current_picture.error[plane_index] = error;
3957 if(s->last_picture.data[0])
3958 avctx->release_buffer(avctx, &s->last_picture);
3960 s->current_picture.coded_picture_number = avctx->frame_number;
3961 s->current_picture.pict_type = pict->pict_type;
3962 s->current_picture.quality = pict->quality;
3963 if(avctx->flags&CODEC_FLAG_PASS1){
3964 s->m.p_tex_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits - s->m.mv_bits;
3965 s->m.current_picture.display_picture_number =
3966 s->m.current_picture.coded_picture_number = avctx->frame_number;
3967 s->m.pict_type = pict->pict_type;
3968 s->m.current_picture.quality = pict->quality;
3969 ff_write_pass1_stats(&s->m);
3971 if(avctx->flags&CODEC_FLAG_PASS2){
3972 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
3977 return ff_rac_terminate(c);
3980 static void common_end(SnowContext *s){
3981 int plane_index, level, orientation;
3983 av_freep(&s->spatial_dwt_buffer);
3985 av_freep(&s->m.me.scratchpad);
3986 av_freep(&s->m.me.map);
3987 av_freep(&s->m.me.score_map);
3989 av_freep(&s->block);
3991 for(plane_index=0; plane_index<3; plane_index++){
3992 for(level=s->spatial_decomposition_count-1; level>=0; level--){
3993 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3994 SubBand *b= &s->plane[plane_index].band[level][orientation];
3996 av_freep(&b->x_coeff);
4002 static int encode_end(AVCodecContext *avctx)
4004 SnowContext *s = avctx->priv_data;
4007 av_free(avctx->stats_out);
4012 static int decode_init(AVCodecContext *avctx)
4014 SnowContext *s = avctx->priv_data;
4017 avctx->pix_fmt= PIX_FMT_YUV420P;
4021 block_size = MB_SIZE >> s->block_max_depth;
4022 slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 2)) + 1, s->plane[0].width, s->spatial_dwt_buffer);
4027 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
4028 SnowContext *s = avctx->priv_data;
4029 RangeCoder * const c= &s->c;
4031 AVFrame *picture = data;
4032 int level, orientation, plane_index;
4034 ff_init_range_decoder(c, buf, buf_size);
4035 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
4037 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
4039 if(!s->block) alloc_blocks(s);
4042 //keyframe flag dupliaction mess FIXME
4043 if(avctx->debug&FF_DEBUG_PICT_INFO)
4044 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
4048 for(plane_index=0; plane_index<3; plane_index++){
4049 Plane *p= &s->plane[plane_index];
4053 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
4055 if(s->avctx->debug&2048){
4056 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
4057 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
4061 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
4062 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
4068 for(level=0; level<s->spatial_decomposition_count; level++){
4069 for(orientation=level ? 1 : 0; orientation<4; orientation++){
4070 SubBand *b= &p->band[level][orientation];
4071 unpack_coeffs(s, b, b->parent, orientation);
4074 STOP_TIMER("unpack coeffs");
4078 const int mb_h= s->b_height << s->block_max_depth;
4079 const int block_size = MB_SIZE >> s->block_max_depth;
4080 const int block_w = plane_index ? block_size/2 : block_size;
4082 dwt_compose_t cs[MAX_DECOMPOSITIONS];
4087 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count);
4088 for(mb_y=0; mb_y<=mb_h; mb_y++){
4090 int slice_starty = block_w*mb_y;
4091 int slice_h = block_w*(mb_y+1);
4092 if (!(s->keyframe || s->avctx->debug&512)){
4093 slice_starty = FFMAX(0, slice_starty - (block_w >> 1));
4094 slice_h -= (block_w >> 1);
4099 for(level=0; level<s->spatial_decomposition_count; level++){
4100 for(orientation=level ? 1 : 0; orientation<4; orientation++){
4101 SubBand *b= &p->band[level][orientation];
4104 int our_mb_start = mb_y;
4105 int our_mb_end = (mb_y + 1);
4106 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2: 0);
4107 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2);
4108 if (!(s->keyframe || s->avctx->debug&512)){
4109 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level)));
4110 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level)));
4112 start_y = FFMIN(b->height, start_y);
4113 end_y = FFMIN(b->height, end_y);
4115 if (start_y != end_y){
4116 if (orientation == 0){
4117 SubBand * correlate_band = &p->band[0][0];
4118 int correlate_end_y = FFMIN(b->height, end_y + 1);
4119 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
4120 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
4121 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
4122 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y);
4125 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
4129 STOP_TIMER("decode_subband_slice");
4133 for(; yd<slice_h; yd+=4){
4134 ff_spatial_idwt_buffered_slice(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd);
4136 STOP_TIMER("idwt slice");}
4139 if(s->qlog == LOSSLESS_QLOG){
4140 for(; yq<slice_h && yq<h; yq++){
4141 DWTELEM * line = slice_buffer_get_line(&s->sb, yq);
4143 line[x] <<= FRAC_BITS;
4148 predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y);
4150 y = FFMIN(p->height, slice_starty);
4151 end_y = FFMIN(p->height, slice_h);
4153 slice_buffer_release(&s->sb, y++);
4156 slice_buffer_flush(&s->sb);
4158 STOP_TIMER("idwt + predict_slices")}
4163 if(s->last_picture.data[0])
4164 avctx->release_buffer(avctx, &s->last_picture);
4166 if(!(s->avctx->debug&2048))
4167 *picture= s->current_picture;
4169 *picture= s->mconly_picture;
4171 *data_size = sizeof(AVFrame);
4173 bytes_read= c->bytestream - c->bytestream_start;
4174 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
4179 static int decode_end(AVCodecContext *avctx)
4181 SnowContext *s = avctx->priv_data;
4183 slice_buffer_destroy(&s->sb);
4190 AVCodec snow_decoder = {
4194 sizeof(SnowContext),
4199 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
4203 #ifdef CONFIG_ENCODERS
4204 AVCodec snow_encoder = {
4208 sizeof(SnowContext),
4224 int buffer[2][width*height];
4227 s.spatial_decomposition_count=6;
4228 s.spatial_decomposition_type=1;
4230 printf("testing 5/3 DWT\n");
4231 for(i=0; i<width*height; i++)
4232 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
4234 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4235 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4237 for(i=0; i<width*height; i++)
4238 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
4240 printf("testing 9/7 DWT\n");
4241 s.spatial_decomposition_type=0;
4242 for(i=0; i<width*height; i++)
4243 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
4245 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4246 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4248 for(i=0; i<width*height; i++)
4249 if(ABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
4252 printf("testing AC coder\n");
4253 memset(s.header_state, 0, sizeof(s.header_state));
4254 ff_init_range_encoder(&s.c, buffer[0], 256*256);
4255 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
4257 for(i=-256; i<256; i++){
4259 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
4260 STOP_TIMER("put_symbol")
4262 ff_rac_terminate(&s.c);
4264 memset(s.header_state, 0, sizeof(s.header_state));
4265 ff_init_range_decoder(&s.c, buffer[0], 256*256);
4266 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
4268 for(i=-256; i<256; i++){
4271 j= get_symbol(&s.c, s.header_state, 1);
4272 STOP_TIMER("get_symbol")
4273 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
4277 int level, orientation, x, y;
4278 int64_t errors[8][4];
4281 memset(errors, 0, sizeof(errors));
4282 s.spatial_decomposition_count=3;
4283 s.spatial_decomposition_type=0;
4284 for(level=0; level<s.spatial_decomposition_count; level++){
4285 for(orientation=level ? 1 : 0; orientation<4; orientation++){
4286 int w= width >> (s.spatial_decomposition_count-level);
4287 int h= height >> (s.spatial_decomposition_count-level);
4288 int stride= width << (s.spatial_decomposition_count-level);
4289 DWTELEM *buf= buffer[0];
4292 if(orientation&1) buf+=w;
4293 if(orientation>1) buf+=stride>>1;
4295 memset(buffer[0], 0, sizeof(int)*width*height);
4296 buf[w/2 + h/2*stride]= 256*256;
4297 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4298 for(y=0; y<height; y++){
4299 for(x=0; x<width; x++){
4300 int64_t d= buffer[0][x + y*width];
4302 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
4304 if(ABS(height/2-y)<9 && level==2) printf("\n");
4306 error= (int)(sqrt(error)+0.5);
4307 errors[level][orientation]= error;
4308 if(g) g=ff_gcd(g, error);
4312 printf("static int const visual_weight[][4]={\n");
4313 for(level=0; level<s.spatial_decomposition_count; level++){
4315 for(orientation=0; orientation<4; orientation++){
4316 printf("%8lld,", errors[level][orientation]/g);
4324 int w= width >> (s.spatial_decomposition_count-level);
4325 int h= height >> (s.spatial_decomposition_count-level);
4326 int stride= width << (s.spatial_decomposition_count-level);
4327 DWTELEM *buf= buffer[0];
4333 memset(buffer[0], 0, sizeof(int)*width*height);
4335 for(y=0; y<height; y++){
4336 for(x=0; x<width; x++){
4337 int tab[4]={0,2,3,1};
4338 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
4341 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4345 buf[x + y*stride ]=169;
4346 buf[x + y*stride-w]=64;
4349 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4351 for(y=0; y<height; y++){
4352 for(x=0; x<width; x++){
4353 int64_t d= buffer[0][x + y*width];
4355 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
4357 if(ABS(height/2-y)<9) printf("\n");