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){
1363 DWTELEM *b0= cs->b0;
1364 DWTELEM *b1= cs->b1;
1365 DWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line);
1366 DWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line);
1369 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1370 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1371 STOP_TIMER("vertical_compose53i*")}
1374 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1375 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1376 STOP_TIMER("horizontal_compose53i")}
1383 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1385 DWTELEM *b0= cs->b0;
1386 DWTELEM *b1= cs->b1;
1387 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1388 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1391 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1392 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1393 STOP_TIMER("vertical_compose53i*")}
1396 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1397 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1398 STOP_TIMER("horizontal_compose53i")}
1405 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1407 spatial_compose53i_init(&cs, buffer, height, stride);
1408 while(cs.y <= height)
1409 spatial_compose53i_dy(&cs, buffer, width, height, stride);
1413 static void horizontal_compose97i(DWTELEM *b, int width){
1414 DWTELEM temp[width];
1415 const int w2= (width+1)>>1;
1417 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1418 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1419 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1420 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1423 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1426 for(i=0; i<width; i++){
1427 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1431 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1434 for(i=0; i<width; i++){
1436 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1438 int r= 3*(b0[i] + b2[i]);
1441 b1[i] -= (r+W_CO)>>W_CS;
1446 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1449 for(i=0; i<width; i++){
1451 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1453 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1458 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1461 for(i=0; i<width; i++){
1462 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1466 static void vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1469 for(i=0; i<width; i++){
1473 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1475 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1477 r= 3*(b2[i] + b4[i]);
1480 b3[i] -= (r+W_CO)>>W_CS;
1483 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1485 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1487 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1491 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1492 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1493 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
1494 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1495 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1499 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1500 cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1501 cs->b1 = buffer + mirror(-3 , height-1)*stride;
1502 cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1503 cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1507 static void spatial_compose97i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1510 DWTELEM *b0= cs->b0;
1511 DWTELEM *b1= cs->b1;
1512 DWTELEM *b2= cs->b2;
1513 DWTELEM *b3= cs->b3;
1514 DWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line);
1515 DWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line);
1518 if(y>0 && y+4<height){
1519 vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1521 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1522 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1523 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1524 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1527 STOP_TIMER("vertical_compose97i")}}
1530 if(y-1<(unsigned)height) horizontal_compose97i(b0, width);
1531 if(y+0<(unsigned)height) horizontal_compose97i(b1, width);
1532 if(width>400 && y+0<(unsigned)height){
1533 STOP_TIMER("horizontal_compose97i")}}
1542 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1544 DWTELEM *b0= cs->b0;
1545 DWTELEM *b1= cs->b1;
1546 DWTELEM *b2= cs->b2;
1547 DWTELEM *b3= cs->b3;
1548 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1549 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1552 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1553 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1554 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1555 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1557 STOP_TIMER("vertical_compose97i")}}
1560 if(y-1<(unsigned)height) horizontal_compose97i(b0, width);
1561 if(y+0<(unsigned)height) horizontal_compose97i(b1, width);
1562 if(width>400 && b0 <= b2){
1563 STOP_TIMER("horizontal_compose97i")}}
1572 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1574 spatial_compose97i_init(&cs, buffer, height, stride);
1575 while(cs.y <= height)
1576 spatial_compose97i_dy(&cs, buffer, width, height, stride);
1579 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){
1581 for(level=decomposition_count-1; level>=0; level--){
1583 case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1584 case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1585 /* not slicified yet */
1586 case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1587 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1592 void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1594 for(level=decomposition_count-1; level>=0; level--){
1596 case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1597 case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1598 /* not slicified yet */
1599 case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1604 void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1605 const int support = type==1 ? 3 : 5;
1609 for(level=decomposition_count-1; level>=0; level--){
1610 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1612 case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1614 case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1622 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){
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_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1632 case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1640 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1643 for(level=decomposition_count-1; level>=0; level--)
1644 spatial_composeX (buffer, width>>level, height>>level, stride<<level);
1646 dwt_compose_t cs[MAX_DECOMPOSITIONS];
1648 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1649 for(y=0; y<height; y+=4)
1650 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1654 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1655 const int w= b->width;
1656 const int h= b->height;
1668 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1669 v= src[x + y*stride];
1672 t= src[x + (y-1)*stride];
1674 lt= src[x - 1 + (y-1)*stride];
1677 rt= src[x + 1 + (y-1)*stride];
1681 l= src[x - 1 + y*stride];
1683 if(orientation==1) ll= src[y + (x-2)*stride];
1684 else ll= src[x - 2 + y*stride];
1690 if(px<b->parent->width && py<b->parent->height)
1691 p= parent[px + py*2*stride];
1693 if(!(/*ll|*/l|lt|t|rt|p)){
1695 runs[run_index++]= run;
1703 max_index= run_index;
1704 runs[run_index++]= run;
1706 run= runs[run_index++];
1708 put_symbol2(&s->c, b->state[30], max_index, 0);
1709 if(run_index <= max_index)
1710 put_symbol2(&s->c, b->state[1], run, 3);
1713 if(s->c.bytestream_end - s->c.bytestream < w*40){
1714 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1719 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1720 v= src[x + y*stride];
1723 t= src[x + (y-1)*stride];
1725 lt= src[x - 1 + (y-1)*stride];
1728 rt= src[x + 1 + (y-1)*stride];
1732 l= src[x - 1 + y*stride];
1734 if(orientation==1) ll= src[y + (x-2)*stride];
1735 else ll= src[x - 2 + y*stride];
1741 if(px<b->parent->width && py<b->parent->height)
1742 p= parent[px + py*2*stride];
1744 if(/*ll|*/l|lt|t|rt|p){
1745 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1747 put_rac(&s->c, &b->state[0][context], !!v);
1750 run= runs[run_index++];
1752 if(run_index <= max_index)
1753 put_symbol2(&s->c, b->state[1], run, 3);
1761 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1762 int l2= 2*ABS(l) + (l<0);
1763 int t2= 2*ABS(t) + (t<0);
1765 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1766 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1774 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1775 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1776 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1777 return encode_subband_c0run(s, b, src, parent, stride, orientation);
1778 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1781 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1782 const int w= b->width;
1783 const int h= b->height;
1788 x_and_coeff *xc= b->x_coeff;
1789 x_and_coeff *prev_xc= NULL;
1790 x_and_coeff *prev2_xc= xc;
1791 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1792 x_and_coeff *prev_parent_xc= parent_xc;
1794 runs= get_symbol2(&s->c, b->state[30], 0);
1795 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1800 int lt=0, t=0, rt=0;
1802 if(y && prev_xc->x == 0){
1814 if(prev_xc->x == x + 1)
1820 if(x>>1 > parent_xc->x){
1823 if(x>>1 == parent_xc->x){
1824 p= parent_xc->coeff;
1827 if(/*ll|*/l|lt|t|rt|p){
1828 int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1830 v=get_rac(&s->c, &b->state[0][context]);
1832 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1833 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1840 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1842 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1843 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1852 if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1853 else max_run= FFMIN(run, w-x-1);
1855 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1861 (xc++)->x= w+1; //end marker
1867 while(parent_xc->x != parent->width+1)
1870 prev_parent_xc= parent_xc;
1872 parent_xc= prev_parent_xc;
1877 (xc++)->x= w+1; //end marker
1881 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1882 const int w= b->width;
1884 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1885 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1886 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1891 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1896 /* If we are on the second or later slice, restore our index. */
1898 new_index = save_state[0];
1901 for(y=start_y; y<h; y++){
1904 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1905 memset(line, 0, b->width*sizeof(DWTELEM));
1906 v = b->x_coeff[new_index].coeff;
1907 x = b->x_coeff[new_index++].x;
1910 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1911 register int u= -(v&1);
1912 line[x] = (t^u) - u;
1914 v = b->x_coeff[new_index].coeff;
1915 x = b->x_coeff[new_index++].x;
1918 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1919 STOP_TIMER("decode_subband")
1922 /* Save our variables for the next slice. */
1923 save_state[0] = new_index;
1928 static void reset_contexts(SnowContext *s){
1929 int plane_index, level, orientation;
1931 for(plane_index=0; plane_index<3; plane_index++){
1932 for(level=0; level<s->spatial_decomposition_count; level++){
1933 for(orientation=level ? 1:0; orientation<4; orientation++){
1934 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1938 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1939 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1942 static int alloc_blocks(SnowContext *s){
1943 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1944 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1949 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1953 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1954 uint8_t *bytestream= d->bytestream;
1955 uint8_t *bytestream_start= d->bytestream_start;
1957 d->bytestream= bytestream;
1958 d->bytestream_start= bytestream_start;
1961 //near copy & paste from dsputil, FIXME
1962 static int pix_sum(uint8_t * pix, int line_size, int w)
1967 for (i = 0; i < w; i++) {
1968 for (j = 0; j < w; j++) {
1972 pix += line_size - w;
1977 //near copy & paste from dsputil, FIXME
1978 static int pix_norm1(uint8_t * pix, int line_size, int w)
1981 uint32_t *sq = squareTbl + 256;
1984 for (i = 0; i < w; i++) {
1985 for (j = 0; j < w; j ++) {
1989 pix += line_size - w;
1994 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){
1995 const int w= s->b_width << s->block_max_depth;
1996 const int rem_depth= s->block_max_depth - level;
1997 const int index= (x + y*w) << rem_depth;
1998 const int block_w= 1<<rem_depth;
2010 for(j=0; j<block_w; j++){
2011 for(i=0; i<block_w; i++){
2012 s->block[index + i + j*w]= block;
2017 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){
2018 const int offset[3]= {
2020 ((y*c->uvstride + x)>>1),
2021 ((y*c->uvstride + x)>>1),
2025 c->src[0][i]= src [i];
2026 c->ref[0][i]= ref [i] + offset[i];
2034 #define P_TOPRIGHT P[3]
2035 #define P_MEDIAN P[4]
2037 #define FLAG_QPEL 1 //must be 1
2039 static int encode_q_branch(SnowContext *s, int level, int x, int y){
2040 uint8_t p_buffer[1024];
2041 uint8_t i_buffer[1024];
2042 uint8_t p_state[sizeof(s->block_state)];
2043 uint8_t i_state[sizeof(s->block_state)];
2045 uint8_t *pbbak= s->c.bytestream;
2046 uint8_t *pbbak_start= s->c.bytestream_start;
2047 int score, score2, iscore, i_len, p_len, block_s, sum;
2048 const int w= s->b_width << s->block_max_depth;
2049 const int h= s->b_height << s->block_max_depth;
2050 const int rem_depth= s->block_max_depth - level;
2051 const int index= (x + y*w) << rem_depth;
2052 const int block_w= 1<<(LOG2_MB_SIZE - level);
2053 int trx= (x+1)<<rem_depth;
2054 int try= (y+1)<<rem_depth;
2055 BlockNode *left = x ? &s->block[index-1] : &null_block;
2056 BlockNode *top = y ? &s->block[index-w] : &null_block;
2057 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
2058 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
2059 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2060 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2061 int pl = left->color[0];
2062 int pcb= left->color[1];
2063 int pcr= left->color[2];
2064 int pmx= mid_pred(left->mx, top->mx, tr->mx);
2065 int pmy= mid_pred(left->my, top->my, tr->my);
2068 const int stride= s->current_picture.linesize[0];
2069 const int uvstride= s->current_picture.linesize[1];
2070 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w,
2071 s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
2072 s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
2074 int16_t last_mv[3][2];
2075 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
2076 const int shift= 1+qpel;
2077 MotionEstContext *c= &s->m.me;
2078 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2079 int my_context= av_log2(2*ABS(left->my - top->my));
2080 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2082 assert(sizeof(s->block_state) >= 256);
2084 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2088 // clip predictors / edge ?
2090 P_LEFT[0]= left->mx;
2091 P_LEFT[1]= left->my;
2094 P_TOPRIGHT[0]= tr->mx;
2095 P_TOPRIGHT[1]= tr->my;
2097 last_mv[0][0]= s->block[index].mx;
2098 last_mv[0][1]= s->block[index].my;
2099 last_mv[1][0]= right->mx;
2100 last_mv[1][1]= right->my;
2101 last_mv[2][0]= bottom->mx;
2102 last_mv[2][1]= bottom->my;
2109 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
2111 assert(s->m.me. stride == stride);
2112 assert(s->m.me.uvstride == uvstride);
2114 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2115 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2116 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2117 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2119 c->xmin = - x*block_w - 16+2;
2120 c->ymin = - y*block_w - 16+2;
2121 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2122 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2124 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
2125 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
2126 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
2127 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
2128 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2129 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2130 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2132 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
2133 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
2136 c->pred_x= P_LEFT[0];
2137 c->pred_y= P_LEFT[1];
2139 c->pred_x = P_MEDIAN[0];
2140 c->pred_y = P_MEDIAN[1];
2143 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
2144 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
2146 assert(mx >= c->xmin);
2147 assert(mx <= c->xmax);
2148 assert(my >= c->ymin);
2149 assert(my <= c->ymax);
2151 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
2152 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
2153 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
2157 pc.bytestream_start=
2158 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
2159 memcpy(p_state, s->block_state, sizeof(s->block_state));
2161 if(level!=s->block_max_depth)
2162 put_rac(&pc, &p_state[4 + s_context], 1);
2163 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
2164 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
2165 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
2166 p_len= pc.bytestream - pc.bytestream_start;
2167 score += (s->lambda2*(p_len*8
2168 + (pc.outstanding_count - s->c.outstanding_count)*8
2169 + (-av_log2(pc.range) + av_log2(s->c.range))
2170 ))>>FF_LAMBDA_SHIFT;
2172 block_s= block_w*block_w;
2173 sum = pix_sum(current_data[0], stride, block_w);
2174 l= (sum + block_s/2)/block_s;
2175 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
2177 block_s= block_w*block_w>>2;
2178 sum = pix_sum(current_data[1], uvstride, block_w>>1);
2179 cb= (sum + block_s/2)/block_s;
2180 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
2181 sum = pix_sum(current_data[2], uvstride, block_w>>1);
2182 cr= (sum + block_s/2)/block_s;
2183 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
2186 ic.bytestream_start=
2187 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
2188 memcpy(i_state, s->block_state, sizeof(s->block_state));
2189 if(level!=s->block_max_depth)
2190 put_rac(&ic, &i_state[4 + s_context], 1);
2191 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
2192 put_symbol(&ic, &i_state[32], l-pl , 1);
2193 put_symbol(&ic, &i_state[64], cb-pcb, 1);
2194 put_symbol(&ic, &i_state[96], cr-pcr, 1);
2195 i_len= ic.bytestream - ic.bytestream_start;
2196 iscore += (s->lambda2*(i_len*8
2197 + (ic.outstanding_count - s->c.outstanding_count)*8
2198 + (-av_log2(ic.range) + av_log2(s->c.range))
2199 ))>>FF_LAMBDA_SHIFT;
2201 // assert(score==256*256*256*64-1);
2202 assert(iscore < 255*255*256 + s->lambda2*10);
2203 assert(iscore >= 0);
2204 assert(l>=0 && l<=255);
2205 assert(pl>=0 && pl<=255);
2208 int varc= iscore >> 8;
2209 int vard= score >> 8;
2210 if (vard <= 64 || vard < varc)
2211 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
2213 c->scene_change_score+= s->m.qscale;
2216 if(level!=s->block_max_depth){
2217 put_rac(&s->c, &s->block_state[4 + s_context], 0);
2218 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
2219 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
2220 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
2221 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
2222 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
2224 if(score2 < score && score2 < iscore)
2229 memcpy(pbbak, i_buffer, i_len);
2231 s->c.bytestream_start= pbbak_start;
2232 s->c.bytestream= pbbak + i_len;
2233 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
2234 memcpy(s->block_state, i_state, sizeof(s->block_state));
2237 memcpy(pbbak, p_buffer, p_len);
2239 s->c.bytestream_start= pbbak_start;
2240 s->c.bytestream= pbbak + p_len;
2241 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
2242 memcpy(s->block_state, p_state, sizeof(s->block_state));
2247 static always_inline int same_block(BlockNode *a, BlockNode *b){
2248 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){
2249 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2]));
2251 return !((a->mx - b->mx) | (a->my - b->my) | ((a->type ^ b->type)&BLOCK_INTRA));
2255 static void encode_q_branch2(SnowContext *s, int level, int x, int y){
2256 const int w= s->b_width << s->block_max_depth;
2257 const int rem_depth= s->block_max_depth - level;
2258 const int index= (x + y*w) << rem_depth;
2259 int trx= (x+1)<<rem_depth;
2260 BlockNode *b= &s->block[index];
2261 BlockNode *left = x ? &s->block[index-1] : &null_block;
2262 BlockNode *top = y ? &s->block[index-w] : &null_block;
2263 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2264 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2265 int pl = left->color[0];
2266 int pcb= left->color[1];
2267 int pcr= left->color[2];
2268 int pmx= mid_pred(left->mx, top->mx, tr->mx);
2269 int pmy= mid_pred(left->my, top->my, tr->my);
2270 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2271 int my_context= av_log2(2*ABS(left->my - top->my));
2272 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2275 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2279 if(level!=s->block_max_depth){
2280 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){
2281 put_rac(&s->c, &s->block_state[4 + s_context], 1);
2283 put_rac(&s->c, &s->block_state[4 + s_context], 0);
2284 encode_q_branch2(s, level+1, 2*x+0, 2*y+0);
2285 encode_q_branch2(s, level+1, 2*x+1, 2*y+0);
2286 encode_q_branch2(s, level+1, 2*x+0, 2*y+1);
2287 encode_q_branch2(s, level+1, 2*x+1, 2*y+1);
2291 if(b->type & BLOCK_INTRA){
2292 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1);
2293 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1);
2294 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1);
2295 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1);
2296 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, BLOCK_INTRA);
2298 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0);
2299 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1);
2300 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1);
2301 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, 0);
2305 static void decode_q_branch(SnowContext *s, int level, int x, int y){
2306 const int w= s->b_width << s->block_max_depth;
2307 const int rem_depth= s->block_max_depth - level;
2308 const int index= (x + y*w) << rem_depth;
2309 int trx= (x+1)<<rem_depth;
2310 BlockNode *left = x ? &s->block[index-1] : &null_block;
2311 BlockNode *top = y ? &s->block[index-w] : &null_block;
2312 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2313 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2314 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2317 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);
2321 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
2323 int l = left->color[0];
2324 int cb= left->color[1];
2325 int cr= left->color[2];
2326 int mx= mid_pred(left->mx, top->mx, tr->mx);
2327 int my= mid_pred(left->my, top->my, tr->my);
2328 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
2329 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
2331 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
2334 l += get_symbol(&s->c, &s->block_state[32], 1);
2335 cb+= get_symbol(&s->c, &s->block_state[64], 1);
2336 cr+= get_symbol(&s->c, &s->block_state[96], 1);
2338 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
2339 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
2341 set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
2343 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
2344 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
2345 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
2346 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
2350 static void encode_blocks(SnowContext *s){
2355 if(s->avctx->me_method == ME_ITER && !s->keyframe)
2359 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
2360 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2364 if(s->avctx->me_method == ME_ITER)
2365 encode_q_branch2(s, 0, x, y);
2367 encode_q_branch (s, 0, x, y);
2372 static void decode_blocks(SnowContext *s){
2379 decode_q_branch(s, 0, x, y);
2384 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){
2387 for(y=0; y < b_h+5; y++){
2388 for(x=0; x < b_w; x++){
2395 // int am= 9*(a1+a2) - (a0+a3);
2396 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2397 // int am= 18*(a2+a3) - 2*(a1+a4);
2398 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2399 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2401 // if(b_w==16) am= 8*(a1+a2);
2403 if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8;
2404 else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2406 /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
2407 if(am&(~255)) am= ~(am>>31);
2411 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
2412 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
2413 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
2414 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2419 tmp -= (b_h+5)*stride;
2421 for(y=0; y < b_h; y++){
2422 for(x=0; x < b_w; x++){
2423 int a0= tmp[x + 0*stride];
2424 int a1= tmp[x + 1*stride];
2425 int a2= tmp[x + 2*stride];
2426 int a3= tmp[x + 3*stride];
2427 int a4= tmp[x + 4*stride];
2428 int a5= tmp[x + 5*stride];
2429 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2430 // int am= 18*(a2+a3) - 2*(a1+a4);
2431 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2432 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
2434 // if(b_w==16) am= 8*(a1+a2);
2436 if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8;
2437 else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
2439 if(am&(~255)) am= ~(am>>31);
2442 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
2443 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2444 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2445 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2450 STOP_TIMER("mc_block")
2453 #define mca(dx,dy,b_w)\
2454 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
2455 uint8_t tmp[stride*(b_w+5)];\
2457 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2469 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){
2470 if(block->type & BLOCK_INTRA){
2472 const int color = block->color[plane_index];
2473 const int color4= color*0x01010101;
2475 for(y=0; y < b_h; y++){
2476 *(uint32_t*)&dst[0 + y*stride]= color4;
2477 *(uint32_t*)&dst[4 + y*stride]= color4;
2478 *(uint32_t*)&dst[8 + y*stride]= color4;
2479 *(uint32_t*)&dst[12+ y*stride]= color4;
2482 for(y=0; y < b_h; y++){
2483 *(uint32_t*)&dst[0 + y*stride]= color4;
2484 *(uint32_t*)&dst[4 + y*stride]= color4;
2487 for(y=0; y < b_h; y++){
2488 *(uint32_t*)&dst[0 + y*stride]= color4;
2491 for(y=0; y < b_h; y++){
2492 for(x=0; x < b_w; x++){
2493 dst[x + y*stride]= color;
2498 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2499 int mx= block->mx*scale;
2500 int my= block->my*scale;
2501 const int dx= mx&15;
2502 const int dy= my&15;
2503 const int tab_index= 3 - (b_w>>2) + (b_w>>4);
2506 src += sx + sy*stride;
2507 if( (unsigned)sx >= w - b_w - 4
2508 || (unsigned)sy >= h - b_h - 4){
2509 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2512 assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h);
2513 assert(!(b_w&(b_w-1)));
2514 assert(b_w>1 && b_h>1);
2515 assert(tab_index>=0 && tab_index<4);
2516 if((dx&3) || (dy&3))
2517 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2519 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2520 else if(b_w==2*b_h){
2521 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 2 + 2*stride,stride);
2522 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 2 + b_h + 2*stride,stride);
2525 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 2 + 2*stride ,stride);
2526 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 2 + 2*stride+b_w*stride,stride);
2531 //FIXME name clenup (b_w, block_w, b_width stuff)
2532 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){
2533 DWTELEM * dst = NULL;
2534 const int b_width = s->b_width << s->block_max_depth;
2535 const int b_height= s->b_height << s->block_max_depth;
2536 const int b_stride= b_width;
2537 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2538 BlockNode *rt= lt+1;
2539 BlockNode *lb= lt+b_stride;
2540 BlockNode *rb= lb+1;
2542 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2543 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2550 }else if(b_x + 1 >= b_width){
2557 }else if(b_y + 1 >= b_height){
2562 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2566 }else if(src_x + b_w > w){
2570 obmc -= src_y*obmc_stride;
2573 }else if(src_y + b_h> h){
2577 if(b_w<=0 || b_h<=0) return;
2579 assert(src_stride > 2*MB_SIZE + 5);
2580 // old_dst += src_x + src_y*dst_stride;
2581 dst8+= src_x + src_y*src_stride;
2582 // src += src_x + src_y*src_stride;
2584 ptmp= tmp + 3*tmp_step;
2587 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2589 if(same_block(lt, rt)){
2594 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2597 if(same_block(lt, lb)){
2599 }else if(same_block(rt, lb)){
2604 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2607 if(same_block(lt, rb) ){
2609 }else if(same_block(rt, rb)){
2611 }else if(same_block(lb, rb)){
2615 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2618 for(y=0; y<b_h; y++){
2619 for(x=0; x<b_w; x++){
2620 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2621 if(add) dst[x + y*dst_stride] += v;
2622 else dst[x + y*dst_stride] -= v;
2625 for(y=0; y<b_h; y++){
2626 uint8_t *obmc2= obmc + (obmc_stride>>1);
2627 for(x=0; x<b_w; x++){
2628 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2629 if(add) dst[x + y*dst_stride] += v;
2630 else dst[x + y*dst_stride] -= v;
2633 for(y=0; y<b_h; y++){
2634 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2635 for(x=0; x<b_w; x++){
2636 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2637 if(add) dst[x + y*dst_stride] += v;
2638 else dst[x + y*dst_stride] -= v;
2641 for(y=0; y<b_h; y++){
2642 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2643 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2644 for(x=0; x<b_w; x++){
2645 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2646 if(add) dst[x + y*dst_stride] += v;
2647 else dst[x + y*dst_stride] -= v;
2655 for(y=0; y<b_h; y++){
2656 //FIXME ugly missue of obmc_stride
2657 uint8_t *obmc1= obmc + y*obmc_stride;
2658 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2659 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2660 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2661 dst = slice_buffer_get_line(sb, src_y + y);
2662 for(x=0; x<b_w; x++){
2663 int v= obmc1[x] * block[3][x + y*src_stride]
2664 +obmc2[x] * block[2][x + y*src_stride]
2665 +obmc3[x] * block[1][x + y*src_stride]
2666 +obmc4[x] * block[0][x + y*src_stride];
2668 v <<= 8 - LOG2_OBMC_MAX;
2670 v += 1<<(7 - FRAC_BITS);
2671 v >>= 8 - FRAC_BITS;
2674 // v += old_dst[x + y*dst_stride];
2675 v += dst[x + src_x];
2676 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2677 if(v&(~255)) v= ~(v>>31);
2678 dst8[x + y*src_stride] = v;
2680 // old_dst[x + y*dst_stride] -= v;
2681 dst[x + src_x] -= v;
2685 STOP_TIMER("Inner add y block")
2690 //FIXME name clenup (b_w, block_w, b_width stuff)
2691 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){
2692 const int b_width = s->b_width << s->block_max_depth;
2693 const int b_height= s->b_height << s->block_max_depth;
2694 const int b_stride= b_width;
2695 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2696 BlockNode *rt= lt+1;
2697 BlockNode *lb= lt+b_stride;
2698 BlockNode *rb= lb+1;
2700 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2701 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2708 }else if(b_x + 1 >= b_width){
2715 }else if(b_y + 1 >= b_height){
2720 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2724 }else if(src_x + b_w > w){
2728 obmc -= src_y*obmc_stride;
2731 }else if(src_y + b_h> h){
2735 if(b_w<=0 || b_h<=0) return;
2737 assert(src_stride > 2*MB_SIZE + 5);
2738 dst += src_x + src_y*dst_stride;
2739 dst8+= src_x + src_y*src_stride;
2740 // src += src_x + src_y*src_stride;
2742 ptmp= tmp + 3*tmp_step;
2745 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2747 if(same_block(lt, rt)){
2752 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2755 if(same_block(lt, lb)){
2757 }else if(same_block(rt, lb)){
2762 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2765 if(same_block(lt, rb) ){
2767 }else if(same_block(rt, rb)){
2769 }else if(same_block(lb, rb)){
2773 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2776 for(y=0; y<b_h; y++){
2777 for(x=0; x<b_w; x++){
2778 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2779 if(add) dst[x + y*dst_stride] += v;
2780 else dst[x + y*dst_stride] -= v;
2783 for(y=0; y<b_h; y++){
2784 uint8_t *obmc2= obmc + (obmc_stride>>1);
2785 for(x=0; x<b_w; x++){
2786 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2787 if(add) dst[x + y*dst_stride] += v;
2788 else dst[x + y*dst_stride] -= v;
2791 for(y=0; y<b_h; y++){
2792 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2793 for(x=0; x<b_w; x++){
2794 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2795 if(add) dst[x + y*dst_stride] += v;
2796 else dst[x + y*dst_stride] -= v;
2799 for(y=0; y<b_h; y++){
2800 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2801 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2802 for(x=0; x<b_w; x++){
2803 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2804 if(add) dst[x + y*dst_stride] += v;
2805 else dst[x + y*dst_stride] -= v;
2809 for(y=0; y<b_h; y++){
2810 //FIXME ugly missue of obmc_stride
2811 uint8_t *obmc1= obmc + y*obmc_stride;
2812 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2813 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2814 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2815 for(x=0; x<b_w; x++){
2816 int v= obmc1[x] * block[3][x + y*src_stride]
2817 +obmc2[x] * block[2][x + y*src_stride]
2818 +obmc3[x] * block[1][x + y*src_stride]
2819 +obmc4[x] * block[0][x + y*src_stride];
2821 v <<= 8 - LOG2_OBMC_MAX;
2823 v += 1<<(7 - FRAC_BITS);
2824 v >>= 8 - FRAC_BITS;
2827 v += dst[x + y*dst_stride];
2828 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2829 if(v&(~255)) v= ~(v>>31);
2830 dst8[x + y*src_stride] = v;
2832 dst[x + y*dst_stride] -= v;
2839 static always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){
2840 Plane *p= &s->plane[plane_index];
2841 const int mb_w= s->b_width << s->block_max_depth;
2842 const int mb_h= s->b_height << s->block_max_depth;
2844 int block_size = MB_SIZE >> s->block_max_depth;
2845 int block_w = plane_index ? block_size/2 : block_size;
2846 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2847 int obmc_stride= plane_index ? block_size : 2*block_size;
2848 int ref_stride= s->current_picture.linesize[plane_index];
2849 uint8_t *ref = s->last_picture.data[plane_index];
2850 uint8_t *dst8= s->current_picture.data[plane_index];
2855 if(s->keyframe || (s->avctx->debug&512)){
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 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2867 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2869 if(v&(~255)) v= ~(v>>31);
2870 dst8[x + y*ref_stride]= v;
2874 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2876 // DWTELEM * line = slice_buffer_get_line(sb, y);
2877 DWTELEM * line = sb->line[y];
2880 line[x] -= 128 << FRAC_BITS;
2881 // buf[x + y*w]-= 128<<FRAC_BITS;
2889 for(mb_x=0; mb_x<=mb_w; mb_x++){
2892 add_yblock_buffered(s, sb, old_buffer, dst8, ref, obmc,
2893 block_w*mb_x - block_w/2,
2894 block_w*mb_y - block_w/2,
2897 w, ref_stride, obmc_stride,
2901 STOP_TIMER("add_yblock")
2904 STOP_TIMER("predict_slice")
2907 static always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){
2908 Plane *p= &s->plane[plane_index];
2909 const int mb_w= s->b_width << s->block_max_depth;
2910 const int mb_h= s->b_height << s->block_max_depth;
2912 int block_size = MB_SIZE >> s->block_max_depth;
2913 int block_w = plane_index ? block_size/2 : block_size;
2914 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2915 const int obmc_stride= plane_index ? block_size : 2*block_size;
2916 int ref_stride= s->current_picture.linesize[plane_index];
2917 uint8_t *ref = s->last_picture.data[plane_index];
2918 uint8_t *dst8= s->current_picture.data[plane_index];
2923 if(s->keyframe || (s->avctx->debug&512)){
2928 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2930 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2932 if(v&(~255)) v= ~(v>>31);
2933 dst8[x + y*ref_stride]= v;
2937 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2939 buf[x + y*w]-= 128<<FRAC_BITS;
2947 for(mb_x=0; mb_x<=mb_w; mb_x++){
2950 add_yblock(s, buf, dst8, ref, obmc,
2951 block_w*mb_x - block_w/2,
2952 block_w*mb_y - block_w/2,
2955 w, ref_stride, obmc_stride,
2959 STOP_TIMER("add_yblock")
2962 STOP_TIMER("predict_slice")
2965 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2966 const int mb_h= s->b_height << s->block_max_depth;
2968 for(mb_y=0; mb_y<=mb_h; mb_y++)
2969 predict_slice(s, buf, plane_index, add, mb_y);
2972 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){
2974 Plane *p= &s->plane[plane_index];
2975 const int block_size = MB_SIZE >> s->block_max_depth;
2976 const int block_w = plane_index ? block_size/2 : block_size;
2977 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2978 const int obmc_stride= plane_index ? block_size : 2*block_size;
2979 const int ref_stride= s->current_picture.linesize[plane_index];
2980 uint8_t *ref= s-> last_picture.data[plane_index];
2981 uint8_t *dst= s->current_picture.data[plane_index];
2982 uint8_t *src= s-> input_picture.data[plane_index];
2983 const static DWTELEM zero_dst[4096]; //FIXME
2984 const int b_stride = s->b_width << s->block_max_depth;
2985 const int w= p->width;
2986 const int h= p->height;
2987 int index= mb_x + mb_y*b_stride;
2988 BlockNode *b= &s->block[index];
2989 BlockNode backup= *b;
2993 b->type|= BLOCK_INTRA;
2994 b->color[plane_index]= 0;
2997 int mb_x2= mb_x + (i &1) - 1;
2998 int mb_y2= mb_y + (i>>1) - 1;
2999 int x= block_w*mb_x2 + block_w/2;
3000 int y= block_w*mb_y2 + block_w/2;
3002 add_yblock(s, zero_dst, dst, ref, obmc,
3003 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, plane_index);
3005 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){
3006 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
3007 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride;
3008 int obmc_v= obmc[index];
3009 if(y<0) obmc_v += obmc[index + block_w*obmc_stride];
3010 if(x<0) obmc_v += obmc[index + block_w];
3011 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride];
3012 if(x+block_w>w) obmc_v += obmc[index - block_w];
3013 //FIXME precalc this or simplify it somehow else
3015 ab += (src[x2 + y2*ref_stride] - dst[x2 + y2*ref_stride]) * obmc_v;
3016 aa += obmc_v * obmc_v; //FIXME precalclate this
3022 return clip(((ab<<6) + aa/2)/aa, 0, 255); //FIXME we shouldnt need cliping
3025 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){
3027 Plane *p= &s->plane[plane_index];
3028 const int block_size = MB_SIZE >> s->block_max_depth;
3029 const int block_w = plane_index ? block_size/2 : block_size;
3030 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
3031 const int obmc_stride= plane_index ? block_size : 2*block_size;
3032 const int ref_stride= s->current_picture.linesize[plane_index];
3033 uint8_t *ref= s-> last_picture.data[plane_index];
3034 uint8_t *dst= s->current_picture.data[plane_index];
3035 uint8_t *src= s-> input_picture.data[plane_index];
3036 const static DWTELEM zero_dst[4096]; //FIXME
3037 const int b_stride = s->b_width << s->block_max_depth;
3038 const int b_height = s->b_height<< s->block_max_depth;
3039 const int w= p->width;
3040 const int h= p->height;
3043 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
3046 int mb_x2= mb_x + (i &1) - 1;
3047 int mb_y2= mb_y + (i>>1) - 1;
3048 int x= block_w*mb_x2 + block_w/2;
3049 int y= block_w*mb_y2 + block_w/2;
3051 add_yblock(s, zero_dst, dst, ref, obmc,
3052 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, plane_index);
3054 //FIXME find a cleaner/simpler way to skip the outside stuff
3055 for(y2= y; y2<0; y2++)
3056 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
3057 for(y2= h; y2<y+block_w; y2++)
3058 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
3060 for(y2= y; y2<y+block_w; y2++)
3061 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x);
3064 for(y2= y; y2<y+block_w; y2++)
3065 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w);
3068 assert(block_w== 8 || block_w==16);
3069 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w);
3078 int x= mb_x + (i&1) - (i>>1);
3079 int y= mb_y + (i>>1);
3080 int index= x + y*b_stride;
3081 BlockNode *b = &s->block[index];
3082 BlockNode *left = x ? &s->block[index-1] : &null_block;
3083 BlockNode *top = y ? &s->block[index-b_stride] : &null_block;
3084 BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left;
3085 BlockNode *tr = y && x+1<b_stride ? &s->block[index-b_stride+1] : tl;
3086 int dmx= b->mx - mid_pred(left->mx, top->mx, tr->mx);
3087 int dmy= b->my - mid_pred(left->my, top->my, tr->my);
3088 // int mx_context= av_log2(2*ABS(left->mx - top->mx));
3089 // int my_context= av_log2(2*ABS(left->my - top->my));
3091 if(x<0 || x>=b_stride || y>=b_height)
3098 00001XXXX 15-30 8-15
3100 //FIXME try accurate rate
3101 //FIXME intra and inter predictors if surrounding blocks arent the same type
3102 if(b->type & BLOCK_INTRA){
3103 rate += 3+2*( av_log2(2*ABS(left->color[0] - b->color[0]))
3104 + av_log2(2*ABS(left->color[1] - b->color[1]))
3105 + av_log2(2*ABS(left->color[2] - b->color[2])));
3107 rate += 2*(1 + av_log2(2*ABS(dmx))
3108 + av_log2(2*ABS(dmy))); //FIXME kill the 2* can be merged in lambda
3112 return distortion + rate*penalty_factor;
3115 static always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, int *best_rd){
3116 const int b_stride= s->b_width << s->block_max_depth;
3117 BlockNode *block= &s->block[mb_x + mb_y * b_stride];
3118 BlockNode backup= *block;
3119 int rd, index, value;
3121 assert(mb_x>=0 && mb_y>=0);
3122 assert(mb_x<b_stride);
3125 block->color[0] = p[0];
3126 block->color[1] = p[1];
3127 block->color[2] = p[2];
3128 block->type |= BLOCK_INTRA;
3130 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1);
3131 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6);
3132 if(s->me_cache[index] == value)
3134 s->me_cache[index]= value;
3138 block->type &= ~BLOCK_INTRA;
3141 rd= get_block_rd(s, mb_x, mb_y, 0);
3153 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */
3154 static always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int intra, int *best_rd){
3155 int p[2] = {p0, p1};
3156 return check_block(s, mb_x, mb_y, p, intra, best_rd);
3159 static void iterative_me(SnowContext *s){
3160 int pass, mb_x, mb_y;
3161 const int b_width = s->b_width << s->block_max_depth;
3162 const int b_height= s->b_height << s->block_max_depth;
3163 const int b_stride= b_width;
3166 for(pass=0; pass<50; pass++){
3169 for(mb_y= 0; mb_y<b_height; mb_y++){
3170 for(mb_x= 0; mb_x<b_width; mb_x++){
3171 int dia_change, i, j;
3172 int best_rd= INT_MAX;
3174 const int index= mb_x + mb_y * b_stride;
3175 BlockNode *block= &s->block[index];
3176 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : &null_block;
3177 BlockNode *lb = mb_x ? &s->block[index -1] : &null_block;
3178 BlockNode *rb = mb_x<b_width ? &s->block[index +1] : &null_block;
3179 BlockNode *bb = mb_y<b_height ? &s->block[index+b_stride ] : &null_block;
3180 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : &null_block;
3181 BlockNode *trb= mb_x<b_width && mb_y ? &s->block[index-b_stride+1] : &null_block;
3182 BlockNode *blb= mb_x && mb_y<b_height ? &s->block[index+b_stride-1] : &null_block;
3183 BlockNode *brb= mb_x<b_width && mb_y<b_height ? &s->block[index+b_stride+1] : &null_block;
3185 if(pass && (block->type & BLOCK_OPT))
3187 block->type |= BLOCK_OPT;
3191 if(!s->me_cache_generation)
3192 memset(s->me_cache, 0, sizeof(s->me_cache));
3193 s->me_cache_generation += 1<<22;
3195 // get previous score (cant be cached due to OBMC)
3196 check_block_inter(s, mb_x, mb_y, block->mx, block->my, 0, &best_rd);
3197 check_block_inter(s, mb_x, mb_y, 0, 0, 0, &best_rd);
3198 check_block_inter(s, mb_x, mb_y, tb->mx, tb->my, 0, &best_rd);
3199 check_block_inter(s, mb_x, mb_y, lb->mx, lb->my, 0, &best_rd);
3200 check_block_inter(s, mb_x, mb_y, rb->mx, rb->my, 0, &best_rd);
3201 check_block_inter(s, mb_x, mb_y, bb->mx, bb->my, 0, &best_rd);
3204 //FIXME avoid subpel interpol / round to nearest integer
3207 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){
3209 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), 0, &best_rd);
3210 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), 0, &best_rd);
3211 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), 0, &best_rd);
3212 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), 0, &best_rd);
3218 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
3221 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], 0, &best_rd);
3223 //FIXME or try the standard 2 pass qpel or similar
3226 color[i]= get_dc(s, mb_x, mb_y, i);
3228 check_block(s, mb_x, mb_y, color, 1, &best_rd);
3229 //FIXME RD style color selection
3231 if(!same_block(block, &backup)){
3232 if(tb != &null_block) tb ->type &= ~BLOCK_OPT;
3233 if(lb != &null_block) lb ->type &= ~BLOCK_OPT;
3234 if(rb != &null_block) rb ->type &= ~BLOCK_OPT;
3235 if(bb != &null_block) bb ->type &= ~BLOCK_OPT;
3236 if(tlb!= &null_block) tlb->type &= ~BLOCK_OPT;
3237 if(trb!= &null_block) trb->type &= ~BLOCK_OPT;
3238 if(blb!= &null_block) blb->type &= ~BLOCK_OPT;
3239 if(brb!= &null_block) brb->type &= ~BLOCK_OPT;
3244 av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change);
3250 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
3251 const int level= b->level;
3252 const int w= b->width;
3253 const int h= b->height;
3254 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3255 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3256 int x,y, thres1, thres2;
3259 if(s->qlog == LOSSLESS_QLOG) return;
3261 bias= bias ? 0 : (3*qmul)>>3;
3262 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
3268 int i= src[x + y*stride];
3270 if((unsigned)(i+thres1) > thres2){
3273 i/= qmul; //FIXME optimize
3274 src[x + y*stride]= i;
3278 i/= qmul; //FIXME optimize
3279 src[x + y*stride]= -i;
3282 src[x + y*stride]= 0;
3288 int i= src[x + y*stride];
3290 if((unsigned)(i+thres1) > thres2){
3293 i= (i + bias) / qmul; //FIXME optimize
3294 src[x + y*stride]= i;
3298 i= (i + bias) / qmul; //FIXME optimize
3299 src[x + y*stride]= -i;
3302 src[x + y*stride]= 0;
3306 if(level+1 == s->spatial_decomposition_count){
3307 // STOP_TIMER("quantize")
3311 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
3312 const int w= b->width;
3313 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3314 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3315 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3319 if(s->qlog == LOSSLESS_QLOG) return;
3321 for(y=start_y; y<end_y; y++){
3322 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3323 DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3327 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3329 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
3333 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3334 STOP_TIMER("dquant")
3338 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
3339 const int w= b->width;
3340 const int h= b->height;
3341 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3342 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3343 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3347 if(s->qlog == LOSSLESS_QLOG) return;
3351 int i= src[x + y*stride];
3353 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3355 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
3359 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3360 STOP_TIMER("dquant")
3364 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3365 const int w= b->width;
3366 const int h= b->height;
3369 for(y=h-1; y>=0; y--){
3370 for(x=w-1; x>=0; x--){
3371 int i= x + y*stride;
3375 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3376 else src[i] -= src[i - 1];
3378 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3379 else src[i] -= src[i - 1];
3382 if(y) src[i] -= src[i - stride];
3388 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){
3389 const int w= b->width;
3398 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3400 for(y=start_y; y<end_y; y++){
3402 // line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3403 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3407 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
3408 else line[x] += line[x - 1];
3410 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
3411 else line[x] += line[x - 1];
3414 if(y) line[x] += prev[x];
3419 // STOP_TIMER("correlate")
3422 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3423 const int w= b->width;
3424 const int h= b->height;
3429 int i= x + y*stride;
3433 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3434 else src[i] += src[i - 1];
3436 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3437 else src[i] += src[i - 1];
3440 if(y) src[i] += src[i - stride];
3446 static void encode_header(SnowContext *s){
3447 int plane_index, level, orientation;
3450 memset(kstate, MID_STATE, sizeof(kstate));
3452 put_rac(&s->c, kstate, s->keyframe);
3453 if(s->keyframe || s->always_reset)
3456 put_symbol(&s->c, s->header_state, s->version, 0);
3457 put_rac(&s->c, s->header_state, s->always_reset);
3458 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
3459 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
3460 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
3461 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
3462 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
3463 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
3464 put_rac(&s->c, s->header_state, s->spatial_scalability);
3465 // put_rac(&s->c, s->header_state, s->rate_scalability);
3467 for(plane_index=0; plane_index<2; plane_index++){
3468 for(level=0; level<s->spatial_decomposition_count; level++){
3469 for(orientation=level ? 1:0; orientation<4; orientation++){
3470 if(orientation==2) continue;
3471 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
3476 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
3477 put_symbol(&s->c, s->header_state, s->qlog, 1);
3478 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
3479 put_symbol(&s->c, s->header_state, s->qbias, 1);
3480 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
3483 static int decode_header(SnowContext *s){
3484 int plane_index, level, orientation;
3487 memset(kstate, MID_STATE, sizeof(kstate));
3489 s->keyframe= get_rac(&s->c, kstate);
3490 if(s->keyframe || s->always_reset)
3493 s->version= get_symbol(&s->c, s->header_state, 0);
3495 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
3498 s->always_reset= get_rac(&s->c, s->header_state);
3499 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3500 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3501 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3502 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
3503 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
3504 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
3505 s->spatial_scalability= get_rac(&s->c, s->header_state);
3506 // s->rate_scalability= get_rac(&s->c, s->header_state);
3508 for(plane_index=0; plane_index<3; plane_index++){
3509 for(level=0; level<s->spatial_decomposition_count; level++){
3510 for(orientation=level ? 1:0; orientation<4; orientation++){
3512 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
3513 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
3514 else q= get_symbol(&s->c, s->header_state, 1);
3515 s->plane[plane_index].band[level][orientation].qlog= q;
3521 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3522 if(s->spatial_decomposition_type > 2){
3523 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
3527 s->qlog= get_symbol(&s->c, s->header_state, 1);
3528 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
3529 s->qbias= get_symbol(&s->c, s->header_state, 1);
3530 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
3531 if(s->block_max_depth > 1){
3532 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);
3533 s->block_max_depth= 0;
3540 static void init_qexp(){
3544 for(i=0; i<QROOT; i++){
3546 v *= pow(2, 1.0 / QROOT);
3550 static int common_init(AVCodecContext *avctx){
3551 SnowContext *s = avctx->priv_data;
3553 int level, orientation, plane_index, dec;
3557 dsputil_init(&s->dsp, avctx);
3560 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
3561 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
3562 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
3563 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
3564 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
3565 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
3584 #define mcfh(dx,dy)\
3585 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
3586 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
3587 mc_block_hpel ## dx ## dy ## 16;\
3588 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
3589 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
3590 mc_block_hpel ## dx ## dy ## 8;
3600 dec= s->spatial_decomposition_count= 5;
3601 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
3603 s->chroma_h_shift= 1; //FIXME XXX
3604 s->chroma_v_shift= 1;
3606 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
3608 width= s->avctx->width;
3609 height= s->avctx->height;
3611 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
3613 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
3614 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
3616 for(plane_index=0; plane_index<3; plane_index++){
3617 int w= s->avctx->width;
3618 int h= s->avctx->height;
3621 w>>= s->chroma_h_shift;
3622 h>>= s->chroma_v_shift;
3624 s->plane[plane_index].width = w;
3625 s->plane[plane_index].height= h;
3626 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
3627 for(level=s->spatial_decomposition_count-1; level>=0; level--){
3628 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3629 SubBand *b= &s->plane[plane_index].band[level][orientation];
3631 b->buf= s->spatial_dwt_buffer;
3633 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
3634 b->width = (w + !(orientation&1))>>1;
3635 b->height= (h + !(orientation>1))>>1;
3637 b->stride_line = 1 << (s->spatial_decomposition_count - level);
3638 b->buf_x_offset = 0;
3639 b->buf_y_offset = 0;
3643 b->buf_x_offset = (w+1)>>1;
3646 b->buf += b->stride>>1;
3647 b->buf_y_offset = b->stride_line >> 1;
3651 b->parent= &s->plane[plane_index].band[level-1][orientation];
3652 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff));
3661 width= s->width= avctx->width;
3662 height= s->height= avctx->height;
3664 assert(width && height);
3666 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
3672 static void calculate_vissual_weight(SnowContext *s, Plane *p){
3673 int width = p->width;
3674 int height= p->height;
3675 int level, orientation, x, y;
3677 for(level=0; level<s->spatial_decomposition_count; level++){
3678 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3679 SubBand *b= &p->band[level][orientation];
3680 DWTELEM *buf= b->buf;