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)
434 // Avoid a name clash on SGI IRIX
437 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
438 static const uint8_t qexp[8]={
439 128, 140, 152, 166, 181, 197, 215, 235
440 // 64, 70, 76, 83, 91, 99, 108, 117
441 // 32, 35, 38, 41, 45, 49, 54, 59
442 // 16, 17, 19, 21, 23, 25, 27, 29
443 // 8, 9, 10, 10, 11, 12, 13, 15
446 static inline int mirror(int v, int m){
448 else if(v>m) return 2*m-v;
452 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
457 const int e= av_log2(a);
459 const int el= FFMIN(e, 10);
460 put_rac(c, state+0, 0);
463 put_rac(c, state+1+i, 1); //1..10
466 put_rac(c, state+1+9, 1); //1..10
468 put_rac(c, state+1+FFMIN(i,9), 0);
470 for(i=e-1; i>=el; i--){
471 put_rac(c, state+22+9, (a>>i)&1); //22..31
474 put_rac(c, state+22+i, (a>>i)&1); //22..31
478 put_rac(c, state+11 + el, v < 0); //11..21
481 put_rac(c, state+0, 0);
484 put_rac(c, state+1+i, 1); //1..10
486 put_rac(c, state+1+i, 0);
488 for(i=e-1; i>=0; i--){
489 put_rac(c, state+22+i, (a>>i)&1); //22..31
493 put_rac(c, state+11 + e, v < 0); //11..21
496 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
498 put_rac(c, state+1+FFMIN(i,9), 0);
500 for(i=e-1; i>=0; i--){
501 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
505 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
509 put_rac(c, state+0, 1);
513 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
514 if(get_rac(c, state+0))
519 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
524 for(i=e-1; i>=0; i--){
525 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
528 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
535 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
537 int r= log2>=0 ? 1<<log2 : 1;
543 put_rac(c, state+4+log2, 1);
548 put_rac(c, state+4+log2, 0);
550 for(i=log2-1; i>=0; i--){
551 put_rac(c, state+31-i, (v>>i)&1);
555 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
557 int r= log2>=0 ? 1<<log2 : 1;
562 while(get_rac(c, state+4+log2)){
568 for(i=log2-1; i>=0; i--){
569 v+= get_rac(c, state+31-i)<<i;
575 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){
576 const int mirror_left= !highpass;
577 const int mirror_right= (width&1) ^ highpass;
578 const int w= (width>>1) - 1 + (highpass & width);
581 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
583 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
589 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
593 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
597 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){
598 const int mirror_left= !highpass;
599 const int mirror_right= (width&1) ^ highpass;
600 const int w= (width>>1) - 1 + (highpass & width);
607 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
613 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
616 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
620 int r= 3*2*ref[w*ref_step];
623 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
628 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
631 for(x=start; x<width; x+=2){
635 int x2= x + 2*i - n + 1;
637 else if(x2>=width) x2= 2*width-x2-2;
638 sum += coeffs[i]*(int64_t)dst[x2];
640 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
641 else dst[x] += (sum + (1<<shift)/2)>>shift;
645 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
647 for(y=start; y<height; y+=2){
648 for(x=0; x<width; x++){
652 int y2= y + 2*i - n + 1;
654 else if(y2>=height) y2= 2*height-y2-2;
655 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
657 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
658 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
667 #if 0 // more accurate 9/7
670 #define COEFFS1 (int[]){-25987,-25987}
673 #define COEFFS2 (int[]){-27777,-27777}
676 #define COEFFS3 (int[]){28931,28931}
679 #define COEFFS4 (int[]){14533,14533}
683 #define COEFFS1 (int[]){1,-9,-9,1}
686 #define COEFFS2 (int[]){-1,5,5,-1}
699 #define COEFFS1 (int[]){1,1}
702 #define COEFFS2 (int[]){-1,-1}
715 #define COEFFS2 (int[]){-1,-1}
718 #define COEFFS3 (int[]){-1,-1}
721 #define COEFFS4 (int[]){-5,29,29,-5}
726 #define COEFFS1 (int[]){-203,-203}
729 #define COEFFS2 (int[]){-217,-217}
732 #define COEFFS3 (int[]){113,113}
735 #define COEFFS4 (int[]){227,227}
743 #define COEFFS2 (int[]){-1,-1}
746 #define COEFFS3 (int[]){-1,-1}
749 #define COEFFS4 (int[]){3,3}
753 #define COEFFS1 (int[]){1,-9,-9,1}
756 #define COEFFS2 (int[]){1,1}
766 #define COEFFS1 (int[]){1,-9,-9,1}
769 #define COEFFS2 (int[]){-1,5,5,-1}
777 static void horizontal_decomposeX(DWTELEM *b, int width){
779 const int width2= width>>1;
780 const int w2= (width+1)>>1;
783 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
784 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
785 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
786 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
788 for(x=0; x<width2; x++){
790 temp[x+w2]= b[2*x + 1];
794 memcpy(b, temp, width*sizeof(int));
797 static void horizontal_composeX(DWTELEM *b, int width){
799 const int width2= width>>1;
801 const int w2= (width+1)>>1;
803 memcpy(temp, b, width*sizeof(int));
804 for(x=0; x<width2; x++){
806 b[2*x + 1]= temp[x+w2];
811 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
812 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
813 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
814 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
817 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
820 for(y=0; y<height; y++){
821 for(x=0; x<width; x++){
822 buffer[y*stride + x] *= SCALEX;
826 for(y=0; y<height; y++){
827 horizontal_decomposeX(buffer + y*stride, width);
830 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
831 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
832 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
833 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
836 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
839 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
840 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
841 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
842 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
844 for(y=0; y<height; y++){
845 horizontal_composeX(buffer + y*stride, width);
848 for(y=0; y<height; y++){
849 for(x=0; x<width; x++){
850 buffer[y*stride + x] /= SCALEX;
855 static void horizontal_decompose53i(DWTELEM *b, int width){
857 const int width2= width>>1;
859 const int w2= (width+1)>>1;
861 for(x=0; x<width2; x++){
863 temp[x+w2]= b[2*x + 1];
875 for(x=1; x+1<width2; x+=2){
879 A2 += (A1 + A3 + 2)>>2;
883 A1= temp[x+1+width2];
886 A4 += (A1 + A3 + 2)>>2;
892 A2 += (A1 + A3 + 2)>>2;
896 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
897 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
901 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
904 for(i=0; i<width; i++){
905 b1[i] -= (b0[i] + b2[i])>>1;
909 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
912 for(i=0; i<width; i++){
913 b1[i] += (b0[i] + b2[i] + 2)>>2;
917 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
919 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
920 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
922 for(y=-2; y<height; y+=2){
923 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
924 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
927 if(b1 <= b3) horizontal_decompose53i(b2, width);
928 if(y+2 < height) horizontal_decompose53i(b3, width);
929 STOP_TIMER("horizontal_decompose53i")}
932 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
933 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
934 STOP_TIMER("vertical_decompose53i*")}
1010 static void horizontal_decompose97i(DWTELEM *b, int width){
1011 DWTELEM temp[width];
1012 const int w2= (width+1)>>1;
1014 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1015 lift (temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1016 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1017 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1021 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1024 for(i=0; i<width; i++){
1025 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1029 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1032 for(i=0; i<width; i++){
1034 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1036 int r= 3*(b0[i] + b2[i]);
1039 b1[i] += (r+W_CO)>>W_CS;
1044 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1047 for(i=0; i<width; i++){
1048 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1052 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1055 for(i=0; i<width; i++){
1056 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1060 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1062 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1063 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1064 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1065 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1067 for(y=-4; y<height; y+=2){
1068 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1069 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1072 if(b3 <= b5) horizontal_decompose97i(b4, width);
1073 if(y+4 < height) horizontal_decompose97i(b5, width);
1075 STOP_TIMER("horizontal_decompose97i")
1079 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1080 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1081 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1082 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1085 STOP_TIMER("vertical_decompose97i")
1095 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1098 for(level=0; level<decomposition_count; level++){
1100 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1101 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1102 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1107 static void horizontal_compose53i(DWTELEM *b, int width){
1108 DWTELEM temp[width];
1109 const int width2= width>>1;
1110 const int w2= (width+1)>>1;
1121 for(x=1; x+1<width2; x+=2){
1125 A2 += (A1 + A3 + 2)>>2;
1129 A1= temp[x+1+width2];
1132 A4 += (A1 + A3 + 2)>>2;
1138 A2 += (A1 + A3 + 2)>>2;
1142 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1143 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1145 for(x=0; x<width2; x++){
1147 b[2*x + 1]= temp[x+w2];
1153 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1156 for(i=0; i<width; i++){
1157 b1[i] += (b0[i] + b2[i])>>1;
1161 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1164 for(i=0; i<width; i++){
1165 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1169 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1171 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride;
1172 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride;
1174 for(y=-1; y<=height; y+=2){
1175 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1176 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1179 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1180 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1181 STOP_TIMER("vertical_compose53i*")}
1184 if(y-1 >= 0) horizontal_compose53i(b0, width);
1185 if(b0 <= b2) horizontal_compose53i(b1, width);
1186 STOP_TIMER("horizontal_compose53i")}
1194 static void horizontal_compose97i(DWTELEM *b, int width){
1195 DWTELEM temp[width];
1196 const int w2= (width+1)>>1;
1198 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1199 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1200 lift (b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1201 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1204 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1207 for(i=0; i<width; i++){
1208 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1212 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1215 for(i=0; i<width; i++){
1217 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1219 int r= 3*(b0[i] + b2[i]);
1222 b1[i] -= (r+W_CO)>>W_CS;
1227 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1230 for(i=0; i<width; i++){
1231 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1235 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1238 for(i=0; i<width; i++){
1239 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1243 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1245 DWTELEM *b0= buffer + mirror(-3-1, height-1)*stride;
1246 DWTELEM *b1= buffer + mirror(-3 , height-1)*stride;
1247 DWTELEM *b2= buffer + mirror(-3+1, height-1)*stride;
1248 DWTELEM *b3= buffer + mirror(-3+2, height-1)*stride;
1250 for(y=-3; y<=height; y+=2){
1251 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1252 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1254 if(stride == width && y+4 < height && 0){
1256 for(x=0; x<width/2; x++)
1263 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1264 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1265 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1266 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1268 STOP_TIMER("vertical_compose97i")}}
1271 if(y-1>= 0) horizontal_compose97i(b0, width);
1272 if(b0 <= b2) horizontal_compose97i(b1, width);
1273 if(width>400 && b0 <= b2){
1274 STOP_TIMER("horizontal_compose97i")}}
1283 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1286 for(level=decomposition_count-1; level>=0; level--){
1288 case 0: spatial_compose97i(buffer, width>>level, height>>level, stride<<level); break;
1289 case 1: spatial_compose53i(buffer, width>>level, height>>level, stride<<level); break;
1290 case 2: spatial_composeX (buffer, width>>level, height>>level, stride<<level); break;
1295 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1296 const int w= b->width;
1297 const int h= b->height;
1308 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1309 v= src[x + y*stride];
1312 t= src[x + (y-1)*stride];
1314 lt= src[x - 1 + (y-1)*stride];
1317 rt= src[x + 1 + (y-1)*stride];
1321 l= src[x - 1 + y*stride];
1323 if(orientation==1) ll= src[y + (x-2)*stride];
1324 else ll= src[x - 2 + y*stride];
1330 if(px<b->parent->width && py<b->parent->height)
1331 p= parent[px + py*2*stride];
1333 if(!(/*ll|*/l|lt|t|rt|p)){
1335 runs[run_index++]= run;
1343 runs[run_index++]= run;
1345 run= runs[run_index++];
1347 put_symbol2(&s->c, b->state[1], run, 3);
1350 if(&s->c.bytestream_end - &s->c.bytestream < w*40){
1351 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1356 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1357 v= src[x + y*stride];
1360 t= src[x + (y-1)*stride];
1362 lt= src[x - 1 + (y-1)*stride];
1365 rt= src[x + 1 + (y-1)*stride];
1369 l= src[x - 1 + y*stride];
1371 if(orientation==1) ll= src[y + (x-2)*stride];
1372 else ll= src[x - 2 + y*stride];
1378 if(px<b->parent->width && py<b->parent->height)
1379 p= parent[px + py*2*stride];
1381 if(/*ll|*/l|lt|t|rt|p){
1382 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1384 put_rac(&s->c, &b->state[0][context], !!v);
1387 run= runs[run_index++];
1389 put_symbol2(&s->c, b->state[1], run, 3);
1397 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1399 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1400 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
1408 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1409 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1410 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1411 return encode_subband_c0run(s, b, src, parent, stride, orientation);
1412 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1415 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1416 const int w= b->width;
1417 const int h= b->height;
1419 const int qlog= clip(s->qlog + b->qlog, 0, 128);
1420 int qmul= qexp[qlog&7]<<(qlog>>3);
1421 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1425 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1435 int parent_index= 0;
1436 int prev_parent_index= 0;
1438 for(y=0; y<b->height; y++)
1439 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
1441 run= get_symbol2(&s->c, b->state[1], 3);
1444 int lt=0, t=0, rt=0;
1446 if(y && b->x[prev_index] == 0){
1447 rt= b->coeff[prev_index];
1456 if(b->x[prev_index] <= x)
1458 if(b->x[prev_index] == x + 1)
1459 rt= b->coeff[prev_index];
1464 if(x>>1 > b->parent->x[parent_index]){
1467 if(x>>1 == b->parent->x[parent_index]){
1468 p= b->parent->coeff[parent_index];
1471 if(/*ll|*/l|lt|t|rt|p){
1472 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1474 v=get_rac(&s->c, &b->state[0][context]);
1477 run= get_symbol2(&s->c, b->state[1], 3);
1486 max_run= FFMIN(run, b->x[prev_index] - x - 2);
1487 max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1);
1494 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1495 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1;
1496 if(get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])){
1497 src[x + y*stride]=-(( v*qmul + qadd)>>(QEXPSHIFT));
1500 src[x + y*stride]= (( v*qmul + qadd)>>(QEXPSHIFT));
1502 b->x[index]=x; //FIXME interleave x/coeff
1503 b->coeff[index++]= v;
1506 b->x[index++]= w+1; //end marker
1507 prev_index= prev2_index;
1511 while(b->parent->x[parent_index] != b->parent->width+1)
1515 prev_parent_index= parent_index;
1517 parent_index= prev_parent_index;
1521 b->x[index++]= w+1; //end marker
1522 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
1523 STOP_TIMER("decode_subband")
1530 static void reset_contexts(SnowContext *s){
1531 int plane_index, level, orientation;
1533 for(plane_index=0; plane_index<3; plane_index++){
1534 for(level=0; level<s->spatial_decomposition_count; level++){
1535 for(orientation=level ? 1:0; orientation<4; orientation++){
1536 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1540 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1541 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1544 static int alloc_blocks(SnowContext *s){
1545 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1546 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1551 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1555 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1556 uint8_t *bytestream= d->bytestream;
1557 uint8_t *bytestream_start= d->bytestream_start;
1559 d->bytestream= bytestream;
1560 d->bytestream_start= bytestream_start;
1563 //near copy & paste from dsputil, FIXME
1564 static int pix_sum(uint8_t * pix, int line_size, int w)
1569 for (i = 0; i < w; i++) {
1570 for (j = 0; j < w; j++) {
1574 pix += line_size - w;
1579 //near copy & paste from dsputil, FIXME
1580 static int pix_norm1(uint8_t * pix, int line_size, int w)
1583 uint32_t *sq = squareTbl + 256;
1586 for (i = 0; i < w; i++) {
1587 for (j = 0; j < w; j ++) {
1591 pix += line_size - w;
1596 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){
1597 const int w= s->b_width << s->block_max_depth;
1598 const int rem_depth= s->block_max_depth - level;
1599 const int index= (x + y*w) << rem_depth;
1600 const int block_w= 1<<rem_depth;
1612 for(j=0; j<block_w; j++){
1613 for(i=0; i<block_w; i++){
1614 s->block[index + i + j*w]= block;
1619 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){
1620 const int offset[3]= {
1622 ((y*c->uvstride + x)>>1),
1623 ((y*c->uvstride + x)>>1),
1627 c->src[0][i]= src [i];
1628 c->ref[0][i]= ref [i] + offset[i];
1636 #define P_TOPRIGHT P[3]
1637 #define P_MEDIAN P[4]
1639 #define FLAG_QPEL 1 //must be 1
1641 static int encode_q_branch(SnowContext *s, int level, int x, int y){
1642 uint8_t p_buffer[1024];
1643 uint8_t i_buffer[1024];
1644 uint8_t p_state[sizeof(s->block_state)];
1645 uint8_t i_state[sizeof(s->block_state)];
1647 uint8_t *pbbak= s->c.bytestream;
1648 uint8_t *pbbak_start= s->c.bytestream_start;
1649 int score, score2, iscore, i_len, p_len, block_s, sum;
1650 const int w= s->b_width << s->block_max_depth;
1651 const int h= s->b_height << s->block_max_depth;
1652 const int rem_depth= s->block_max_depth - level;
1653 const int index= (x + y*w) << rem_depth;
1654 const int block_w= 1<<(LOG2_MB_SIZE - level);
1655 static BlockNode null_block= { //FIXME add border maybe
1656 .color= {128,128,128},
1662 int trx= (x+1)<<rem_depth;
1663 int try= (y+1)<<rem_depth;
1664 BlockNode *left = x ? &s->block[index-1] : &null_block;
1665 BlockNode *top = y ? &s->block[index-w] : &null_block;
1666 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
1667 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
1668 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
1669 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
1670 int pl = left->color[0];
1671 int pcb= left->color[1];
1672 int pcr= left->color[2];
1673 int pmx= mid_pred(left->mx, top->mx, tr->mx);
1674 int pmy= mid_pred(left->my, top->my, tr->my);
1677 const int stride= s->current_picture.linesize[0];
1678 const int uvstride= s->current_picture.linesize[1];
1679 const int instride= s->input_picture.linesize[0];
1680 const int uvinstride= s->input_picture.linesize[1];
1681 uint8_t *new_l = s->input_picture.data[0] + (x + y* instride)*block_w;
1682 uint8_t *new_cb= s->input_picture.data[1] + (x + y*uvinstride)*block_w/2;
1683 uint8_t *new_cr= s->input_picture.data[2] + (x + y*uvinstride)*block_w/2;
1684 uint8_t current_mb[3][stride*block_w];
1685 uint8_t *current_data[3]= {¤t_mb[0][0], ¤t_mb[1][0], ¤t_mb[2][0]};
1687 int16_t last_mv[3][2];
1688 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
1689 const int shift= 1+qpel;
1690 MotionEstContext *c= &s->m.me;
1691 int mx_context= av_log2(2*ABS(left->mx - top->mx));
1692 int my_context= av_log2(2*ABS(left->my - top->my));
1693 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
1695 assert(sizeof(s->block_state) >= 256);
1697 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
1702 for(i=0; i<block_w; i++)
1703 memcpy(¤t_mb[0][0] + stride*i, new_l + instride*i, block_w);
1704 for(i=0; i<block_w>>1; i++)
1705 memcpy(¤t_mb[1][0] + uvstride*i, new_cb + uvinstride*i, block_w>>1);
1706 for(i=0; i<block_w>>1; i++)
1707 memcpy(¤t_mb[2][0] + uvstride*i, new_cr + uvinstride*i, block_w>>1);
1709 // clip predictors / edge ?
1711 P_LEFT[0]= left->mx;
1712 P_LEFT[1]= left->my;
1715 P_TOPRIGHT[0]= tr->mx;
1716 P_TOPRIGHT[1]= tr->my;
1718 last_mv[0][0]= s->block[index].mx;
1719 last_mv[0][1]= s->block[index].my;
1720 last_mv[1][0]= right->mx;
1721 last_mv[1][1]= right->my;
1722 last_mv[2][0]= bottom->mx;
1723 last_mv[2][1]= bottom->my;
1730 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
1732 assert(s->m.me. stride == stride);
1733 assert(s->m.me.uvstride == uvstride);
1735 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
1736 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
1737 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
1738 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
1740 c->xmin = - x*block_w - 16+2;
1741 c->ymin = - y*block_w - 16+2;
1742 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
1743 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
1745 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
1746 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
1747 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
1748 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
1749 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
1750 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
1751 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
1753 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
1754 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
1757 c->pred_x= P_LEFT[0];
1758 c->pred_y= P_LEFT[1];
1760 c->pred_x = P_MEDIAN[0];
1761 c->pred_y = P_MEDIAN[1];
1764 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
1765 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
1767 assert(mx >= c->xmin);
1768 assert(mx <= c->xmax);
1769 assert(my >= c->ymin);
1770 assert(my <= c->ymax);
1772 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
1773 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
1774 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
1778 pc.bytestream_start=
1779 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
1780 memcpy(p_state, s->block_state, sizeof(s->block_state));
1782 if(level!=s->block_max_depth)
1783 put_rac(&pc, &p_state[4 + s_context], 1);
1784 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
1785 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
1786 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
1787 p_len= pc.bytestream - pc.bytestream_start;
1788 score += (s->lambda2*(p_len*8
1789 + (pc.outstanding_count - s->c.outstanding_count)*8
1790 + (-av_log2(pc.range) + av_log2(s->c.range))
1791 ))>>FF_LAMBDA_SHIFT;
1793 block_s= block_w*block_w;
1794 sum = pix_sum(¤t_mb[0][0], stride, block_w);
1795 l= (sum + block_s/2)/block_s;
1796 iscore = pix_norm1(¤t_mb[0][0], stride, block_w) - 2*l*sum + l*l*block_s;
1798 block_s= block_w*block_w>>2;
1799 sum = pix_sum(¤t_mb[1][0], uvstride, block_w>>1);
1800 cb= (sum + block_s/2)/block_s;
1801 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
1802 sum = pix_sum(¤t_mb[2][0], uvstride, block_w>>1);
1803 cr= (sum + block_s/2)/block_s;
1804 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
1807 ic.bytestream_start=
1808 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
1809 memcpy(i_state, s->block_state, sizeof(s->block_state));
1810 if(level!=s->block_max_depth)
1811 put_rac(&ic, &i_state[4 + s_context], 1);
1812 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
1813 put_symbol(&ic, &i_state[32], l-pl , 1);
1814 put_symbol(&ic, &i_state[64], cb-pcb, 1);
1815 put_symbol(&ic, &i_state[96], cr-pcr, 1);
1816 i_len= ic.bytestream - ic.bytestream_start;
1817 iscore += (s->lambda2*(i_len*8
1818 + (ic.outstanding_count - s->c.outstanding_count)*8
1819 + (-av_log2(ic.range) + av_log2(s->c.range))
1820 ))>>FF_LAMBDA_SHIFT;
1822 // assert(score==256*256*256*64-1);
1823 assert(iscore < 255*255*256 + s->lambda2*10);
1824 assert(iscore >= 0);
1825 assert(l>=0 && l<=255);
1826 assert(pl>=0 && pl<=255);
1829 int varc= iscore >> 8;
1830 int vard= score >> 8;
1831 if (vard <= 64 || vard < varc)
1832 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1834 c->scene_change_score+= s->m.qscale;
1837 if(level!=s->block_max_depth){
1838 put_rac(&s->c, &s->block_state[4 + s_context], 0);
1839 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
1840 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
1841 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
1842 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
1843 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
1845 if(score2 < score && score2 < iscore)
1850 memcpy(pbbak, i_buffer, i_len);
1852 s->c.bytestream_start= pbbak_start;
1853 s->c.bytestream= pbbak + i_len;
1854 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
1855 memcpy(s->block_state, i_state, sizeof(s->block_state));
1858 memcpy(pbbak, p_buffer, p_len);
1860 s->c.bytestream_start= pbbak_start;
1861 s->c.bytestream= pbbak + p_len;
1862 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
1863 memcpy(s->block_state, p_state, sizeof(s->block_state));
1868 static void decode_q_branch(SnowContext *s, int level, int x, int y){
1869 const int w= s->b_width << s->block_max_depth;
1870 const int rem_depth= s->block_max_depth - level;
1871 const int index= (x + y*w) << rem_depth;
1872 static BlockNode null_block= { //FIXME add border maybe
1873 .color= {128,128,128},
1879 int trx= (x+1)<<rem_depth;
1880 BlockNode *left = x ? &s->block[index-1] : &null_block;
1881 BlockNode *top = y ? &s->block[index-w] : &null_block;
1882 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
1883 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
1884 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
1887 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);
1891 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
1893 int l = left->color[0];
1894 int cb= left->color[1];
1895 int cr= left->color[2];
1896 int mx= mid_pred(left->mx, top->mx, tr->mx);
1897 int my= mid_pred(left->my, top->my, tr->my);
1898 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
1899 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
1901 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
1904 l += get_symbol(&s->c, &s->block_state[32], 1);
1905 cb+= get_symbol(&s->c, &s->block_state[64], 1);
1906 cr+= get_symbol(&s->c, &s->block_state[96], 1);
1908 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
1909 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
1911 set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
1913 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
1914 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
1915 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
1916 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
1920 static void encode_blocks(SnowContext *s){
1926 if(&s->c.bytestream_end - &s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
1927 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1931 encode_q_branch(s, 0, x, y);
1936 static void decode_blocks(SnowContext *s){
1943 decode_q_branch(s, 0, x, y);
1948 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){
1951 for(y=0; y < b_h+5; y++){
1952 for(x=0; x < b_w; x++){
1959 // int am= 9*(a1+a2) - (a0+a3);
1960 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1961 // int am= 18*(a2+a3) - 2*(a1+a4);
1962 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1963 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
1965 // if(b_w==16) am= 8*(a1+a2);
1967 if(dx<8) tmp[x]= (32*a2*( 8-dx) + am* dx + 128)>>8;
1968 else tmp[x]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
1970 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
1971 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
1972 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
1973 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
1978 tmp -= (b_h+5)*stride;
1980 for(y=0; y < b_h; y++){
1981 for(x=0; x < b_w; x++){
1982 int a0= tmp[x + 0*stride];
1983 int a1= tmp[x + 1*stride];
1984 int a2= tmp[x + 2*stride];
1985 int a3= tmp[x + 3*stride];
1986 int a4= tmp[x + 4*stride];
1987 int a5= tmp[x + 5*stride];
1988 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1989 // int am= 18*(a2+a3) - 2*(a1+a4);
1990 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1991 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
1993 // if(b_w==16) am= 8*(a1+a2);
1995 if(dy<8) dst[x]= (32*a2*( 8-dy) + am* dy + 128)>>8;
1996 else dst[x]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
1998 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
1999 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2000 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2001 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2006 STOP_TIMER("mc_block")
2009 #define mca(dx,dy,b_w)\
2010 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
2011 uint8_t tmp[stride*(b_w+5)];\
2013 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2025 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){
2028 const int color= block->color[plane_index];
2029 for(y=0; y < b_h; y++){
2030 for(x=0; x < b_w; x++){
2031 dst[x + y*stride]= color;
2035 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2036 int mx= block->mx*scale;
2037 int my= block->my*scale;
2038 const int dx= mx&15;
2039 const int dy= my&15;
2042 src += sx + sy*stride;
2043 if( (unsigned)sx >= w - b_w - 4
2044 || (unsigned)sy >= h - b_h - 4){
2045 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2048 if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16))
2049 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2051 s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2055 static always_inline int same_block(BlockNode *a, BlockNode *b){
2056 return !((a->mx - b->mx) | (a->my - b->my) | a->type | b->type);
2059 //FIXME name clenup (b_w, block_w, b_width stuff)
2060 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){
2061 const int b_width = s->b_width << s->block_max_depth;
2062 const int b_height= s->b_height << s->block_max_depth;
2063 const int b_stride= b_width;
2064 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2065 BlockNode *rt= lt+1;
2066 BlockNode *lb= lt+b_stride;
2067 BlockNode *rb= lb+1;
2069 uint8_t tmp[src_stride*(b_h+5)]; //FIXME align
2075 }else if(b_x + 1 >= b_width){
2082 }else if(b_y + 1 >= b_height){
2087 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2091 }else if(src_x + b_w > w){
2095 obmc -= src_y*obmc_stride;
2098 }else if(src_y + b_h> h){
2102 if(b_w<=0 || b_h<=0) return;
2104 assert(src_stride > 7*MB_SIZE);
2105 dst += src_x + src_y*dst_stride;
2106 dst8+= src_x + src_y*src_stride;
2107 // src += src_x + src_y*src_stride;
2109 block[0]= tmp+3*MB_SIZE;
2110 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2112 if(same_block(lt, rt)){
2115 block[1]= tmp + 4*MB_SIZE;
2116 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2119 if(same_block(lt, lb)){
2121 }else if(same_block(rt, lb)){
2124 block[2]= tmp+5*MB_SIZE;
2125 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2128 if(same_block(lt, rb) ){
2130 }else if(same_block(rt, rb)){
2132 }else if(same_block(lb, rb)){
2135 block[3]= tmp+6*MB_SIZE;
2136 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2139 for(y=0; y<b_h; y++){
2140 for(x=0; x<b_w; x++){
2141 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2142 if(add) dst[x + y*dst_stride] += v;
2143 else dst[x + y*dst_stride] -= v;
2146 for(y=0; y<b_h; y++){
2147 uint8_t *obmc2= obmc + (obmc_stride>>1);
2148 for(x=0; x<b_w; x++){
2149 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2150 if(add) dst[x + y*dst_stride] += v;
2151 else dst[x + y*dst_stride] -= v;
2154 for(y=0; y<b_h; y++){
2155 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2156 for(x=0; x<b_w; x++){
2157 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2158 if(add) dst[x + y*dst_stride] += v;
2159 else dst[x + y*dst_stride] -= v;
2162 for(y=0; y<b_h; y++){
2163 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2164 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2165 for(x=0; x<b_w; x++){
2166 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2167 if(add) dst[x + y*dst_stride] += v;
2168 else dst[x + y*dst_stride] -= v;
2172 for(y=0; y<b_h; y++){
2173 //FIXME ugly missue of obmc_stride
2174 uint8_t *obmc1= obmc + y*obmc_stride;
2175 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2176 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2177 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2178 for(x=0; x<b_w; x++){
2179 int v= obmc1[x] * block[3][x + y*src_stride]
2180 +obmc2[x] * block[2][x + y*src_stride]
2181 +obmc3[x] * block[1][x + y*src_stride]
2182 +obmc4[x] * block[0][x + y*src_stride];
2184 v <<= 8 - LOG2_OBMC_MAX;
2186 v += 1<<(7 - FRAC_BITS);
2187 v >>= 8 - FRAC_BITS;
2190 v += dst[x + y*dst_stride];
2191 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2192 if(v&(~255)) v= ~(v>>31);
2193 dst8[x + y*src_stride] = v;
2195 dst[x + y*dst_stride] -= v;
2202 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2203 Plane *p= &s->plane[plane_index];
2204 const int mb_w= s->b_width << s->block_max_depth;
2205 const int mb_h= s->b_height << s->block_max_depth;
2206 int x, y, mb_x, mb_y;
2207 int block_size = MB_SIZE >> s->block_max_depth;
2208 int block_w = plane_index ? block_size/2 : block_size;
2209 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2210 int obmc_stride= plane_index ? block_size : 2*block_size;
2211 int ref_stride= s->current_picture.linesize[plane_index];
2212 uint8_t *ref = s->last_picture.data[plane_index];
2213 uint8_t *dst8= s->current_picture.data[plane_index];
2218 if(s->keyframe || (s->avctx->debug&512)){
2222 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2224 if(v&(~255)) v= ~(v>>31);
2225 dst8[x + y*ref_stride]= v;
2231 buf[x + y*w]-= 128<<FRAC_BITS;
2239 for(mb_y=0; mb_y<=mb_h; mb_y++){
2240 for(mb_x=0; mb_x<=mb_w; mb_x++){
2243 add_yblock(s, buf, dst8, ref, obmc,
2244 block_w*mb_x - block_w/2,
2245 block_w*mb_y - block_w/2,
2248 w, ref_stride, obmc_stride,
2252 STOP_TIMER("add_yblock")
2256 STOP_TIMER("predict_plane")
2259 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
2260 const int level= b->level;
2261 const int w= b->width;
2262 const int h= b->height;
2263 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2264 const int qmul= qexp[qlog&7]<<(qlog>>3);
2265 int x,y, thres1, thres2;
2270 if(s->qlog == LOSSLESS_QLOG) return;
2272 bias= bias ? 0 : (3*qmul)>>3;
2273 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
2279 int i= src[x + y*stride];
2281 if((unsigned)(i+thres1) > thres2){
2284 i/= qmul; //FIXME optimize
2285 src[x + y*stride]= i;
2289 i/= qmul; //FIXME optimize
2290 src[x + y*stride]= -i;
2293 src[x + y*stride]= 0;
2299 int i= src[x + y*stride];
2301 if((unsigned)(i+thres1) > thres2){
2304 i= (i + bias) / qmul; //FIXME optimize
2305 src[x + y*stride]= i;
2309 i= (i + bias) / qmul; //FIXME optimize
2310 src[x + y*stride]= -i;
2313 src[x + y*stride]= 0;
2317 if(level+1 == s->spatial_decomposition_count){
2318 // STOP_TIMER("quantize")
2322 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
2323 const int w= b->width;
2324 const int h= b->height;
2325 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2326 const int qmul= qexp[qlog&7]<<(qlog>>3);
2327 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
2331 if(s->qlog == LOSSLESS_QLOG) return;
2337 int i= src[x + y*stride];
2339 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
2341 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
2345 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
2346 STOP_TIMER("dquant")
2350 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2351 const int w= b->width;
2352 const int h= b->height;
2355 for(y=h-1; y>=0; y--){
2356 for(x=w-1; x>=0; x--){
2357 int i= x + y*stride;
2361 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2362 else src[i] -= src[i - 1];
2364 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2365 else src[i] -= src[i - 1];
2368 if(y) src[i] -= src[i - stride];
2374 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2375 const int w= b->width;
2376 const int h= b->height;
2381 int i= x + y*stride;
2385 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2386 else src[i] += src[i - 1];
2388 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2389 else src[i] += src[i - 1];
2392 if(y) src[i] += src[i - stride];
2398 static void encode_header(SnowContext *s){
2399 int plane_index, level, orientation;
2402 memset(kstate, MID_STATE, sizeof(kstate));
2404 put_rac(&s->c, kstate, s->keyframe);
2405 if(s->keyframe || s->always_reset)
2408 put_symbol(&s->c, s->header_state, s->version, 0);
2409 put_rac(&s->c, s->header_state, s->always_reset);
2410 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
2411 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
2412 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
2413 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
2414 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
2415 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
2416 put_rac(&s->c, s->header_state, s->spatial_scalability);
2417 // put_rac(&s->c, s->header_state, s->rate_scalability);
2419 for(plane_index=0; plane_index<2; plane_index++){
2420 for(level=0; level<s->spatial_decomposition_count; level++){
2421 for(orientation=level ? 1:0; orientation<4; orientation++){
2422 if(orientation==2) continue;
2423 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
2428 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
2429 put_symbol(&s->c, s->header_state, s->qlog, 1);
2430 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
2431 put_symbol(&s->c, s->header_state, s->qbias, 1);
2432 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
2435 static int decode_header(SnowContext *s){
2436 int plane_index, level, orientation;
2439 memset(kstate, MID_STATE, sizeof(kstate));
2441 s->keyframe= get_rac(&s->c, kstate);
2442 if(s->keyframe || s->always_reset)
2445 s->version= get_symbol(&s->c, s->header_state, 0);
2447 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
2450 s->always_reset= get_rac(&s->c, s->header_state);
2451 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2452 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2453 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2454 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
2455 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
2456 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
2457 s->spatial_scalability= get_rac(&s->c, s->header_state);
2458 // s->rate_scalability= get_rac(&s->c, s->header_state);
2460 for(plane_index=0; plane_index<3; plane_index++){
2461 for(level=0; level<s->spatial_decomposition_count; level++){
2462 for(orientation=level ? 1:0; orientation<4; orientation++){
2464 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
2465 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
2466 else q= get_symbol(&s->c, s->header_state, 1);
2467 s->plane[plane_index].band[level][orientation].qlog= q;
2473 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2474 if(s->spatial_decomposition_type > 2){
2475 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
2479 s->qlog= get_symbol(&s->c, s->header_state, 1);
2480 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
2481 s->qbias= get_symbol(&s->c, s->header_state, 1);
2482 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
2487 static int common_init(AVCodecContext *avctx){
2488 SnowContext *s = avctx->priv_data;
2490 int level, orientation, plane_index, dec;
2494 dsputil_init(&s->dsp, avctx);
2497 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
2498 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
2499 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
2500 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
2501 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
2502 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
2521 #define mcfh(dx,dy)\
2522 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
2523 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
2524 mc_block_hpel ## dx ## dy ## 16;\
2525 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
2526 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
2527 mc_block_hpel ## dx ## dy ## 8;
2534 dec= s->spatial_decomposition_count= 5;
2535 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
2537 s->chroma_h_shift= 1; //FIXME XXX
2538 s->chroma_v_shift= 1;
2540 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
2542 width= s->avctx->width;
2543 height= s->avctx->height;
2545 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
2547 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
2548 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
2550 for(plane_index=0; plane_index<3; plane_index++){
2551 int w= s->avctx->width;
2552 int h= s->avctx->height;
2555 w>>= s->chroma_h_shift;
2556 h>>= s->chroma_v_shift;
2558 s->plane[plane_index].width = w;
2559 s->plane[plane_index].height= h;
2560 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
2561 for(level=s->spatial_decomposition_count-1; level>=0; level--){
2562 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2563 SubBand *b= &s->plane[plane_index].band[level][orientation];
2565 b->buf= s->spatial_dwt_buffer;
2567 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
2568 b->width = (w + !(orientation&1))>>1;
2569 b->height= (h + !(orientation>1))>>1;
2571 if(orientation&1) b->buf += (w+1)>>1;
2572 if(orientation>1) b->buf += b->stride>>1;
2575 b->parent= &s->plane[plane_index].band[level-1][orientation];
2576 b->x = av_mallocz(((b->width+1) * b->height+1)*sizeof(int16_t));
2577 b->coeff= av_mallocz(((b->width+1) * b->height+1)*sizeof(DWTELEM));
2586 width= s->width= avctx->width;
2587 height= s->height= avctx->height;
2589 assert(width && height);
2591 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
2597 static void calculate_vissual_weight(SnowContext *s, Plane *p){
2598 int width = p->width;
2599 int height= p->height;
2600 int level, orientation, x, y;
2602 for(level=0; level<s->spatial_decomposition_count; level++){
2603 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2604 SubBand *b= &p->band[level][orientation];
2605 DWTELEM *buf= b->buf;
2608 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
2609 buf[b->width/2 + b->height/2*b->stride]= 256*256;
2610 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
2611 for(y=0; y<height; y++){
2612 for(x=0; x<width; x++){
2613 int64_t d= s->spatial_dwt_buffer[x + y*width];
2618 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
2619 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
2624 static int encode_init(AVCodecContext *avctx)
2626 SnowContext *s = avctx->priv_data;
2629 if(avctx->strict_std_compliance >= 0){
2630 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
2631 "use vstrict=-1 to use it anyway\n");
2640 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
2641 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2642 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2643 h263_encode_init(&s->m); //mv_penalty
2645 for(plane_index=0; plane_index<3; plane_index++){
2646 calculate_vissual_weight(s, &s->plane[plane_index]);
2650 avctx->coded_frame= &s->current_picture;
2651 switch(avctx->pix_fmt){
2652 // case PIX_FMT_YUV444P:
2653 // case PIX_FMT_YUV422P:
2654 case PIX_FMT_YUV420P:
2656 // case PIX_FMT_YUV411P:
2657 // case PIX_FMT_YUV410P:
2658 s->colorspace_type= 0;
2660 /* case PIX_FMT_RGBA32:
2664 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
2667 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
2668 s->chroma_h_shift= 1;
2669 s->chroma_v_shift= 1;
2673 static int frame_start(SnowContext *s){
2675 int w= s->avctx->width; //FIXME round up to x16 ?
2676 int h= s->avctx->height;
2678 if(s->current_picture.data[0]){
2679 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
2680 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
2681 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
2684 tmp= s->last_picture;
2685 s->last_picture= s->current_picture;
2686 s->current_picture= tmp;
2688 s->current_picture.reference= 1;
2689 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
2690 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2697 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
2698 SnowContext *s = avctx->priv_data;
2699 RangeCoder * const c= &s->c;
2700 AVFrame *pict = data;
2701 const int width= s->avctx->width;
2702 const int height= s->avctx->height;
2703 int level, orientation, plane_index;
2705 ff_init_range_encoder(c, buf, buf_size);
2706 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2708 s->input_picture = *pict;
2710 s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
2711 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
2714 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
2718 s->qlog= LOSSLESS_QLOG;
2722 s->current_picture.key_frame= s->keyframe;
2724 if(pict->pict_type == P_TYPE){
2725 int block_width = (width +15)>>4;
2726 int block_height= (height+15)>>4;
2727 int stride= s->current_picture.linesize[0];
2729 assert(s->current_picture.data[0]);
2730 assert(s->last_picture.data[0]);
2732 s->m.avctx= s->avctx;
2733 s->m.current_picture.data[0]= s->current_picture.data[0];
2734 s->m. last_picture.data[0]= s-> last_picture.data[0];
2735 s->m. new_picture.data[0]= s-> input_picture.data[0];
2736 s->m.current_picture_ptr= &s->m.current_picture;
2737 s->m. last_picture_ptr= &s->m. last_picture;
2739 s->m. last_picture.linesize[0]=
2740 s->m. new_picture.linesize[0]=
2741 s->m.current_picture.linesize[0]= stride;
2742 s->m.uvlinesize= s->current_picture.linesize[1];
2744 s->m.height= height;
2745 s->m.mb_width = block_width;
2746 s->m.mb_height= block_height;
2747 s->m.mb_stride= s->m.mb_width+1;
2748 s->m.b8_stride= 2*s->m.mb_width+1;
2750 s->m.pict_type= pict->pict_type;
2751 s->m.me_method= s->avctx->me_method;
2752 s->m.me.scene_change_score=0;
2753 s->m.flags= s->avctx->flags;
2754 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
2755 s->m.out_format= FMT_H263;
2756 s->m.unrestricted_mv= 1;
2758 s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
2759 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
2760 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
2762 s->m.dsp= s->dsp; //move
2768 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
2773 for(plane_index=0; plane_index<3; plane_index++){
2774 Plane *p= &s->plane[plane_index];
2778 // int bits= put_bits_count(&s->c.pb);
2781 if(pict->data[plane_index]) //FIXME gray hack
2784 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
2787 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
2790 && pict->pict_type == P_TYPE
2791 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
2792 ff_init_range_encoder(c, buf, buf_size);
2793 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2794 pict->pict_type= FF_I_TYPE;
2800 if(s->qlog == LOSSLESS_QLOG){
2803 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1)))>>FRAC_BITS;
2808 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2810 for(level=0; level<s->spatial_decomposition_count; level++){
2811 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2812 SubBand *b= &p->band[level][orientation];
2814 quantize(s, b, b->buf, b->stride, s->qbias);
2816 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
2817 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
2818 assert(b->parent==NULL || b->parent->stride == b->stride*2);
2820 correlate(s, b, b->buf, b->stride, 1, 0);
2823 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
2825 for(level=0; level<s->spatial_decomposition_count; level++){
2826 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2827 SubBand *b= &p->band[level][orientation];
2829 dequantize(s, b, b->buf, b->stride);
2833 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2834 if(s->qlog == LOSSLESS_QLOG){
2837 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
2842 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2843 STOP_TIMER("pred-conv")}
2844 if(s->avctx->flags&CODEC_FLAG_PSNR){
2847 if(pict->data[plane_index]) //FIXME gray hack
2850 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];
2854 s->avctx->error[plane_index] += error;
2855 s->current_picture.error[plane_index] = error;
2859 if(s->last_picture.data[0])
2860 avctx->release_buffer(avctx, &s->last_picture);
2864 return ff_rac_terminate(c);
2867 static void common_end(SnowContext *s){
2868 int plane_index, level, orientation;
2870 av_freep(&s->spatial_dwt_buffer);
2872 av_freep(&s->m.me.scratchpad);
2873 av_freep(&s->m.me.map);
2874 av_freep(&s->m.me.score_map);
2876 av_freep(&s->block);
2878 for(plane_index=0; plane_index<3; plane_index++){
2879 for(level=s->spatial_decomposition_count-1; level>=0; level--){
2880 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2881 SubBand *b= &s->plane[plane_index].band[level][orientation];
2884 av_freep(&b->coeff);
2890 static int encode_end(AVCodecContext *avctx)
2892 SnowContext *s = avctx->priv_data;
2899 static int decode_init(AVCodecContext *avctx)
2901 // SnowContext *s = avctx->priv_data;
2908 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
2909 SnowContext *s = avctx->priv_data;
2910 RangeCoder * const c= &s->c;
2912 AVFrame *picture = data;
2913 int level, orientation, plane_index;
2916 /* no supplementary picture */
2920 ff_init_range_decoder(c, buf, buf_size);
2921 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
2923 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
2925 if(!s->block) alloc_blocks(s);
2928 //keyframe flag dupliaction mess FIXME
2929 if(avctx->debug&FF_DEBUG_PICT_INFO)
2930 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
2934 for(plane_index=0; plane_index<3; plane_index++){
2935 Plane *p= &s->plane[plane_index];
2940 if(s->avctx->debug&2048){
2941 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
2942 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2946 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
2947 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
2951 for(level=0; level<s->spatial_decomposition_count; level++){
2952 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2953 SubBand *b= &p->band[level][orientation];
2955 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
2957 correlate(s, b, b->buf, b->stride, 1, 0);
2958 dequantize(s, b, b->buf, b->stride);
2959 assert(b->buf == s->spatial_dwt_buffer);
2964 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
2965 if(s->qlog == LOSSLESS_QLOG){
2968 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
2973 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2974 STOP_TIMER("predict_plane conv2")}
2979 if(s->last_picture.data[0])
2980 avctx->release_buffer(avctx, &s->last_picture);
2982 if(!(s->avctx->debug&2048))
2983 *picture= s->current_picture;
2985 *picture= s->mconly_picture;
2987 *data_size = sizeof(AVFrame);
2989 bytes_read= c->bytestream - c->bytestream_start;
2990 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
2995 static int decode_end(AVCodecContext *avctx)
2997 SnowContext *s = avctx->priv_data;
3004 AVCodec snow_decoder = {
3008 sizeof(SnowContext),
3013 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
3017 #ifdef CONFIG_ENCODERS
3018 AVCodec snow_encoder = {
3022 sizeof(SnowContext),
3038 int buffer[2][width*height];
3041 s.spatial_decomposition_count=6;
3042 s.spatial_decomposition_type=1;
3044 printf("testing 5/3 DWT\n");
3045 for(i=0; i<width*height; i++)
3046 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3048 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3049 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3051 for(i=0; i<width*height; i++)
3052 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3054 printf("testing 9/7 DWT\n");
3055 s.spatial_decomposition_type=0;
3056 for(i=0; i<width*height; i++)
3057 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3059 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3060 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3062 for(i=0; i<width*height; i++)
3063 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3065 printf("testing AC coder\n");
3066 memset(s.header_state, 0, sizeof(s.header_state));
3067 ff_init_range_encoder(&s.c, buffer[0], 256*256);
3068 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3070 for(i=-256; i<256; i++){
3072 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
3073 STOP_TIMER("put_symbol")
3075 ff_rac_terminate(&s.c);
3077 memset(s.header_state, 0, sizeof(s.header_state));
3078 ff_init_range_decoder(&s.c, buffer[0], 256*256);
3079 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3081 for(i=-256; i<256; i++){
3084 j= get_symbol(&s.c, s.header_state, 1);
3085 STOP_TIMER("get_symbol")
3086 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
3089 int level, orientation, x, y;
3090 int64_t errors[8][4];
3093 memset(errors, 0, sizeof(errors));
3094 s.spatial_decomposition_count=3;
3095 s.spatial_decomposition_type=0;
3096 for(level=0; level<s.spatial_decomposition_count; level++){
3097 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3098 int w= width >> (s.spatial_decomposition_count-level);
3099 int h= height >> (s.spatial_decomposition_count-level);
3100 int stride= width << (s.spatial_decomposition_count-level);
3101 DWTELEM *buf= buffer[0];
3104 if(orientation&1) buf+=w;
3105 if(orientation>1) buf+=stride>>1;
3107 memset(buffer[0], 0, sizeof(int)*width*height);
3108 buf[w/2 + h/2*stride]= 256*256;
3109 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3110 for(y=0; y<height; y++){
3111 for(x=0; x<width; x++){
3112 int64_t d= buffer[0][x + y*width];
3114 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
3116 if(ABS(height/2-y)<9 && level==2) printf("\n");
3118 error= (int)(sqrt(error)+0.5);
3119 errors[level][orientation]= error;
3120 if(g) g=ff_gcd(g, error);
3124 printf("static int const visual_weight[][4]={\n");
3125 for(level=0; level<s.spatial_decomposition_count; level++){
3127 for(orientation=0; orientation<4; orientation++){
3128 printf("%8lld,", errors[level][orientation]/g);
3136 int w= width >> (s.spatial_decomposition_count-level);
3137 int h= height >> (s.spatial_decomposition_count-level);
3138 int stride= width << (s.spatial_decomposition_count-level);
3139 DWTELEM *buf= buffer[0];
3145 memset(buffer[0], 0, sizeof(int)*width*height);
3147 for(y=0; y<height; y++){
3148 for(x=0; x<width; x++){
3149 int tab[4]={0,2,3,1};
3150 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
3153 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3157 buf[x + y*stride ]=169;
3158 buf[x + y*stride-w]=64;
3161 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3163 for(y=0; y<height; y++){
3164 for(x=0; x<width; x++){
3165 int64_t d= buffer[0][x + y*width];
3167 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
3169 if(ABS(height/2-y)<9) printf("\n");