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 LOSSLESS_QLOG -128
38 static const int8_t quant3[256]={
39 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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, 0,
56 static const int8_t quant3b[256]={
57 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70 -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,
74 static const int8_t quant5[256]={
75 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
80 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
84 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
85 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
86 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
92 static const int8_t quant7[256]={
93 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
98 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
99 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
100 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
101 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
102 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
103 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
104 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
105 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-1,-1,
110 static const int8_t quant9[256]={
111 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
112 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
115 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
116 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
117 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
119 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
120 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
121 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
122 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
123 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
126 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
128 static const int8_t quant11[256]={
129 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
130 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
131 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
134 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
135 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
136 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
137 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
138 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
139 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
140 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
146 static const int8_t quant13[256]={
147 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
148 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
149 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
150 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
151 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
152 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
153 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
154 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
155 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
156 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
157 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
158 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
159 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-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,-5,-5,
162 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
165 #define LOG2_OBMC_MAX 6
166 #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
168 static const uint8_t obmc32[1024]={
169 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,
170 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,
171 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,
172 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,
173 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,
174 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,
175 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,
176 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,
177 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,
178 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,
179 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,
180 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,
181 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,
182 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,
183 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,
184 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,
185 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,
186 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,
187 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,
188 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,
189 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
190 0, 1, 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,
191 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,
192 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,
193 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,
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, 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,
196 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,
197 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,
198 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,
199 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,
200 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,
203 static const uint8_t obmc16[256]={
204 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
205 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
206 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
207 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
208 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
209 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
210 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
211 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
212 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
213 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
214 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
215 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
216 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
217 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
218 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
219 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
223 static const uint8_t obmc32[1024]={
224 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,
225 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,
226 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,
227 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,
228 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,
229 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,
230 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,
231 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,
232 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,
233 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,
234 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,
235 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,
236 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,
237 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,
238 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,
239 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,
240 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,
241 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,
242 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,
243 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,
244 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,
245 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,
246 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,
247 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,
248 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,
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, 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,
251 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,
252 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,
253 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,
254 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,
255 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,
258 static const uint8_t obmc16[256]={
259 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
260 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
261 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
262 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
263 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
264 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
265 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
266 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
267 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
268 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
269 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
270 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
271 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
272 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
273 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
274 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
278 static const uint8_t obmc32[1024]={
279 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,
280 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,
281 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,
282 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,
283 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,
284 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,
285 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,
286 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,
287 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,
288 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,
289 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,
290 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,
291 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,
292 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,
293 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,
294 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,
295 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,
296 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,
297 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,
298 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,
299 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
300 0, 1, 3, 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,
301 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,
302 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,
303 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,
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, 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,
306 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,
307 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,
308 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,
309 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,
310 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,
313 static const uint8_t obmc16[256]={
314 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
315 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
316 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
317 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
318 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
319 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
320 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
321 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
322 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
323 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
324 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
325 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
326 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
327 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
328 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
329 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
335 static const uint8_t obmc8[64]={
336 1, 3, 5, 7, 7, 5, 3, 1,
337 3, 9,15,21,21,15, 9, 3,
338 5,15,25,35,35,25,15, 5,
339 7,21,35,49,49,35,21, 7,
340 7,21,35,49,49,35,21, 7,
341 5,15,25,35,35,25,15, 5,
342 3, 9,15,21,21,15, 9, 3,
343 1, 3, 5, 7, 7, 5, 3, 1,
348 static const uint8_t obmc4[16]={
356 static const uint8_t *obmc_tab[4]={
357 obmc32, obmc16, obmc8, obmc4
360 typedef struct BlockNode{
365 //#define TYPE_SPLIT 1
366 #define BLOCK_INTRA 1
367 //#define TYPE_NOCOLOR 4
368 uint8_t level; //FIXME merge into type?
371 #define LOG2_MB_SIZE 4
372 #define MB_SIZE (1<<LOG2_MB_SIZE)
374 typedef struct SubBand{
379 int qlog; ///< log(qscale)/log[2^(1/6)]
383 struct SubBand *parent;
384 uint8_t state[/*7*2*/ 7 + 512][32];
387 typedef struct Plane{
390 SubBand band[MAX_DECOMPOSITIONS][4];
393 typedef struct SnowContext{
394 // 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)
396 AVCodecContext *avctx;
399 AVFrame input_picture;
400 AVFrame current_picture;
401 AVFrame last_picture;
402 AVFrame mconly_picture;
403 // uint8_t q_context[16];
404 uint8_t header_state[32];
405 uint8_t block_state[128 + 32*128];
409 int spatial_decomposition_type;
410 int temporal_decomposition_type;
411 int spatial_decomposition_count;
412 int temporal_decomposition_count;
413 DWTELEM *spatial_dwt_buffer;
417 int spatial_scalability;
423 #define QBIAS_SHIFT 3
427 Plane plane[MAX_PLANES];
430 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)
433 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
434 static const uint8_t qexp[8]={
435 128, 140, 152, 166, 181, 197, 215, 235
436 // 64, 70, 76, 83, 91, 99, 108, 117
437 // 32, 35, 38, 41, 45, 49, 54, 59
438 // 16, 17, 19, 21, 23, 25, 27, 29
439 // 8, 9, 10, 10, 11, 12, 13, 15
442 static inline int mirror(int v, int m){
444 else if(v>m) return 2*m-v;
448 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
453 const int e= av_log2(a);
455 const int el= FFMIN(e, 10);
456 put_rac(c, state+0, 0);
459 put_rac(c, state+1+i, 1); //1..10
462 put_rac(c, state+1+9, 1); //1..10
464 put_rac(c, state+1+FFMIN(i,9), 0);
466 for(i=e-1; i>=el; i--){
467 put_rac(c, state+22+9, (a>>i)&1); //22..31
470 put_rac(c, state+22+i, (a>>i)&1); //22..31
474 put_rac(c, state+11 + el, v < 0); //11..21
477 put_rac(c, state+0, 0);
480 put_rac(c, state+1+i, 1); //1..10
482 put_rac(c, state+1+i, 0);
484 for(i=e-1; i>=0; i--){
485 put_rac(c, state+22+i, (a>>i)&1); //22..31
489 put_rac(c, state+11 + e, v < 0); //11..21
492 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
494 put_rac(c, state+1+FFMIN(i,9), 0);
496 for(i=e-1; i>=0; i--){
497 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
501 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
505 put_rac(c, state+0, 1);
509 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
510 if(get_rac(c, state+0))
515 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
520 for(i=e-1; i>=0; i--){
521 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
524 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
531 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
533 int r= log2>=0 ? 1<<log2 : 1;
539 put_rac(c, state+4+log2, 1);
544 put_rac(c, state+4+log2, 0);
546 for(i=log2-1; i>=0; i--){
547 put_rac(c, state+31-i, (v>>i)&1);
551 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
553 int r= log2>=0 ? 1<<log2 : 1;
558 while(get_rac(c, state+4+log2)){
564 for(i=log2-1; i>=0; i--){
565 v+= get_rac(c, state+31-i)<<i;
571 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){
572 const int mirror_left= !highpass;
573 const int mirror_right= (width&1) ^ highpass;
574 const int w= (width>>1) - 1 + (highpass & width);
577 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
579 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
585 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
589 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
593 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){
594 const int mirror_left= !highpass;
595 const int mirror_right= (width&1) ^ highpass;
596 const int w= (width>>1) - 1 + (highpass & width);
603 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
609 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
612 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
616 int r= 3*2*ref[w*ref_step];
619 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
624 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
627 for(x=start; x<width; x+=2){
631 int x2= x + 2*i - n + 1;
633 else if(x2>=width) x2= 2*width-x2-2;
634 sum += coeffs[i]*(int64_t)dst[x2];
636 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
637 else dst[x] += (sum + (1<<shift)/2)>>shift;
641 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
643 for(y=start; y<height; y+=2){
644 for(x=0; x<width; x++){
648 int y2= y + 2*i - n + 1;
650 else if(y2>=height) y2= 2*height-y2-2;
651 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
653 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
654 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
663 #if 0 // more accurate 9/7
666 #define COEFFS1 (int[]){-25987,-25987}
669 #define COEFFS2 (int[]){-27777,-27777}
672 #define COEFFS3 (int[]){28931,28931}
675 #define COEFFS4 (int[]){14533,14533}
679 #define COEFFS1 (int[]){1,-9,-9,1}
682 #define COEFFS2 (int[]){-1,5,5,-1}
695 #define COEFFS1 (int[]){1,1}
698 #define COEFFS2 (int[]){-1,-1}
711 #define COEFFS2 (int[]){-1,-1}
714 #define COEFFS3 (int[]){-1,-1}
717 #define COEFFS4 (int[]){-5,29,29,-5}
722 #define COEFFS1 (int[]){-203,-203}
725 #define COEFFS2 (int[]){-217,-217}
728 #define COEFFS3 (int[]){113,113}
731 #define COEFFS4 (int[]){227,227}
739 #define COEFFS2 (int[]){-1,-1}
742 #define COEFFS3 (int[]){-1,-1}
745 #define COEFFS4 (int[]){3,3}
749 #define COEFFS1 (int[]){1,-9,-9,1}
752 #define COEFFS2 (int[]){1,1}
762 #define COEFFS1 (int[]){1,-9,-9,1}
765 #define COEFFS2 (int[]){-1,5,5,-1}
773 static void horizontal_decomposeX(DWTELEM *b, int width){
775 const int width2= width>>1;
776 const int w2= (width+1)>>1;
779 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
780 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
781 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
782 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
784 for(x=0; x<width2; x++){
786 temp[x+w2]= b[2*x + 1];
790 memcpy(b, temp, width*sizeof(int));
793 static void horizontal_composeX(DWTELEM *b, int width){
795 const int width2= width>>1;
797 const int w2= (width+1)>>1;
799 memcpy(temp, b, width*sizeof(int));
800 for(x=0; x<width2; x++){
802 b[2*x + 1]= temp[x+w2];
807 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
808 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
809 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
810 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
813 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
816 for(y=0; y<height; y++){
817 for(x=0; x<width; x++){
818 buffer[y*stride + x] *= SCALEX;
822 for(y=0; y<height; y++){
823 horizontal_decomposeX(buffer + y*stride, width);
826 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
827 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
828 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
829 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
832 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
835 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
836 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
837 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
838 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
840 for(y=0; y<height; y++){
841 horizontal_composeX(buffer + y*stride, width);
844 for(y=0; y<height; y++){
845 for(x=0; x<width; x++){
846 buffer[y*stride + x] /= SCALEX;
851 static void horizontal_decompose53i(DWTELEM *b, int width){
853 const int width2= width>>1;
855 const int w2= (width+1)>>1;
857 for(x=0; x<width2; x++){
859 temp[x+w2]= b[2*x + 1];
871 for(x=1; x+1<width2; x+=2){
875 A2 += (A1 + A3 + 2)>>2;
879 A1= temp[x+1+width2];
882 A4 += (A1 + A3 + 2)>>2;
888 A2 += (A1 + A3 + 2)>>2;
892 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
893 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
897 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
900 for(i=0; i<width; i++){
901 b1[i] -= (b0[i] + b2[i])>>1;
905 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
908 for(i=0; i<width; i++){
909 b1[i] += (b0[i] + b2[i] + 2)>>2;
913 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
915 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
916 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
918 for(y=-2; y<height; y+=2){
919 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
920 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
923 if(b1 <= b3) horizontal_decompose53i(b2, width);
924 if(y+2 < height) horizontal_decompose53i(b3, width);
925 STOP_TIMER("horizontal_decompose53i")}
928 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
929 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
930 STOP_TIMER("vertical_decompose53i*")}
1006 static void horizontal_decompose97i(DWTELEM *b, int width){
1007 DWTELEM temp[width];
1008 const int w2= (width+1)>>1;
1010 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1011 lift (temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1012 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1013 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1017 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1020 for(i=0; i<width; i++){
1021 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1025 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1028 for(i=0; i<width; i++){
1030 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1032 int r= 3*(b0[i] + b2[i]);
1035 b1[i] += (r+W_CO)>>W_CS;
1040 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1043 for(i=0; i<width; i++){
1044 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1048 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1051 for(i=0; i<width; i++){
1052 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1056 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1058 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1059 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1060 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1061 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1063 for(y=-4; y<height; y+=2){
1064 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1065 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1068 if(b3 <= b5) horizontal_decompose97i(b4, width);
1069 if(y+4 < height) horizontal_decompose97i(b5, width);
1071 STOP_TIMER("horizontal_decompose97i")
1075 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1076 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1077 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1078 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1081 STOP_TIMER("vertical_decompose97i")
1091 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1094 for(level=0; level<decomposition_count; level++){
1096 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1097 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1098 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1103 static void horizontal_compose53i(DWTELEM *b, int width){
1104 DWTELEM temp[width];
1105 const int width2= width>>1;
1106 const int w2= (width+1)>>1;
1117 for(x=1; x+1<width2; x+=2){
1121 A2 += (A1 + A3 + 2)>>2;
1125 A1= temp[x+1+width2];
1128 A4 += (A1 + A3 + 2)>>2;
1134 A2 += (A1 + A3 + 2)>>2;
1138 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1139 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1141 for(x=0; x<width2; x++){
1143 b[2*x + 1]= temp[x+w2];
1149 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1152 for(i=0; i<width; i++){
1153 b1[i] += (b0[i] + b2[i])>>1;
1157 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1160 for(i=0; i<width; i++){
1161 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1165 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1167 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride;
1168 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride;
1170 for(y=-1; y<=height; y+=2){
1171 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1172 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1175 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1176 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1177 STOP_TIMER("vertical_compose53i*")}
1180 if(y-1 >= 0) horizontal_compose53i(b0, width);
1181 if(b0 <= b2) horizontal_compose53i(b1, width);
1182 STOP_TIMER("horizontal_compose53i")}
1190 static void horizontal_compose97i(DWTELEM *b, int width){
1191 DWTELEM temp[width];
1192 const int w2= (width+1)>>1;
1194 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1195 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1196 lift (b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1197 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1200 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1203 for(i=0; i<width; i++){
1204 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1208 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1211 for(i=0; i<width; i++){
1213 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1215 int r= 3*(b0[i] + b2[i]);
1218 b1[i] -= (r+W_CO)>>W_CS;
1223 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1226 for(i=0; i<width; i++){
1227 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1231 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1234 for(i=0; i<width; i++){
1235 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1239 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1241 DWTELEM *b0= buffer + mirror(-3-1, height-1)*stride;
1242 DWTELEM *b1= buffer + mirror(-3 , height-1)*stride;
1243 DWTELEM *b2= buffer + mirror(-3+1, height-1)*stride;
1244 DWTELEM *b3= buffer + mirror(-3+2, height-1)*stride;
1246 for(y=-3; y<=height; y+=2){
1247 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1248 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1250 if(stride == width && y+4 < height && 0){
1252 for(x=0; x<width/2; x++)
1259 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1260 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1261 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1262 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1264 STOP_TIMER("vertical_compose97i")}}
1267 if(y-1>= 0) horizontal_compose97i(b0, width);
1268 if(b0 <= b2) horizontal_compose97i(b1, width);
1269 if(width>400 && b0 <= b2){
1270 STOP_TIMER("horizontal_compose97i")}}
1279 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1282 for(level=decomposition_count-1; level>=0; level--){
1284 case 0: spatial_compose97i(buffer, width>>level, height>>level, stride<<level); break;
1285 case 1: spatial_compose53i(buffer, width>>level, height>>level, stride<<level); break;
1286 case 2: spatial_composeX (buffer, width>>level, height>>level, stride<<level); break;
1291 static void encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1292 const int w= b->width;
1293 const int h= b->height;
1304 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1305 v= src[x + y*stride];
1308 t= src[x + (y-1)*stride];
1310 lt= src[x - 1 + (y-1)*stride];
1313 rt= src[x + 1 + (y-1)*stride];
1317 l= src[x - 1 + y*stride];
1319 if(orientation==1) ll= src[y + (x-2)*stride];
1320 else ll= src[x - 2 + y*stride];
1326 if(px<b->parent->width && py<b->parent->height)
1327 p= parent[px + py*2*stride];
1329 if(!(/*ll|*/l|lt|t|rt|p)){
1331 runs[run_index++]= run;
1339 runs[run_index++]= run;
1341 run= runs[run_index++];
1343 put_symbol2(&s->c, b->state[1], run, 3);
1348 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1349 v= src[x + y*stride];
1352 t= src[x + (y-1)*stride];
1354 lt= src[x - 1 + (y-1)*stride];
1357 rt= src[x + 1 + (y-1)*stride];
1361 l= src[x - 1 + y*stride];
1363 if(orientation==1) ll= src[y + (x-2)*stride];
1364 else ll= src[x - 2 + y*stride];
1370 if(px<b->parent->width && py<b->parent->height)
1371 p= parent[px + py*2*stride];
1373 if(/*ll|*/l|lt|t|rt|p){
1374 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1376 put_rac(&s->c, &b->state[0][context], !!v);
1379 run= runs[run_index++];
1381 put_symbol2(&s->c, b->state[1], run, 3);
1389 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1391 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1392 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
1399 static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1400 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1401 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1402 encode_subband_c0run(s, b, src, parent, stride, orientation);
1403 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1406 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1407 const int w= b->width;
1408 const int h= b->height;
1410 const int qlog= clip(s->qlog + b->qlog, 0, 128);
1411 int qmul= qexp[qlog&7]<<(qlog>>3);
1412 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1416 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1426 int parent_index= 0;
1427 int prev_parent_index= 0;
1429 for(y=0; y<b->height; y++)
1430 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
1432 run= get_symbol2(&s->c, b->state[1], 3);
1435 int lt=0, t=0, rt=0;
1437 if(y && b->x[prev_index] == 0){
1438 rt= b->coeff[prev_index];
1447 if(b->x[prev_index] <= x)
1449 if(b->x[prev_index] == x + 1)
1450 rt= b->coeff[prev_index];
1455 if(x>>1 > b->parent->x[parent_index]){
1458 if(x>>1 == b->parent->x[parent_index]){
1459 p= b->parent->coeff[parent_index];
1462 if(/*ll|*/l|lt|t|rt|p){
1463 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1465 v=get_rac(&s->c, &b->state[0][context]);
1468 run= get_symbol2(&s->c, b->state[1], 3);
1477 max_run= FFMIN(run, b->x[prev_index] - x - 2);
1478 max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1);
1485 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1486 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1;
1487 if(get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])){
1488 src[x + y*stride]=-(( v*qmul + qadd)>>(QEXPSHIFT));
1491 src[x + y*stride]= (( v*qmul + qadd)>>(QEXPSHIFT));
1493 b->x[index]=x; //FIXME interleave x/coeff
1494 b->coeff[index++]= v;
1497 b->x[index++]= w+1; //end marker
1498 prev_index= prev2_index;
1502 while(b->parent->x[parent_index] != b->parent->width+1)
1506 prev_parent_index= parent_index;
1508 parent_index= prev_parent_index;
1512 b->x[index++]= w+1; //end marker
1513 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
1514 STOP_TIMER("decode_subband")
1521 static void reset_contexts(SnowContext *s){
1522 int plane_index, level, orientation;
1524 for(plane_index=0; plane_index<3; plane_index++){
1525 for(level=0; level<s->spatial_decomposition_count; level++){
1526 for(orientation=level ? 1:0; orientation<4; orientation++){
1527 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1531 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1532 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1535 static int alloc_blocks(SnowContext *s){
1536 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1537 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1542 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1546 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1547 uint8_t *bytestream= d->bytestream;
1548 uint8_t *bytestream_start= d->bytestream_start;
1550 d->bytestream= bytestream;
1551 d->bytestream_start= bytestream_start;
1554 //near copy & paste from dsputil, FIXME
1555 static int pix_sum(uint8_t * pix, int line_size, int w)
1560 for (i = 0; i < w; i++) {
1561 for (j = 0; j < w; j++) {
1565 pix += line_size - w;
1570 //near copy & paste from dsputil, FIXME
1571 static int pix_norm1(uint8_t * pix, int line_size, int w)
1574 uint32_t *sq = squareTbl + 256;
1577 for (i = 0; i < w; i++) {
1578 for (j = 0; j < w; j ++) {
1582 pix += line_size - w;
1587 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){
1588 const int w= s->b_width << s->block_max_depth;
1589 const int rem_depth= s->block_max_depth - level;
1590 const int index= (x + y*w) << rem_depth;
1591 const int block_w= 1<<rem_depth;
1603 for(j=0; j<block_w; j++){
1604 for(i=0; i<block_w; i++){
1605 s->block[index + i + j*w]= block;
1610 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){
1611 const int offset[3]= {
1613 ((y*c->uvstride + x)>>1),
1614 ((y*c->uvstride + x)>>1),
1618 c->src[0][i]= src [i];
1619 c->ref[0][i]= ref [i] + offset[i];
1627 #define P_TOPRIGHT P[3]
1628 #define P_MEDIAN P[4]
1630 #define FLAG_QPEL 1 //must be 1
1632 static int encode_q_branch(SnowContext *s, int level, int x, int y){
1633 uint8_t p_buffer[1024];
1634 uint8_t i_buffer[1024];
1635 uint8_t p_state[sizeof(s->block_state)];
1636 uint8_t i_state[sizeof(s->block_state)];
1638 uint8_t *pbbak= s->c.bytestream;
1639 uint8_t *pbbak_start= s->c.bytestream_start;
1640 int score, score2, iscore, i_len, p_len, block_s, sum;
1641 const int w= s->b_width << s->block_max_depth;
1642 const int h= s->b_height << s->block_max_depth;
1643 const int rem_depth= s->block_max_depth - level;
1644 const int index= (x + y*w) << rem_depth;
1645 const int block_w= 1<<(LOG2_MB_SIZE - level);
1646 static BlockNode null_block= { //FIXME add border maybe
1647 .color= {128,128,128},
1653 int trx= (x+1)<<rem_depth;
1654 int try= (y+1)<<rem_depth;
1655 BlockNode *left = x ? &s->block[index-1] : &null_block;
1656 BlockNode *top = y ? &s->block[index-w] : &null_block;
1657 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
1658 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
1659 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
1660 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
1661 int pl = left->color[0];
1662 int pcb= left->color[1];
1663 int pcr= left->color[2];
1664 int pmx= mid_pred(left->mx, top->mx, tr->mx);
1665 int pmy= mid_pred(left->my, top->my, tr->my);
1668 const int stride= s->current_picture.linesize[0];
1669 const int uvstride= s->current_picture.linesize[1];
1670 const int instride= s->input_picture.linesize[0];
1671 const int uvinstride= s->input_picture.linesize[1];
1672 uint8_t *new_l = s->input_picture.data[0] + (x + y* instride)*block_w;
1673 uint8_t *new_cb= s->input_picture.data[1] + (x + y*uvinstride)*block_w/2;
1674 uint8_t *new_cr= s->input_picture.data[2] + (x + y*uvinstride)*block_w/2;
1675 uint8_t current_mb[3][stride*block_w];
1676 uint8_t *current_data[3]= {¤t_mb[0][0], ¤t_mb[1][0], ¤t_mb[2][0]};
1678 int16_t last_mv[3][2];
1679 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
1680 const int shift= 1+qpel;
1681 MotionEstContext *c= &s->m.me;
1682 int mx_context= av_log2(2*ABS(left->mx - top->mx));
1683 int my_context= av_log2(2*ABS(left->my - top->my));
1684 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
1686 assert(sizeof(s->block_state) >= 256);
1688 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
1693 for(i=0; i<block_w; i++)
1694 memcpy(¤t_mb[0][0] + stride*i, new_l + instride*i, block_w);
1695 for(i=0; i<block_w>>1; i++)
1696 memcpy(¤t_mb[1][0] + uvstride*i, new_cb + uvinstride*i, block_w>>1);
1697 for(i=0; i<block_w>>1; i++)
1698 memcpy(¤t_mb[2][0] + uvstride*i, new_cr + uvinstride*i, block_w>>1);
1700 // clip predictors / edge ?
1702 P_LEFT[0]= left->mx;
1703 P_LEFT[1]= left->my;
1706 P_TOPRIGHT[0]= tr->mx;
1707 P_TOPRIGHT[1]= tr->my;
1709 last_mv[0][0]= s->block[index].mx;
1710 last_mv[0][1]= s->block[index].my;
1711 last_mv[1][0]= right->mx;
1712 last_mv[1][1]= right->my;
1713 last_mv[2][0]= bottom->mx;
1714 last_mv[2][1]= bottom->my;
1721 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
1723 assert(s->m.me. stride == stride);
1724 assert(s->m.me.uvstride == uvstride);
1726 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
1727 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
1728 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
1729 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
1731 c->xmin = - x*block_w - 16+2;
1732 c->ymin = - y*block_w - 16+2;
1733 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
1734 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
1736 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
1737 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
1738 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
1739 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
1740 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
1741 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
1742 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
1744 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
1745 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
1748 c->pred_x= P_LEFT[0];
1749 c->pred_y= P_LEFT[1];
1751 c->pred_x = P_MEDIAN[0];
1752 c->pred_y = P_MEDIAN[1];
1755 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
1756 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
1758 assert(mx >= c->xmin);
1759 assert(mx <= c->xmax);
1760 assert(my >= c->ymin);
1761 assert(my <= c->ymax);
1763 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
1764 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
1765 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
1769 pc.bytestream_start=
1770 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
1771 memcpy(p_state, s->block_state, sizeof(s->block_state));
1773 if(level!=s->block_max_depth)
1774 put_rac(&pc, &p_state[4 + s_context], 1);
1775 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
1776 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
1777 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
1778 p_len= pc.bytestream - pc.bytestream_start;
1779 score += (s->lambda2*(p_len*8
1780 + (pc.outstanding_count - s->c.outstanding_count)*8
1781 + (-av_log2(pc.range) + av_log2(s->c.range))
1782 ))>>FF_LAMBDA_SHIFT;
1784 block_s= block_w*block_w;
1785 sum = pix_sum(¤t_mb[0][0], stride, block_w);
1786 l= (sum + block_s/2)/block_s;
1787 iscore = pix_norm1(¤t_mb[0][0], stride, block_w) - 2*l*sum + l*l*block_s;
1789 block_s= block_w*block_w>>2;
1790 sum = pix_sum(¤t_mb[1][0], uvstride, block_w>>1);
1791 cb= (sum + block_s/2)/block_s;
1792 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
1793 sum = pix_sum(¤t_mb[2][0], uvstride, block_w>>1);
1794 cr= (sum + block_s/2)/block_s;
1795 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
1798 ic.bytestream_start=
1799 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
1800 memcpy(i_state, s->block_state, sizeof(s->block_state));
1801 if(level!=s->block_max_depth)
1802 put_rac(&ic, &i_state[4 + s_context], 1);
1803 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
1804 put_symbol(&ic, &i_state[32], l-pl , 1);
1805 put_symbol(&ic, &i_state[64], cb-pcb, 1);
1806 put_symbol(&ic, &i_state[96], cr-pcr, 1);
1807 i_len= ic.bytestream - ic.bytestream_start;
1808 iscore += (s->lambda2*(i_len*8
1809 + (ic.outstanding_count - s->c.outstanding_count)*8
1810 + (-av_log2(ic.range) + av_log2(s->c.range))
1811 ))>>FF_LAMBDA_SHIFT;
1813 // assert(score==256*256*256*64-1);
1814 assert(iscore < 255*255*256 + s->lambda2*10);
1815 assert(iscore >= 0);
1816 assert(l>=0 && l<=255);
1817 assert(pl>=0 && pl<=255);
1820 int varc= iscore >> 8;
1821 int vard= score >> 8;
1822 if (vard <= 64 || vard < varc)
1823 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1825 c->scene_change_score+= s->m.qscale;
1828 if(level!=s->block_max_depth){
1829 put_rac(&s->c, &s->block_state[4 + s_context], 0);
1830 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
1831 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
1832 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
1833 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
1834 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
1836 if(score2 < score && score2 < iscore)
1841 memcpy(pbbak, i_buffer, i_len);
1843 s->c.bytestream_start= pbbak_start;
1844 s->c.bytestream= pbbak + i_len;
1845 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
1846 memcpy(s->block_state, i_state, sizeof(s->block_state));
1849 memcpy(pbbak, p_buffer, p_len);
1851 s->c.bytestream_start= pbbak_start;
1852 s->c.bytestream= pbbak + p_len;
1853 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
1854 memcpy(s->block_state, p_state, sizeof(s->block_state));
1859 static void decode_q_branch(SnowContext *s, int level, int x, int y){
1860 const int w= s->b_width << s->block_max_depth;
1861 const int rem_depth= s->block_max_depth - level;
1862 const int index= (x + y*w) << rem_depth;
1863 static BlockNode null_block= { //FIXME add border maybe
1864 .color= {128,128,128},
1870 int trx= (x+1)<<rem_depth;
1871 BlockNode *left = x ? &s->block[index-1] : &null_block;
1872 BlockNode *top = y ? &s->block[index-w] : &null_block;
1873 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
1874 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
1875 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
1878 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);
1882 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
1884 int l = left->color[0];
1885 int cb= left->color[1];
1886 int cr= left->color[2];
1887 int mx= mid_pred(left->mx, top->mx, tr->mx);
1888 int my= mid_pred(left->my, top->my, tr->my);
1889 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
1890 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
1892 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
1895 l += get_symbol(&s->c, &s->block_state[32], 1);
1896 cb+= get_symbol(&s->c, &s->block_state[64], 1);
1897 cr+= get_symbol(&s->c, &s->block_state[96], 1);
1899 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
1900 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
1902 set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
1904 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
1905 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
1906 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
1907 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
1911 static void encode_blocks(SnowContext *s){
1918 encode_q_branch(s, 0, x, y);
1923 static void decode_blocks(SnowContext *s){
1930 decode_q_branch(s, 0, x, y);
1935 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){
1938 for(y=0; y < b_h+5; y++){
1939 for(x=0; x < b_w; x++){
1946 // int am= 9*(a1+a2) - (a0+a3);
1947 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1948 // int am= 18*(a2+a3) - 2*(a1+a4);
1949 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1950 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
1952 // if(b_w==16) am= 8*(a1+a2);
1954 if(dx<8) tmp[x]= (32*a2*( 8-dx) + am* dx + 128)>>8;
1955 else tmp[x]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
1957 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
1958 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
1959 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
1960 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
1965 tmp -= (b_h+5)*stride;
1967 for(y=0; y < b_h; y++){
1968 for(x=0; x < b_w; x++){
1969 int a0= tmp[x + 0*stride];
1970 int a1= tmp[x + 1*stride];
1971 int a2= tmp[x + 2*stride];
1972 int a3= tmp[x + 3*stride];
1973 int a4= tmp[x + 4*stride];
1974 int a5= tmp[x + 5*stride];
1975 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1976 // int am= 18*(a2+a3) - 2*(a1+a4);
1977 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1978 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
1980 // if(b_w==16) am= 8*(a1+a2);
1982 if(dy<8) dst[x]= (32*a2*( 8-dy) + am* dy + 128)>>8;
1983 else dst[x]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
1985 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
1986 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
1987 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
1988 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
1993 STOP_TIMER("mc_block")
1996 #define mca(dx,dy,b_w)\
1997 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
1998 uint8_t tmp[stride*(b_w+5)];\
2000 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2012 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){
2015 const int color= block->color[plane_index];
2016 for(y=0; y < b_h; y++){
2017 for(x=0; x < b_w; x++){
2018 dst[x + y*stride]= color;
2022 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2023 int mx= block->mx*scale;
2024 int my= block->my*scale;
2025 const int dx= mx&15;
2026 const int dy= my&15;
2029 src += sx + sy*stride;
2030 if( (unsigned)sx >= w - b_w - 4
2031 || (unsigned)sy >= h - b_h - 4){
2032 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2035 if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16))
2036 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2038 s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2042 static always_inline int same_block(BlockNode *a, BlockNode *b){
2043 return !((a->mx - b->mx) | (a->my - b->my) | a->type | b->type);
2046 //FIXME name clenup (b_w, block_w, b_width stuff)
2047 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){
2048 const int b_width = s->b_width << s->block_max_depth;
2049 const int b_height= s->b_height << s->block_max_depth;
2050 const int b_stride= b_width;
2051 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2052 BlockNode *rt= lt+1;
2053 BlockNode *lb= lt+b_stride;
2054 BlockNode *rb= lb+1;
2056 uint8_t tmp[src_stride*(b_h+5)]; //FIXME align
2062 }else if(b_x + 1 >= b_width){
2069 }else if(b_y + 1 >= b_height){
2074 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2078 }else if(src_x + b_w > w){
2082 obmc -= src_y*obmc_stride;
2085 }else if(src_y + b_h> h){
2089 if(b_w<=0 || b_h<=0) return;
2091 assert(src_stride > 7*MB_SIZE);
2092 dst += src_x + src_y*dst_stride;
2093 dst8+= src_x + src_y*src_stride;
2094 // src += src_x + src_y*src_stride;
2096 block[0]= tmp+3*MB_SIZE;
2097 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2099 if(same_block(lt, rt)){
2102 block[1]= tmp + 4*MB_SIZE;
2103 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2106 if(same_block(lt, lb)){
2108 }else if(same_block(rt, lb)){
2111 block[2]= tmp+5*MB_SIZE;
2112 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2115 if(same_block(lt, rb) ){
2117 }else if(same_block(rt, rb)){
2119 }else if(same_block(lb, rb)){
2122 block[3]= tmp+6*MB_SIZE;
2123 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2126 for(y=0; y<b_h; y++){
2127 for(x=0; x<b_w; x++){
2128 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2129 if(add) dst[x + y*dst_stride] += v;
2130 else dst[x + y*dst_stride] -= v;
2133 for(y=0; y<b_h; y++){
2134 uint8_t *obmc2= obmc + (obmc_stride>>1);
2135 for(x=0; x<b_w; x++){
2136 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2137 if(add) dst[x + y*dst_stride] += v;
2138 else dst[x + y*dst_stride] -= v;
2141 for(y=0; y<b_h; y++){
2142 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2143 for(x=0; x<b_w; x++){
2144 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2145 if(add) dst[x + y*dst_stride] += v;
2146 else dst[x + y*dst_stride] -= v;
2149 for(y=0; y<b_h; y++){
2150 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2151 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2152 for(x=0; x<b_w; x++){
2153 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2154 if(add) dst[x + y*dst_stride] += v;
2155 else dst[x + y*dst_stride] -= v;
2159 for(y=0; y<b_h; y++){
2160 //FIXME ugly missue of obmc_stride
2161 uint8_t *obmc1= obmc + y*obmc_stride;
2162 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2163 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2164 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2165 for(x=0; x<b_w; x++){
2166 int v= obmc1[x] * block[3][x + y*src_stride]
2167 +obmc2[x] * block[2][x + y*src_stride]
2168 +obmc3[x] * block[1][x + y*src_stride]
2169 +obmc4[x] * block[0][x + y*src_stride];
2171 v <<= 8 - LOG2_OBMC_MAX;
2173 v += 1<<(7 - FRAC_BITS);
2174 v >>= 8 - FRAC_BITS;
2177 v += dst[x + y*dst_stride];
2178 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2179 if(v&(~255)) v= ~(v>>31);
2180 dst8[x + y*src_stride] = v;
2182 dst[x + y*dst_stride] -= v;
2189 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2190 Plane *p= &s->plane[plane_index];
2191 const int mb_w= s->b_width << s->block_max_depth;
2192 const int mb_h= s->b_height << s->block_max_depth;
2193 int x, y, mb_x, mb_y;
2194 int block_size = MB_SIZE >> s->block_max_depth;
2195 int block_w = plane_index ? block_size/2 : block_size;
2196 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2197 int obmc_stride= plane_index ? block_size : 2*block_size;
2198 int ref_stride= s->current_picture.linesize[plane_index];
2199 uint8_t *ref = s->last_picture.data[plane_index];
2200 uint8_t *dst8= s->current_picture.data[plane_index];
2205 if(s->keyframe || (s->avctx->debug&512)){
2209 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2211 if(v&(~255)) v= ~(v>>31);
2212 dst8[x + y*ref_stride]= v;
2218 buf[x + y*w]-= 128<<FRAC_BITS;
2226 for(mb_y=0; mb_y<=mb_h; mb_y++){
2227 for(mb_x=0; mb_x<=mb_w; mb_x++){
2230 add_yblock(s, buf, dst8, ref, obmc,
2231 block_w*mb_x - block_w/2,
2232 block_w*mb_y - block_w/2,
2235 w, ref_stride, obmc_stride,
2239 STOP_TIMER("add_yblock")
2243 STOP_TIMER("predict_plane")
2246 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
2247 const int level= b->level;
2248 const int w= b->width;
2249 const int h= b->height;
2250 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2251 const int qmul= qexp[qlog&7]<<(qlog>>3);
2252 int x,y, thres1, thres2;
2257 if(s->qlog == LOSSLESS_QLOG) return;
2259 bias= bias ? 0 : (3*qmul)>>3;
2260 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
2266 int i= src[x + y*stride];
2268 if((unsigned)(i+thres1) > thres2){
2271 i/= qmul; //FIXME optimize
2272 src[x + y*stride]= i;
2276 i/= qmul; //FIXME optimize
2277 src[x + y*stride]= -i;
2280 src[x + y*stride]= 0;
2286 int i= src[x + y*stride];
2288 if((unsigned)(i+thres1) > thres2){
2291 i= (i + bias) / qmul; //FIXME optimize
2292 src[x + y*stride]= i;
2296 i= (i + bias) / qmul; //FIXME optimize
2297 src[x + y*stride]= -i;
2300 src[x + y*stride]= 0;
2304 if(level+1 == s->spatial_decomposition_count){
2305 // STOP_TIMER("quantize")
2309 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
2310 const int w= b->width;
2311 const int h= b->height;
2312 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2313 const int qmul= qexp[qlog&7]<<(qlog>>3);
2314 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
2318 if(s->qlog == LOSSLESS_QLOG) return;
2324 int i= src[x + y*stride];
2326 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
2328 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
2332 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
2333 STOP_TIMER("dquant")
2337 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2338 const int w= b->width;
2339 const int h= b->height;
2342 for(y=h-1; y>=0; y--){
2343 for(x=w-1; x>=0; x--){
2344 int i= x + y*stride;
2348 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2349 else src[i] -= src[i - 1];
2351 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2352 else src[i] -= src[i - 1];
2355 if(y) src[i] -= src[i - stride];
2361 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2362 const int w= b->width;
2363 const int h= b->height;
2368 int i= x + y*stride;
2372 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2373 else src[i] += src[i - 1];
2375 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2376 else src[i] += src[i - 1];
2379 if(y) src[i] += src[i - stride];
2385 static void encode_header(SnowContext *s){
2386 int plane_index, level, orientation;
2389 memset(kstate, MID_STATE, sizeof(kstate));
2391 put_rac(&s->c, kstate, s->keyframe);
2392 if(s->keyframe || s->always_reset)
2395 put_symbol(&s->c, s->header_state, s->version, 0);
2396 put_rac(&s->c, s->header_state, s->always_reset);
2397 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
2398 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
2399 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
2400 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
2401 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
2402 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
2403 put_rac(&s->c, s->header_state, s->spatial_scalability);
2404 // put_rac(&s->c, s->header_state, s->rate_scalability);
2406 for(plane_index=0; plane_index<2; plane_index++){
2407 for(level=0; level<s->spatial_decomposition_count; level++){
2408 for(orientation=level ? 1:0; orientation<4; orientation++){
2409 if(orientation==2) continue;
2410 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
2415 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
2416 put_symbol(&s->c, s->header_state, s->qlog, 1);
2417 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
2418 put_symbol(&s->c, s->header_state, s->qbias, 1);
2419 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
2422 static int decode_header(SnowContext *s){
2423 int plane_index, level, orientation;
2426 memset(kstate, MID_STATE, sizeof(kstate));
2428 s->keyframe= get_rac(&s->c, kstate);
2429 if(s->keyframe || s->always_reset)
2432 s->version= get_symbol(&s->c, s->header_state, 0);
2434 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
2437 s->always_reset= get_rac(&s->c, s->header_state);
2438 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2439 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2440 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2441 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
2442 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
2443 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
2444 s->spatial_scalability= get_rac(&s->c, s->header_state);
2445 // s->rate_scalability= get_rac(&s->c, s->header_state);
2447 for(plane_index=0; plane_index<3; plane_index++){
2448 for(level=0; level<s->spatial_decomposition_count; level++){
2449 for(orientation=level ? 1:0; orientation<4; orientation++){
2451 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
2452 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
2453 else q= get_symbol(&s->c, s->header_state, 1);
2454 s->plane[plane_index].band[level][orientation].qlog= q;
2460 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2461 if(s->spatial_decomposition_type > 2){
2462 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
2466 s->qlog= get_symbol(&s->c, s->header_state, 1);
2467 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
2468 s->qbias= get_symbol(&s->c, s->header_state, 1);
2469 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
2474 static int common_init(AVCodecContext *avctx){
2475 SnowContext *s = avctx->priv_data;
2477 int level, orientation, plane_index, dec;
2481 dsputil_init(&s->dsp, avctx);
2484 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
2485 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
2486 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
2487 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
2488 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
2489 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
2508 #define mcfh(dx,dy)\
2509 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
2510 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
2511 mc_block_hpel ## dx ## dy ## 16;\
2512 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
2513 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
2514 mc_block_hpel ## dx ## dy ## 8;
2521 dec= s->spatial_decomposition_count= 5;
2522 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
2524 s->chroma_h_shift= 1; //FIXME XXX
2525 s->chroma_v_shift= 1;
2527 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
2529 width= s->avctx->width;
2530 height= s->avctx->height;
2532 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
2534 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
2535 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
2537 for(plane_index=0; plane_index<3; plane_index++){
2538 int w= s->avctx->width;
2539 int h= s->avctx->height;
2542 w>>= s->chroma_h_shift;
2543 h>>= s->chroma_v_shift;
2545 s->plane[plane_index].width = w;
2546 s->plane[plane_index].height= h;
2547 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
2548 for(level=s->spatial_decomposition_count-1; level>=0; level--){
2549 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2550 SubBand *b= &s->plane[plane_index].band[level][orientation];
2552 b->buf= s->spatial_dwt_buffer;
2554 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
2555 b->width = (w + !(orientation&1))>>1;
2556 b->height= (h + !(orientation>1))>>1;
2558 if(orientation&1) b->buf += (w+1)>>1;
2559 if(orientation>1) b->buf += b->stride>>1;
2562 b->parent= &s->plane[plane_index].band[level-1][orientation];
2563 b->x = av_mallocz(((b->width+1) * b->height+1)*sizeof(int16_t));
2564 b->coeff= av_mallocz(((b->width+1) * b->height+1)*sizeof(DWTELEM));
2573 width= s->width= avctx->width;
2574 height= s->height= avctx->height;
2576 assert(width && height);
2578 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
2584 static void calculate_vissual_weight(SnowContext *s, Plane *p){
2585 int width = p->width;
2586 int height= p->height;
2587 int level, orientation, x, y;
2589 for(level=0; level<s->spatial_decomposition_count; level++){
2590 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2591 SubBand *b= &p->band[level][orientation];
2592 DWTELEM *buf= b->buf;
2595 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
2596 buf[b->width/2 + b->height/2*b->stride]= 256*256;
2597 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
2598 for(y=0; y<height; y++){
2599 for(x=0; x<width; x++){
2600 int64_t d= s->spatial_dwt_buffer[x + y*width];
2605 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
2606 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
2611 static int encode_init(AVCodecContext *avctx)
2613 SnowContext *s = avctx->priv_data;
2616 if(avctx->strict_std_compliance >= 0){
2617 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
2618 "use vstrict=-1 to use it anyway\n");
2627 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
2628 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2629 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2630 h263_encode_init(&s->m); //mv_penalty
2632 for(plane_index=0; plane_index<3; plane_index++){
2633 calculate_vissual_weight(s, &s->plane[plane_index]);
2637 avctx->coded_frame= &s->current_picture;
2638 switch(avctx->pix_fmt){
2639 // case PIX_FMT_YUV444P:
2640 // case PIX_FMT_YUV422P:
2641 case PIX_FMT_YUV420P:
2643 // case PIX_FMT_YUV411P:
2644 // case PIX_FMT_YUV410P:
2645 s->colorspace_type= 0;
2647 /* case PIX_FMT_RGBA32:
2651 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
2654 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
2655 s->chroma_h_shift= 1;
2656 s->chroma_v_shift= 1;
2660 static int frame_start(SnowContext *s){
2662 int w= s->avctx->width; //FIXME round up to x16 ?
2663 int h= s->avctx->height;
2665 if(s->current_picture.data[0]){
2666 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
2667 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
2668 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
2671 tmp= s->last_picture;
2672 s->last_picture= s->current_picture;
2673 s->current_picture= tmp;
2675 s->current_picture.reference= 1;
2676 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
2677 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2684 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
2685 SnowContext *s = avctx->priv_data;
2686 RangeCoder * const c= &s->c;
2687 AVFrame *pict = data;
2688 const int width= s->avctx->width;
2689 const int height= s->avctx->height;
2690 int level, orientation, plane_index;
2692 ff_init_range_encoder(c, buf, buf_size);
2693 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2695 s->input_picture = *pict;
2697 s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
2698 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
2701 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
2705 s->qlog= LOSSLESS_QLOG;
2709 s->current_picture.key_frame= s->keyframe;
2711 if(pict->pict_type == P_TYPE){
2712 int block_width = (width +15)>>4;
2713 int block_height= (height+15)>>4;
2714 int stride= s->current_picture.linesize[0];
2716 assert(s->current_picture.data[0]);
2717 assert(s->last_picture.data[0]);
2719 s->m.avctx= s->avctx;
2720 s->m.current_picture.data[0]= s->current_picture.data[0];
2721 s->m. last_picture.data[0]= s-> last_picture.data[0];
2722 s->m. new_picture.data[0]= s-> input_picture.data[0];
2723 s->m.current_picture_ptr= &s->m.current_picture;
2724 s->m. last_picture_ptr= &s->m. last_picture;
2726 s->m. last_picture.linesize[0]=
2727 s->m. new_picture.linesize[0]=
2728 s->m.current_picture.linesize[0]= stride;
2729 s->m.uvlinesize= s->current_picture.linesize[1];
2731 s->m.height= height;
2732 s->m.mb_width = block_width;
2733 s->m.mb_height= block_height;
2734 s->m.mb_stride= s->m.mb_width+1;
2735 s->m.b8_stride= 2*s->m.mb_width+1;
2737 s->m.pict_type= pict->pict_type;
2738 s->m.me_method= s->avctx->me_method;
2739 s->m.me.scene_change_score=0;
2740 s->m.flags= s->avctx->flags;
2741 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
2742 s->m.out_format= FMT_H263;
2743 s->m.unrestricted_mv= 1;
2745 s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
2746 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
2747 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
2749 s->m.dsp= s->dsp; //move
2755 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
2760 for(plane_index=0; plane_index<3; plane_index++){
2761 Plane *p= &s->plane[plane_index];
2765 // int bits= put_bits_count(&s->c.pb);
2768 if(pict->data[plane_index]) //FIXME gray hack
2771 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
2774 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
2777 && pict->pict_type == P_TYPE
2778 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
2779 ff_init_range_encoder(c, buf, buf_size);
2780 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2781 pict->pict_type= FF_I_TYPE;
2787 if(s->qlog == LOSSLESS_QLOG){
2790 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1)))>>FRAC_BITS;
2795 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2797 for(level=0; level<s->spatial_decomposition_count; level++){
2798 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2799 SubBand *b= &p->band[level][orientation];
2801 quantize(s, b, b->buf, b->stride, s->qbias);
2803 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
2804 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
2805 assert(b->parent==NULL || b->parent->stride == b->stride*2);
2807 correlate(s, b, b->buf, b->stride, 1, 0);
2810 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
2812 for(level=0; level<s->spatial_decomposition_count; level++){
2813 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2814 SubBand *b= &p->band[level][orientation];
2816 dequantize(s, b, b->buf, b->stride);
2820 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2821 if(s->qlog == LOSSLESS_QLOG){
2824 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
2829 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2830 STOP_TIMER("pred-conv")}
2831 if(s->avctx->flags&CODEC_FLAG_PSNR){
2834 if(pict->data[plane_index]) //FIXME gray hack
2837 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x];
2841 s->avctx->error[plane_index] += error;
2842 s->current_picture.error[plane_index] = error;
2846 if(s->last_picture.data[0])
2847 avctx->release_buffer(avctx, &s->last_picture);
2851 return ff_rac_terminate(c);
2854 static void common_end(SnowContext *s){
2855 int plane_index, level, orientation;
2857 av_freep(&s->spatial_dwt_buffer);
2859 av_freep(&s->m.me.scratchpad);
2860 av_freep(&s->m.me.map);
2861 av_freep(&s->m.me.score_map);
2863 av_freep(&s->block);
2865 for(plane_index=0; plane_index<3; plane_index++){
2866 for(level=s->spatial_decomposition_count-1; level>=0; level--){
2867 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2868 SubBand *b= &s->plane[plane_index].band[level][orientation];
2871 av_freep(&b->coeff);
2877 static int encode_end(AVCodecContext *avctx)
2879 SnowContext *s = avctx->priv_data;
2886 static int decode_init(AVCodecContext *avctx)
2888 // SnowContext *s = avctx->priv_data;
2895 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
2896 SnowContext *s = avctx->priv_data;
2897 RangeCoder * const c= &s->c;
2899 AVFrame *picture = data;
2900 int level, orientation, plane_index;
2903 /* no supplementary picture */
2907 ff_init_range_decoder(c, buf, buf_size);
2908 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2910 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
2912 if(!s->block) alloc_blocks(s);
2915 //keyframe flag dupliaction mess FIXME
2916 if(avctx->debug&FF_DEBUG_PICT_INFO)
2917 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
2921 for(plane_index=0; plane_index<3; plane_index++){
2922 Plane *p= &s->plane[plane_index];
2927 if(s->avctx->debug&2048){
2928 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
2929 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2933 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
2934 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
2938 for(level=0; level<s->spatial_decomposition_count; level++){
2939 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2940 SubBand *b= &p->band[level][orientation];
2942 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
2944 correlate(s, b, b->buf, b->stride, 1, 0);
2945 dequantize(s, b, b->buf, b->stride);
2946 assert(b->buf == s->spatial_dwt_buffer);
2951 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2952 if(s->qlog == LOSSLESS_QLOG){
2955 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
2960 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2961 STOP_TIMER("predict_plane conv2")}
2966 if(s->last_picture.data[0])
2967 avctx->release_buffer(avctx, &s->last_picture);
2969 if(!(s->avctx->debug&2048))
2970 *picture= s->current_picture;
2972 *picture= s->mconly_picture;
2974 *data_size = sizeof(AVFrame);
2976 bytes_read= c->bytestream - c->bytestream_start;
2977 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
2982 static int decode_end(AVCodecContext *avctx)
2984 SnowContext *s = avctx->priv_data;
2991 AVCodec snow_decoder = {
2995 sizeof(SnowContext),
3000 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
3004 AVCodec snow_encoder = {
3008 sizeof(SnowContext),
3023 int buffer[2][width*height];
3026 s.spatial_decomposition_count=6;
3027 s.spatial_decomposition_type=1;
3029 printf("testing 5/3 DWT\n");
3030 for(i=0; i<width*height; i++)
3031 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3033 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3034 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3036 for(i=0; i<width*height; i++)
3037 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3039 printf("testing 9/7 DWT\n");
3040 s.spatial_decomposition_type=0;
3041 for(i=0; i<width*height; i++)
3042 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3044 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3045 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3047 for(i=0; i<width*height; i++)
3048 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3050 printf("testing AC coder\n");
3051 memset(s.header_state, 0, sizeof(s.header_state));
3052 ff_init_range_encoder(&s.c, buffer[0], 256*256);
3053 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3055 for(i=-256; i<256; i++){
3057 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
3058 STOP_TIMER("put_symbol")
3060 ff_rac_terminate(&s.c);
3062 memset(s.header_state, 0, sizeof(s.header_state));
3063 ff_init_range_decoder(&s.c, buffer[0], 256*256);
3064 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3066 for(i=-256; i<256; i++){
3069 j= get_symbol(&s.c, s.header_state, 1);
3070 STOP_TIMER("get_symbol")
3071 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
3074 int level, orientation, x, y;
3075 int64_t errors[8][4];
3078 memset(errors, 0, sizeof(errors));
3079 s.spatial_decomposition_count=3;
3080 s.spatial_decomposition_type=0;
3081 for(level=0; level<s.spatial_decomposition_count; level++){
3082 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3083 int w= width >> (s.spatial_decomposition_count-level);
3084 int h= height >> (s.spatial_decomposition_count-level);
3085 int stride= width << (s.spatial_decomposition_count-level);
3086 DWTELEM *buf= buffer[0];
3089 if(orientation&1) buf+=w;
3090 if(orientation>1) buf+=stride>>1;
3092 memset(buffer[0], 0, sizeof(int)*width*height);
3093 buf[w/2 + h/2*stride]= 256*256;
3094 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3095 for(y=0; y<height; y++){
3096 for(x=0; x<width; x++){
3097 int64_t d= buffer[0][x + y*width];
3099 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
3101 if(ABS(height/2-y)<9 && level==2) printf("\n");
3103 error= (int)(sqrt(error)+0.5);
3104 errors[level][orientation]= error;
3105 if(g) g=ff_gcd(g, error);
3109 printf("static int const visual_weight[][4]={\n");
3110 for(level=0; level<s.spatial_decomposition_count; level++){
3112 for(orientation=0; orientation<4; orientation++){
3113 printf("%8lld,", errors[level][orientation]/g);
3121 int w= width >> (s.spatial_decomposition_count-level);
3122 int h= height >> (s.spatial_decomposition_count-level);
3123 int stride= width << (s.spatial_decomposition_count-level);
3124 DWTELEM *buf= buffer[0];
3130 memset(buffer[0], 0, sizeof(int)*width*height);
3132 for(y=0; y<height; y++){
3133 for(x=0; x<width; x++){
3134 int tab[4]={0,2,3,1};
3135 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
3138 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3142 buf[x + y*stride ]=169;
3143 buf[x + y*stride-w]=64;
3146 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3148 for(y=0; y<height; y++){
3149 for(x=0; x<width; x++){
3150 int64_t d= buffer[0][x + y*width];
3152 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
3154 if(ABS(height/2-y)<9) printf("\n");