2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "rangecoder.h"
26 #include "mpegvideo.h"
31 #define MAX_DECOMPOSITIONS 8
35 #define QROOT (1<<QSHIFT)
36 #define LOSSLESS_QLOG -128
39 static const int8_t quant3[256]={
40 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
57 static const int8_t quant3b[256]={
58 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
65 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
72 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
73 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75 static const int8_t quant3bA[256]={
76 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
84 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
85 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
86 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
87 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
88 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
89 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
90 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
91 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
93 static const int8_t quant5[256]={
94 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
96 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
97 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
104 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
105 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
106 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
107 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
108 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
109 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
111 static const int8_t quant7[256]={
112 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
113 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
114 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
115 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
116 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
118 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
119 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
120 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
121 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
122 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
123 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
124 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
125 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
126 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
127 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
129 static const int8_t quant9[256]={
130 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
131 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
132 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
133 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
134 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
135 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
136 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
137 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
138 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
139 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
140 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
141 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
145 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
147 static const int8_t quant11[256]={
148 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
149 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
150 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
151 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
152 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
153 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
154 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
155 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
157 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
158 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
159 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
160 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
162 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
163 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
165 static const int8_t quant13[256]={
166 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
167 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
168 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
169 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
170 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
171 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
172 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
173 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
174 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
175 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
176 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
177 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
178 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
179 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
180 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
181 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
184 #define LOG2_OBMC_MAX 6
185 #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
187 static const uint8_t obmc32[1024]={
188 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
189 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
190 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
191 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
192 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
193 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
194 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
195 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
196 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
197 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
198 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
199 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
200 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
201 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
202 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
203 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
204 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
205 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
206 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
207 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
208 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
209 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
210 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
211 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
212 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
213 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
214 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
215 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
216 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
217 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
218 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222 static const uint8_t obmc16[256]={
223 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
224 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
225 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
226 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
227 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
228 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
229 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
230 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
231 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
232 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
233 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
234 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
235 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
236 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
237 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
238 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
242 static const uint8_t obmc32[1024]={
243 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
244 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
245 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
246 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
247 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
248 1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
249 1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
250 1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
251 1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
252 1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
253 1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
254 1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
255 2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
256 2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
257 2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
258 2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
259 2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
260 2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
261 2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
262 2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
263 1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
264 1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
265 1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
266 1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
267 1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
268 1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
269 1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
270 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
271 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
272 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
273 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
274 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
277 static const uint8_t obmc16[256]={
278 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
279 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
280 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
281 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
282 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
283 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
284 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
285 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
286 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
287 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
288 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
289 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
290 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
291 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
292 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
293 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
297 static const uint8_t obmc32[1024]={
298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
301 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
302 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
303 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
304 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
305 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
306 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
307 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
308 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
309 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
310 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
311 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
312 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
313 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
314 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
315 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
316 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
317 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
318 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
319 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
320 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
321 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
322 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
323 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
324 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
325 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
326 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
327 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
328 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
329 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 static const uint8_t obmc16[256]={
333 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
334 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
335 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
336 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
337 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
338 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
339 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
340 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
341 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
342 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
343 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
344 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
345 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
346 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
347 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
348 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
354 static const uint8_t obmc8[64]={
355 1, 3, 5, 7, 7, 5, 3, 1,
356 3, 9,15,21,21,15, 9, 3,
357 5,15,25,35,35,25,15, 5,
358 7,21,35,49,49,35,21, 7,
359 7,21,35,49,49,35,21, 7,
360 5,15,25,35,35,25,15, 5,
361 3, 9,15,21,21,15, 9, 3,
362 1, 3, 5, 7, 7, 5, 3, 1,
367 static const uint8_t obmc4[16]={
375 static const uint8_t *obmc_tab[4]={
376 obmc32, obmc16, obmc8, obmc4
379 typedef struct BlockNode{
384 //#define TYPE_SPLIT 1
385 #define BLOCK_INTRA 1
386 //#define TYPE_NOCOLOR 4
387 uint8_t level; //FIXME merge into type?
390 #define LOG2_MB_SIZE 4
391 #define MB_SIZE (1<<LOG2_MB_SIZE)
393 typedef struct x_and_coeff{
398 typedef struct SubBand{
403 int qlog; ///< log(qscale)/log[2^(1/6)]
407 int stride_line; ///< Stride measured in lines, not pixels.
408 x_and_coeff * x_coeff;
409 struct SubBand *parent;
410 uint8_t state[/*7*2*/ 7 + 512][32];
413 typedef struct Plane{
416 SubBand band[MAX_DECOMPOSITIONS][4];
419 /** Used to minimize the amount of memory used in order to optimize cache performance. **/
421 DWTELEM * * line; ///< For use by idwt and predict_slices.
422 DWTELEM * * data_stack; ///< Used for internal purposes.
427 DWTELEM * base_buffer; ///< Buffer that this structure is caching.
430 typedef struct SnowContext{
431 // 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 AVCodecContext *avctx;
436 AVFrame input_picture;
437 AVFrame current_picture;
438 AVFrame last_picture;
439 AVFrame mconly_picture;
440 // uint8_t q_context[16];
441 uint8_t header_state[32];
442 uint8_t block_state[128 + 32*128];
446 int spatial_decomposition_type;
447 int temporal_decomposition_type;
448 int spatial_decomposition_count;
449 int temporal_decomposition_count;
450 DWTELEM *spatial_dwt_buffer;
454 int spatial_scalability;
460 #define QBIAS_SHIFT 3
464 Plane plane[MAX_PLANES];
468 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)
479 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
480 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
482 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
486 buf->base_buffer = base_buffer;
487 buf->line_count = line_count;
488 buf->line_width = line_width;
489 buf->data_count = max_allocated_lines;
490 buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
491 buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
493 for (i = 0; i < max_allocated_lines; i++)
495 buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
498 buf->data_stack_top = max_allocated_lines - 1;
501 static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
506 // av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
508 assert(buf->data_stack_top >= 0);
509 // assert(!buf->line[line]);
511 return buf->line[line];
513 offset = buf->line_width * line;
514 buffer = buf->data_stack[buf->data_stack_top];
515 buf->data_stack_top--;
516 buf->line[line] = buffer;
518 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
523 static void slice_buffer_release(slice_buffer * buf, int line)
528 assert(line >= 0 && line < buf->line_count);
529 assert(buf->line[line]);
531 offset = buf->line_width * line;
532 buffer = buf->line[line];
533 buf->data_stack_top++;
534 buf->data_stack[buf->data_stack_top] = buffer;
535 buf->line[line] = NULL;
537 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
540 static void slice_buffer_flush(slice_buffer * buf)
543 for (i = 0; i < buf->line_count; i++)
547 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
548 slice_buffer_release(buf, i);
553 static void slice_buffer_destroy(slice_buffer * buf)
556 slice_buffer_flush(buf);
558 for (i = buf->data_count - 1; i >= 0; i--)
560 assert(buf->data_stack[i]);
561 av_free(buf->data_stack[i]);
563 assert(buf->data_stack);
564 av_free(buf->data_stack);
570 // Avoid a name clash on SGI IRIX
573 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
574 static uint8_t qexp[QROOT];
576 static inline int mirror(int v, int m){
578 else if(v>m) return 2*m-v;
582 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
587 const int e= av_log2(a);
589 const int el= FFMIN(e, 10);
590 put_rac(c, state+0, 0);
593 put_rac(c, state+1+i, 1); //1..10
596 put_rac(c, state+1+9, 1); //1..10
598 put_rac(c, state+1+FFMIN(i,9), 0);
600 for(i=e-1; i>=el; i--){
601 put_rac(c, state+22+9, (a>>i)&1); //22..31
604 put_rac(c, state+22+i, (a>>i)&1); //22..31
608 put_rac(c, state+11 + el, v < 0); //11..21
611 put_rac(c, state+0, 0);
614 put_rac(c, state+1+i, 1); //1..10
616 put_rac(c, state+1+i, 0);
618 for(i=e-1; i>=0; i--){
619 put_rac(c, state+22+i, (a>>i)&1); //22..31
623 put_rac(c, state+11 + e, v < 0); //11..21
626 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
628 put_rac(c, state+1+FFMIN(i,9), 0);
630 for(i=e-1; i>=0; i--){
631 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
635 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
639 put_rac(c, state+0, 1);
643 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
644 if(get_rac(c, state+0))
649 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
654 for(i=e-1; i>=0; i--){
655 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
658 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
665 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
667 int r= log2>=0 ? 1<<log2 : 1;
673 put_rac(c, state+4+log2, 1);
678 put_rac(c, state+4+log2, 0);
680 for(i=log2-1; i>=0; i--){
681 put_rac(c, state+31-i, (v>>i)&1);
685 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
687 int r= log2>=0 ? 1<<log2 : 1;
692 while(get_rac(c, state+4+log2)){
698 for(i=log2-1; i>=0; i--){
699 v+= get_rac(c, state+31-i)<<i;
705 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){
706 const int mirror_left= !highpass;
707 const int mirror_right= (width&1) ^ highpass;
708 const int w= (width>>1) - 1 + (highpass & width);
711 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
713 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
719 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
723 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
727 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){
728 const int mirror_left= !highpass;
729 const int mirror_right= (width&1) ^ highpass;
730 const int w= (width>>1) - 1 + (highpass & width);
737 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
743 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
746 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
750 int r= 3*2*ref[w*ref_step];
753 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
757 static always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
758 const int mirror_left= !highpass;
759 const int mirror_right= (width&1) ^ highpass;
760 const int w= (width>>1) - 1 + (highpass & width);
764 #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
766 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
772 dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
776 dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
781 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
784 for(x=start; x<width; x+=2){
788 int x2= x + 2*i - n + 1;
790 else if(x2>=width) x2= 2*width-x2-2;
791 sum += coeffs[i]*(int64_t)dst[x2];
793 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
794 else dst[x] += (sum + (1<<shift)/2)>>shift;
798 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
800 for(y=start; y<height; y+=2){
801 for(x=0; x<width; x++){
805 int y2= y + 2*i - n + 1;
807 else if(y2>=height) y2= 2*height-y2-2;
808 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
810 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
811 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
820 #if 0 // more accurate 9/7
823 #define COEFFS1 (int[]){-25987,-25987}
826 #define COEFFS2 (int[]){-27777,-27777}
829 #define COEFFS3 (int[]){28931,28931}
832 #define COEFFS4 (int[]){14533,14533}
836 #define COEFFS1 (int[]){1,-9,-9,1}
839 #define COEFFS2 (int[]){-1,5,5,-1}
852 #define COEFFS1 (int[]){1,1}
855 #define COEFFS2 (int[]){-1,-1}
868 #define COEFFS2 (int[]){-1,-1}
871 #define COEFFS3 (int[]){-1,-1}
874 #define COEFFS4 (int[]){-5,29,29,-5}
879 #define COEFFS1 (int[]){-203,-203}
882 #define COEFFS2 (int[]){-217,-217}
885 #define COEFFS3 (int[]){113,113}
888 #define COEFFS4 (int[]){227,227}
896 #define COEFFS2 (int[]){-1,-1}
899 #define COEFFS3 (int[]){-1,-1}
902 #define COEFFS4 (int[]){3,3}
906 #define COEFFS1 (int[]){1,-9,-9,1}
909 #define COEFFS2 (int[]){1,1}
919 #define COEFFS1 (int[]){1,-9,-9,1}
922 #define COEFFS2 (int[]){-1,5,5,-1}
930 static void horizontal_decomposeX(DWTELEM *b, int width){
932 const int width2= width>>1;
933 const int w2= (width+1)>>1;
936 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
937 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
938 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
939 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
941 for(x=0; x<width2; x++){
943 temp[x+w2]= b[2*x + 1];
947 memcpy(b, temp, width*sizeof(int));
950 static void horizontal_composeX(DWTELEM *b, int width){
952 const int width2= width>>1;
954 const int w2= (width+1)>>1;
956 memcpy(temp, b, width*sizeof(int));
957 for(x=0; x<width2; x++){
959 b[2*x + 1]= temp[x+w2];
964 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
965 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
966 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
967 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
970 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
973 for(y=0; y<height; y++){
974 for(x=0; x<width; x++){
975 buffer[y*stride + x] *= SCALEX;
979 for(y=0; y<height; y++){
980 horizontal_decomposeX(buffer + y*stride, width);
983 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
984 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
985 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
986 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
989 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
992 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
993 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
994 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
995 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
997 for(y=0; y<height; y++){
998 horizontal_composeX(buffer + y*stride, width);
1001 for(y=0; y<height; y++){
1002 for(x=0; x<width; x++){
1003 buffer[y*stride + x] /= SCALEX;
1008 static void horizontal_decompose53i(DWTELEM *b, int width){
1009 DWTELEM temp[width];
1010 const int width2= width>>1;
1012 const int w2= (width+1)>>1;
1014 for(x=0; x<width2; x++){
1016 temp[x+w2]= b[2*x + 1];
1030 for(x=1; x+1<width2; x+=2){
1034 A2 += (A1 + A3 + 2)>>2;
1038 A1= temp[x+1+width2];
1041 A4 += (A1 + A3 + 2)>>2;
1047 A2 += (A1 + A3 + 2)>>2;
1052 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1053 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
1057 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1060 for(i=0; i<width; i++){
1061 b1[i] -= (b0[i] + b2[i])>>1;
1065 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1068 for(i=0; i<width; i++){
1069 b1[i] += (b0[i] + b2[i] + 2)>>2;
1073 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
1075 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1076 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
1078 for(y=-2; y<height; y+=2){
1079 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1080 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1083 if(b1 <= b3) horizontal_decompose53i(b2, width);
1084 if(y+2 < height) horizontal_decompose53i(b3, width);
1085 STOP_TIMER("horizontal_decompose53i")}
1088 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
1089 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
1090 STOP_TIMER("vertical_decompose53i*")}
1167 static void horizontal_decompose97i(DWTELEM *b, int width){
1168 DWTELEM temp[width];
1169 const int w2= (width+1)>>1;
1171 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1172 liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1173 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1174 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1178 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1181 for(i=0; i<width; i++){
1182 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1186 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1189 for(i=0; i<width; i++){
1191 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1193 int r= 3*(b0[i] + b2[i]);
1196 b1[i] += (r+W_CO)>>W_CS;
1201 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1204 for(i=0; i<width; i++){
1206 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1208 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
1213 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1216 for(i=0; i<width; i++){
1217 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1221 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1223 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1224 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1225 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1226 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1228 for(y=-4; y<height; y+=2){
1229 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1230 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1233 if(b3 <= b5) horizontal_decompose97i(b4, width);
1234 if(y+4 < height) horizontal_decompose97i(b5, width);
1236 STOP_TIMER("horizontal_decompose97i")
1240 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1241 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1242 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1243 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1246 STOP_TIMER("vertical_decompose97i")
1256 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1259 for(level=0; level<decomposition_count; level++){
1261 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1262 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1263 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1268 static void horizontal_compose53i(DWTELEM *b, int width){
1269 DWTELEM temp[width];
1270 const int width2= width>>1;
1271 const int w2= (width+1)>>1;
1283 for(x=1; x+1<width2; x+=2){
1287 A2 += (A1 + A3 + 2)>>2;
1291 A1= temp[x+1+width2];
1294 A4 += (A1 + A3 + 2)>>2;
1300 A2 += (A1 + A3 + 2)>>2;
1304 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1305 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1307 for(x=0; x<width2; x++){
1309 b[2*x + 1]= temp[x+w2];
1315 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1318 for(i=0; i<width; i++){
1319 b1[i] += (b0[i] + b2[i])>>1;
1323 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1326 for(i=0; i<width; i++){
1327 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1331 static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1332 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
1333 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line);
1337 static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1338 cs->b0 = buffer + mirror(-1-1, height-1)*stride;
1339 cs->b1 = buffer + mirror(-1 , height-1)*stride;
1343 static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1345 int mirror0 = mirror(y-1, height-1);
1346 int mirror1 = mirror(y , height-1);
1347 int mirror2 = mirror(y+1, height-1);
1348 int mirror3 = mirror(y+2, height-1);
1350 DWTELEM *b0= cs->b0;
1351 DWTELEM *b1= cs->b1;
1352 DWTELEM *b2= slice_buffer_get_line(sb, mirror2 * stride_line);
1353 DWTELEM *b3= slice_buffer_get_line(sb, mirror3 * stride_line);
1356 if(mirror1 <= mirror3) vertical_compose53iL0(b1, b2, b3, width);
1357 if(mirror0 <= mirror2) vertical_compose53iH0(b0, b1, b2, width);
1358 STOP_TIMER("vertical_compose53i*")}
1361 if(y-1 >= 0) horizontal_compose53i(b0, width);
1362 if(mirror0 <= mirror2) horizontal_compose53i(b1, width);
1363 STOP_TIMER("horizontal_compose53i")}
1370 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1372 DWTELEM *b0= cs->b0;
1373 DWTELEM *b1= cs->b1;
1374 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1375 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1378 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1379 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1380 STOP_TIMER("vertical_compose53i*")}
1383 if(y-1 >= 0) horizontal_compose53i(b0, width);
1384 if(b0 <= b2) horizontal_compose53i(b1, width);
1385 STOP_TIMER("horizontal_compose53i")}
1392 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1394 spatial_compose53i_init(&cs, buffer, height, stride);
1395 while(cs.y <= height)
1396 spatial_compose53i_dy(&cs, buffer, width, height, stride);
1400 static void horizontal_compose97i(DWTELEM *b, int width){
1401 DWTELEM temp[width];
1402 const int w2= (width+1)>>1;
1404 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1405 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1406 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1407 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1410 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1413 for(i=0; i<width; i++){
1414 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1418 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1421 for(i=0; i<width; i++){
1423 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1425 int r= 3*(b0[i] + b2[i]);
1428 b1[i] -= (r+W_CO)>>W_CS;
1433 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1436 for(i=0; i<width; i++){
1438 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1440 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1445 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1448 for(i=0; i<width; i++){
1449 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1453 static void vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1456 for(i=0; i<width; i++){
1460 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1462 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1464 r= 3*(b2[i] + b4[i]);
1467 b3[i] -= (r+W_CO)>>W_CS;
1470 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1472 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1474 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1478 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1479 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1480 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
1481 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1482 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1486 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1487 cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1488 cs->b1 = buffer + mirror(-3 , height-1)*stride;
1489 cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1490 cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1494 static void spatial_compose97i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1497 int mirror0 = mirror(y - 1, height - 1);
1498 int mirror1 = mirror(y + 0, height - 1);
1499 int mirror2 = mirror(y + 1, height - 1);
1500 int mirror3 = mirror(y + 2, height - 1);
1501 int mirror4 = mirror(y + 3, height - 1);
1502 int mirror5 = mirror(y + 4, height - 1);
1503 DWTELEM *b0= cs->b0;
1504 DWTELEM *b1= cs->b1;
1505 DWTELEM *b2= cs->b2;
1506 DWTELEM *b3= cs->b3;
1507 DWTELEM *b4= slice_buffer_get_line(sb, mirror4 * stride_line);
1508 DWTELEM *b5= slice_buffer_get_line(sb, mirror5 * stride_line);
1511 if(y>0 && y+4<height){
1512 vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1514 if(mirror3 <= mirror5) vertical_compose97iL1(b3, b4, b5, width);
1515 if(mirror2 <= mirror4) vertical_compose97iH1(b2, b3, b4, width);
1516 if(mirror1 <= mirror3) vertical_compose97iL0(b1, b2, b3, width);
1517 if(mirror0 <= mirror2) vertical_compose97iH0(b0, b1, b2, width);
1520 STOP_TIMER("vertical_compose97i")}}
1523 if(y-1>= 0) horizontal_compose97i(b0, width);
1524 if(mirror0 <= mirror2) horizontal_compose97i(b1, width);
1525 if(width>400 && mirror0 <= mirror2){
1526 STOP_TIMER("horizontal_compose97i")}}
1535 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1537 DWTELEM *b0= cs->b0;
1538 DWTELEM *b1= cs->b1;
1539 DWTELEM *b2= cs->b2;
1540 DWTELEM *b3= cs->b3;
1541 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1542 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1544 if(stride == width && y+4 < height && 0){
1546 for(x=0; x<width/2; x++)
1553 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1554 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1555 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1556 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1558 STOP_TIMER("vertical_compose97i")}}
1561 if(y-1>= 0) horizontal_compose97i(b0, width);
1562 if(b0 <= b2) horizontal_compose97i(b1, width);
1563 if(width>400 && b0 <= b2){
1564 STOP_TIMER("horizontal_compose97i")}}
1573 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1575 spatial_compose97i_init(&cs, buffer, height, stride);
1576 while(cs.y <= height)
1577 spatial_compose97i_dy(&cs, buffer, width, height, stride);
1580 void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
1582 for(level=decomposition_count-1; level>=0; level--){
1584 case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1585 case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1586 /* not slicified yet */
1587 case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1588 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1593 void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1595 for(level=decomposition_count-1; level>=0; level--){
1597 case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1598 case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1599 /* not slicified yet */
1600 case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1605 void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1606 const int support = type==1 ? 3 : 5;
1610 for(level=decomposition_count-1; level>=0; level--){
1611 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1613 case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1615 case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1623 void ff_spatial_idwt_buffered_slice(dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
1624 const int support = type==1 ? 3 : 5;
1628 for(level=decomposition_count-1; level>=0; level--){
1629 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1631 case 0: spatial_compose97i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1633 case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1641 void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1644 for(level=decomposition_count-1; level>=0; level--)
1645 spatial_composeX (buffer, width>>level, height>>level, stride<<level);
1647 dwt_compose_t cs[MAX_DECOMPOSITIONS];
1649 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1650 for(y=0; y<height; y+=4)
1651 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1655 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1656 const int w= b->width;
1657 const int h= b->height;
1669 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1670 v= src[x + y*stride];
1673 t= src[x + (y-1)*stride];
1675 lt= src[x - 1 + (y-1)*stride];
1678 rt= src[x + 1 + (y-1)*stride];
1682 l= src[x - 1 + y*stride];
1684 if(orientation==1) ll= src[y + (x-2)*stride];
1685 else ll= src[x - 2 + y*stride];
1691 if(px<b->parent->width && py<b->parent->height)
1692 p= parent[px + py*2*stride];
1694 if(!(/*ll|*/l|lt|t|rt|p)){
1696 runs[run_index++]= run;
1704 max_index= run_index;
1705 runs[run_index++]= run;
1707 run= runs[run_index++];
1709 put_symbol2(&s->c, b->state[30], max_index, 0);
1710 if(run_index <= max_index)
1711 put_symbol2(&s->c, b->state[1], run, 3);
1714 if(s->c.bytestream_end - s->c.bytestream < w*40){
1715 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1720 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1721 v= src[x + y*stride];
1724 t= src[x + (y-1)*stride];
1726 lt= src[x - 1 + (y-1)*stride];
1729 rt= src[x + 1 + (y-1)*stride];
1733 l= src[x - 1 + y*stride];
1735 if(orientation==1) ll= src[y + (x-2)*stride];
1736 else ll= src[x - 2 + y*stride];
1742 if(px<b->parent->width && py<b->parent->height)
1743 p= parent[px + py*2*stride];
1745 if(/*ll|*/l|lt|t|rt|p){
1746 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1748 put_rac(&s->c, &b->state[0][context], !!v);
1751 run= runs[run_index++];
1753 if(run_index <= max_index)
1754 put_symbol2(&s->c, b->state[1], run, 3);
1762 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1763 int l2= 2*ABS(l) + (l<0);
1764 int t2= 2*ABS(t) + (t<0);
1766 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1767 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1775 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1776 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1777 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1778 return encode_subband_c0run(s, b, src, parent, stride, orientation);
1779 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1782 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1783 const int w= b->width;
1784 const int h= b->height;
1789 x_and_coeff *xc= b->x_coeff;
1790 x_and_coeff *prev_xc= NULL;
1791 x_and_coeff *prev2_xc= xc;
1792 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1793 x_and_coeff *prev_parent_xc= parent_xc;
1795 runs= get_symbol2(&s->c, b->state[30], 0);
1796 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1801 int lt=0, t=0, rt=0;
1803 if(y && prev_xc->x == 0){
1815 if(prev_xc->x == x + 1)
1821 if(x>>1 > parent_xc->x){
1824 if(x>>1 == parent_xc->x){
1825 p= parent_xc->coeff;
1828 if(/*ll|*/l|lt|t|rt|p){
1829 int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1831 v=get_rac(&s->c, &b->state[0][context]);
1833 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1834 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1841 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1843 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1844 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1853 if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1854 else max_run= FFMIN(run, w-x-1);
1856 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1862 (xc++)->x= w+1; //end marker
1868 while(parent_xc->x != parent->width+1)
1871 prev_parent_xc= parent_xc;
1873 parent_xc= prev_parent_xc;
1878 (xc++)->x= w+1; //end marker
1882 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1883 const int w= b->width;
1885 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1886 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1887 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1892 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1897 /* If we are on the second or later slice, restore our index. */
1899 new_index = save_state[0];
1902 for(y=start_y; y<h; y++){
1905 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1906 memset(line, 0, b->width*sizeof(DWTELEM));
1907 v = b->x_coeff[new_index].coeff;
1908 x = b->x_coeff[new_index++].x;
1911 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1912 register int u= -(v&1);
1913 line[x] = (t^u) - u;
1915 v = b->x_coeff[new_index].coeff;
1916 x = b->x_coeff[new_index++].x;
1919 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1920 STOP_TIMER("decode_subband")
1923 /* Save our variables for the next slice. */
1924 save_state[0] = new_index;
1929 static void reset_contexts(SnowContext *s){
1930 int plane_index, level, orientation;
1932 for(plane_index=0; plane_index<3; plane_index++){
1933 for(level=0; level<s->spatial_decomposition_count; level++){
1934 for(orientation=level ? 1:0; orientation<4; orientation++){
1935 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1939 memset(s->header_state, MID_STATE, sizeof(s->header_state));
1940 memset(s->block_state, MID_STATE, sizeof(s->block_state));
1943 static int alloc_blocks(SnowContext *s){
1944 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1945 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1950 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1954 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1955 uint8_t *bytestream= d->bytestream;
1956 uint8_t *bytestream_start= d->bytestream_start;
1958 d->bytestream= bytestream;
1959 d->bytestream_start= bytestream_start;
1962 //near copy & paste from dsputil, FIXME
1963 static int pix_sum(uint8_t * pix, int line_size, int w)
1968 for (i = 0; i < w; i++) {
1969 for (j = 0; j < w; j++) {
1973 pix += line_size - w;
1978 //near copy & paste from dsputil, FIXME
1979 static int pix_norm1(uint8_t * pix, int line_size, int w)
1982 uint32_t *sq = squareTbl + 256;
1985 for (i = 0; i < w; i++) {
1986 for (j = 0; j < w; j ++) {
1990 pix += line_size - w;
1995 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){
1996 const int w= s->b_width << s->block_max_depth;
1997 const int rem_depth= s->block_max_depth - level;
1998 const int index= (x + y*w) << rem_depth;
1999 const int block_w= 1<<rem_depth;
2011 for(j=0; j<block_w; j++){
2012 for(i=0; i<block_w; i++){
2013 s->block[index + i + j*w]= block;
2018 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){
2019 const int offset[3]= {
2021 ((y*c->uvstride + x)>>1),
2022 ((y*c->uvstride + x)>>1),
2026 c->src[0][i]= src [i];
2027 c->ref[0][i]= ref [i] + offset[i];
2035 #define P_TOPRIGHT P[3]
2036 #define P_MEDIAN P[4]
2038 #define FLAG_QPEL 1 //must be 1
2040 static int encode_q_branch(SnowContext *s, int level, int x, int y){
2041 uint8_t p_buffer[1024];
2042 uint8_t i_buffer[1024];
2043 uint8_t p_state[sizeof(s->block_state)];
2044 uint8_t i_state[sizeof(s->block_state)];
2046 uint8_t *pbbak= s->c.bytestream;
2047 uint8_t *pbbak_start= s->c.bytestream_start;
2048 int score, score2, iscore, i_len, p_len, block_s, sum;
2049 const int w= s->b_width << s->block_max_depth;
2050 const int h= s->b_height << s->block_max_depth;
2051 const int rem_depth= s->block_max_depth - level;
2052 const int index= (x + y*w) << rem_depth;
2053 const int block_w= 1<<(LOG2_MB_SIZE - level);
2054 static BlockNode null_block= { //FIXME add border maybe
2055 .color= {128,128,128},
2061 int trx= (x+1)<<rem_depth;
2062 int try= (y+1)<<rem_depth;
2063 BlockNode *left = x ? &s->block[index-1] : &null_block;
2064 BlockNode *top = y ? &s->block[index-w] : &null_block;
2065 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
2066 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
2067 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2068 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2069 int pl = left->color[0];
2070 int pcb= left->color[1];
2071 int pcr= left->color[2];
2072 int pmx= mid_pred(left->mx, top->mx, tr->mx);
2073 int pmy= mid_pred(left->my, top->my, tr->my);
2076 const int stride= s->current_picture.linesize[0];
2077 const int uvstride= s->current_picture.linesize[1];
2078 const int instride= s->input_picture.linesize[0];
2079 const int uvinstride= s->input_picture.linesize[1];
2080 uint8_t *new_l = s->input_picture.data[0] + (x + y* instride)*block_w;
2081 uint8_t *new_cb= s->input_picture.data[1] + (x + y*uvinstride)*block_w/2;
2082 uint8_t *new_cr= s->input_picture.data[2] + (x + y*uvinstride)*block_w/2;
2083 uint8_t current_mb[3][stride*block_w];
2084 uint8_t *current_data[3]= {¤t_mb[0][0], ¤t_mb[1][0], ¤t_mb[2][0]};
2086 int16_t last_mv[3][2];
2087 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
2088 const int shift= 1+qpel;
2089 MotionEstContext *c= &s->m.me;
2090 int mx_context= av_log2(2*ABS(left->mx - top->mx));
2091 int my_context= av_log2(2*ABS(left->my - top->my));
2092 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2094 assert(sizeof(s->block_state) >= 256);
2096 set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2101 for(i=0; i<block_w; i++)
2102 memcpy(¤t_mb[0][0] + stride*i, new_l + instride*i, block_w);
2103 for(i=0; i<block_w>>1; i++)
2104 memcpy(¤t_mb[1][0] + uvstride*i, new_cb + uvinstride*i, block_w>>1);
2105 for(i=0; i<block_w>>1; i++)
2106 memcpy(¤t_mb[2][0] + uvstride*i, new_cr + uvinstride*i, block_w>>1);
2108 // clip predictors / edge ?
2110 P_LEFT[0]= left->mx;
2111 P_LEFT[1]= left->my;
2114 P_TOPRIGHT[0]= tr->mx;
2115 P_TOPRIGHT[1]= tr->my;
2117 last_mv[0][0]= s->block[index].mx;
2118 last_mv[0][1]= s->block[index].my;
2119 last_mv[1][0]= right->mx;
2120 last_mv[1][1]= right->my;
2121 last_mv[2][0]= bottom->mx;
2122 last_mv[2][1]= bottom->my;
2129 init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
2131 assert(s->m.me. stride == stride);
2132 assert(s->m.me.uvstride == uvstride);
2134 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2135 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2136 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2137 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2139 c->xmin = - x*block_w - 16+2;
2140 c->ymin = - y*block_w - 16+2;
2141 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2142 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2144 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
2145 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
2146 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
2147 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
2148 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2149 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2150 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2152 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
2153 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
2156 c->pred_x= P_LEFT[0];
2157 c->pred_y= P_LEFT[1];
2159 c->pred_x = P_MEDIAN[0];
2160 c->pred_y = P_MEDIAN[1];
2163 score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
2164 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
2166 assert(mx >= c->xmin);
2167 assert(mx <= c->xmax);
2168 assert(my >= c->ymin);
2169 assert(my <= c->ymax);
2171 score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
2172 score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
2173 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
2177 pc.bytestream_start=
2178 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
2179 memcpy(p_state, s->block_state, sizeof(s->block_state));
2181 if(level!=s->block_max_depth)
2182 put_rac(&pc, &p_state[4 + s_context], 1);
2183 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
2184 put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
2185 put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
2186 p_len= pc.bytestream - pc.bytestream_start;
2187 score += (s->lambda2*(p_len*8
2188 + (pc.outstanding_count - s->c.outstanding_count)*8
2189 + (-av_log2(pc.range) + av_log2(s->c.range))
2190 ))>>FF_LAMBDA_SHIFT;
2192 block_s= block_w*block_w;
2193 sum = pix_sum(¤t_mb[0][0], stride, block_w);
2194 l= (sum + block_s/2)/block_s;
2195 iscore = pix_norm1(¤t_mb[0][0], stride, block_w) - 2*l*sum + l*l*block_s;
2197 block_s= block_w*block_w>>2;
2198 sum = pix_sum(¤t_mb[1][0], uvstride, block_w>>1);
2199 cb= (sum + block_s/2)/block_s;
2200 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
2201 sum = pix_sum(¤t_mb[2][0], uvstride, block_w>>1);
2202 cr= (sum + block_s/2)/block_s;
2203 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
2206 ic.bytestream_start=
2207 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
2208 memcpy(i_state, s->block_state, sizeof(s->block_state));
2209 if(level!=s->block_max_depth)
2210 put_rac(&ic, &i_state[4 + s_context], 1);
2211 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
2212 put_symbol(&ic, &i_state[32], l-pl , 1);
2213 put_symbol(&ic, &i_state[64], cb-pcb, 1);
2214 put_symbol(&ic, &i_state[96], cr-pcr, 1);
2215 i_len= ic.bytestream - ic.bytestream_start;
2216 iscore += (s->lambda2*(i_len*8
2217 + (ic.outstanding_count - s->c.outstanding_count)*8
2218 + (-av_log2(ic.range) + av_log2(s->c.range))
2219 ))>>FF_LAMBDA_SHIFT;
2221 // assert(score==256*256*256*64-1);
2222 assert(iscore < 255*255*256 + s->lambda2*10);
2223 assert(iscore >= 0);
2224 assert(l>=0 && l<=255);
2225 assert(pl>=0 && pl<=255);
2228 int varc= iscore >> 8;
2229 int vard= score >> 8;
2230 if (vard <= 64 || vard < varc)
2231 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
2233 c->scene_change_score+= s->m.qscale;
2236 if(level!=s->block_max_depth){
2237 put_rac(&s->c, &s->block_state[4 + s_context], 0);
2238 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
2239 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
2240 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
2241 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
2242 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
2244 if(score2 < score && score2 < iscore)
2249 memcpy(pbbak, i_buffer, i_len);
2251 s->c.bytestream_start= pbbak_start;
2252 s->c.bytestream= pbbak + i_len;
2253 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
2254 memcpy(s->block_state, i_state, sizeof(s->block_state));
2257 memcpy(pbbak, p_buffer, p_len);
2259 s->c.bytestream_start= pbbak_start;
2260 s->c.bytestream= pbbak + p_len;
2261 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
2262 memcpy(s->block_state, p_state, sizeof(s->block_state));
2267 static void decode_q_branch(SnowContext *s, int level, int x, int y){
2268 const int w= s->b_width << s->block_max_depth;
2269 const int rem_depth= s->block_max_depth - level;
2270 const int index= (x + y*w) << rem_depth;
2271 static BlockNode null_block= { //FIXME add border maybe
2272 .color= {128,128,128},
2278 int trx= (x+1)<<rem_depth;
2279 BlockNode *left = x ? &s->block[index-1] : &null_block;
2280 BlockNode *top = y ? &s->block[index-w] : &null_block;
2281 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2282 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2283 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2286 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);
2290 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
2292 int l = left->color[0];
2293 int cb= left->color[1];
2294 int cr= left->color[2];
2295 int mx= mid_pred(left->mx, top->mx, tr->mx);
2296 int my= mid_pred(left->my, top->my, tr->my);
2297 int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
2298 int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
2300 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
2303 l += get_symbol(&s->c, &s->block_state[32], 1);
2304 cb+= get_symbol(&s->c, &s->block_state[64], 1);
2305 cr+= get_symbol(&s->c, &s->block_state[96], 1);
2307 mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
2308 my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
2310 set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
2312 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
2313 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
2314 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
2315 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
2319 static void encode_blocks(SnowContext *s){
2325 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
2326 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2330 encode_q_branch(s, 0, x, y);
2335 static void decode_blocks(SnowContext *s){
2342 decode_q_branch(s, 0, x, y);
2347 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){
2350 for(y=0; y < b_h+5; y++){
2351 for(x=0; x < b_w; x++){
2358 // int am= 9*(a1+a2) - (a0+a3);
2359 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2360 // int am= 18*(a2+a3) - 2*(a1+a4);
2361 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2362 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2364 // if(b_w==16) am= 8*(a1+a2);
2366 if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8;
2367 else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2369 /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
2370 if(am&(~255)) am= ~(am>>31);
2374 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
2375 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
2376 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
2377 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2382 tmp -= (b_h+5)*stride;
2384 for(y=0; y < b_h; y++){
2385 for(x=0; x < b_w; x++){
2386 int a0= tmp[x + 0*stride];
2387 int a1= tmp[x + 1*stride];
2388 int a2= tmp[x + 2*stride];
2389 int a3= tmp[x + 3*stride];
2390 int a4= tmp[x + 4*stride];
2391 int a5= tmp[x + 5*stride];
2392 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2393 // int am= 18*(a2+a3) - 2*(a1+a4);
2394 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2395 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
2397 // if(b_w==16) am= 8*(a1+a2);
2399 if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8;
2400 else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
2402 if(am&(~255)) am= ~(am>>31);
2405 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
2406 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2407 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2408 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2413 STOP_TIMER("mc_block")
2416 #define mca(dx,dy,b_w)\
2417 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
2418 uint8_t tmp[stride*(b_w+5)];\
2420 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2432 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){
2435 const int color= block->color[plane_index];
2436 for(y=0; y < b_h; y++){
2437 for(x=0; x < b_w; x++){
2438 dst[x + y*stride]= color;
2442 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2443 int mx= block->mx*scale;
2444 int my= block->my*scale;
2445 const int dx= mx&15;
2446 const int dy= my&15;
2449 src += sx + sy*stride;
2450 if( (unsigned)sx >= w - b_w - 4
2451 || (unsigned)sy >= h - b_h - 4){
2452 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2455 if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16))
2456 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2458 s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2462 static always_inline int same_block(BlockNode *a, BlockNode *b){
2463 return !((a->mx - b->mx) | (a->my - b->my) | a->type | b->type);
2466 //FIXME name clenup (b_w, block_w, b_width stuff)
2467 static always_inline void add_yblock_buffered(SnowContext *s, slice_buffer * sb, DWTELEM *old_dst, uint8_t *dst8, uint8_t *src, uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int plane_index){
2468 DWTELEM * dst = NULL;
2469 const int b_width = s->b_width << s->block_max_depth;
2470 const int b_height= s->b_height << s->block_max_depth;
2471 const int b_stride= b_width;
2472 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2473 BlockNode *rt= lt+1;
2474 BlockNode *lb= lt+b_stride;
2475 BlockNode *rb= lb+1;
2477 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2478 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2485 }else if(b_x + 1 >= b_width){
2492 }else if(b_y + 1 >= b_height){
2497 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2501 }else if(src_x + b_w > w){
2505 obmc -= src_y*obmc_stride;
2508 }else if(src_y + b_h> h){
2512 if(b_w<=0 || b_h<=0) return;
2514 assert(src_stride > 2*MB_SIZE + 5);
2515 // old_dst += src_x + src_y*dst_stride;
2516 dst8+= src_x + src_y*src_stride;
2517 // src += src_x + src_y*src_stride;
2519 ptmp= tmp + 3*tmp_step;
2522 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2524 if(same_block(lt, rt)){
2529 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2532 if(same_block(lt, lb)){
2534 }else if(same_block(rt, lb)){
2539 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2542 if(same_block(lt, rb) ){
2544 }else if(same_block(rt, rb)){
2546 }else if(same_block(lb, rb)){
2550 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2553 for(y=0; y<b_h; y++){
2554 for(x=0; x<b_w; x++){
2555 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2556 if(add) dst[x + y*dst_stride] += v;
2557 else dst[x + y*dst_stride] -= v;
2560 for(y=0; y<b_h; y++){
2561 uint8_t *obmc2= obmc + (obmc_stride>>1);
2562 for(x=0; x<b_w; x++){
2563 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2564 if(add) dst[x + y*dst_stride] += v;
2565 else dst[x + y*dst_stride] -= v;
2568 for(y=0; y<b_h; y++){
2569 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2570 for(x=0; x<b_w; x++){
2571 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2572 if(add) dst[x + y*dst_stride] += v;
2573 else dst[x + y*dst_stride] -= v;
2576 for(y=0; y<b_h; y++){
2577 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2578 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2579 for(x=0; x<b_w; x++){
2580 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2581 if(add) dst[x + y*dst_stride] += v;
2582 else dst[x + y*dst_stride] -= v;
2590 for(y=0; y<b_h; y++){
2591 //FIXME ugly missue of obmc_stride
2592 uint8_t *obmc1= obmc + y*obmc_stride;
2593 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2594 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2595 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2596 dst = slice_buffer_get_line(sb, src_y + y);
2597 for(x=0; x<b_w; x++){
2598 int v= obmc1[x] * block[3][x + y*src_stride]
2599 +obmc2[x] * block[2][x + y*src_stride]
2600 +obmc3[x] * block[1][x + y*src_stride]
2601 +obmc4[x] * block[0][x + y*src_stride];
2603 v <<= 8 - LOG2_OBMC_MAX;
2605 v += 1<<(7 - FRAC_BITS);
2606 v >>= 8 - FRAC_BITS;
2609 // v += old_dst[x + y*dst_stride];
2610 v += dst[x + src_x];
2611 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2612 if(v&(~255)) v= ~(v>>31);
2613 dst8[x + y*src_stride] = v;
2615 // old_dst[x + y*dst_stride] -= v;
2616 dst[x + src_x] -= v;
2620 STOP_TIMER("Inner add y block")
2625 //FIXME name clenup (b_w, block_w, b_width stuff)
2626 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){
2627 const int b_width = s->b_width << s->block_max_depth;
2628 const int b_height= s->b_height << s->block_max_depth;
2629 const int b_stride= b_width;
2630 BlockNode *lt= &s->block[b_x + b_y*b_stride];
2631 BlockNode *rt= lt+1;
2632 BlockNode *lb= lt+b_stride;
2633 BlockNode *rb= lb+1;
2635 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2636 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2643 }else if(b_x + 1 >= b_width){
2650 }else if(b_y + 1 >= b_height){
2655 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2659 }else if(src_x + b_w > w){
2663 obmc -= src_y*obmc_stride;
2666 }else if(src_y + b_h> h){
2670 if(b_w<=0 || b_h<=0) return;
2672 assert(src_stride > 2*MB_SIZE + 5);
2673 dst += src_x + src_y*dst_stride;
2674 dst8+= src_x + src_y*src_stride;
2675 // src += src_x + src_y*src_stride;
2677 ptmp= tmp + 3*tmp_step;
2680 pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2682 if(same_block(lt, rt)){
2687 pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2690 if(same_block(lt, lb)){
2692 }else if(same_block(rt, lb)){
2697 pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2700 if(same_block(lt, rb) ){
2702 }else if(same_block(rt, rb)){
2704 }else if(same_block(lb, rb)){
2708 pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2711 for(y=0; y<b_h; y++){
2712 for(x=0; x<b_w; x++){
2713 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2714 if(add) dst[x + y*dst_stride] += v;
2715 else dst[x + y*dst_stride] -= v;
2718 for(y=0; y<b_h; y++){
2719 uint8_t *obmc2= obmc + (obmc_stride>>1);
2720 for(x=0; x<b_w; x++){
2721 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2722 if(add) dst[x + y*dst_stride] += v;
2723 else dst[x + y*dst_stride] -= v;
2726 for(y=0; y<b_h; y++){
2727 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2728 for(x=0; x<b_w; x++){
2729 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2730 if(add) dst[x + y*dst_stride] += v;
2731 else dst[x + y*dst_stride] -= v;
2734 for(y=0; y<b_h; y++){
2735 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2736 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2737 for(x=0; x<b_w; x++){
2738 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2739 if(add) dst[x + y*dst_stride] += v;
2740 else dst[x + y*dst_stride] -= v;
2744 for(y=0; y<b_h; y++){
2745 //FIXME ugly missue of obmc_stride
2746 uint8_t *obmc1= obmc + y*obmc_stride;
2747 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2748 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2749 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2750 for(x=0; x<b_w; x++){
2751 int v= obmc1[x] * block[3][x + y*src_stride]
2752 +obmc2[x] * block[2][x + y*src_stride]
2753 +obmc3[x] * block[1][x + y*src_stride]
2754 +obmc4[x] * block[0][x + y*src_stride];
2756 v <<= 8 - LOG2_OBMC_MAX;
2758 v += 1<<(7 - FRAC_BITS);
2759 v >>= 8 - FRAC_BITS;
2762 v += dst[x + y*dst_stride];
2763 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2764 if(v&(~255)) v= ~(v>>31);
2765 dst8[x + y*src_stride] = v;
2767 dst[x + y*dst_stride] -= v;
2774 static always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){
2775 Plane *p= &s->plane[plane_index];
2776 const int mb_w= s->b_width << s->block_max_depth;
2777 const int mb_h= s->b_height << s->block_max_depth;
2779 int block_size = MB_SIZE >> s->block_max_depth;
2780 int block_w = plane_index ? block_size/2 : block_size;
2781 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2782 int obmc_stride= plane_index ? block_size : 2*block_size;
2783 int ref_stride= s->current_picture.linesize[plane_index];
2784 uint8_t *ref = s->last_picture.data[plane_index];
2785 uint8_t *dst8= s->current_picture.data[plane_index];
2790 if(s->keyframe || (s->avctx->debug&512)){
2795 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2797 // DWTELEM * line = slice_buffer_get_line(sb, y);
2798 DWTELEM * line = sb->line[y];
2801 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2802 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2804 if(v&(~255)) v= ~(v>>31);
2805 dst8[x + y*ref_stride]= v;
2809 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2811 // DWTELEM * line = slice_buffer_get_line(sb, y);
2812 DWTELEM * line = sb->line[y];
2815 line[x] -= 128 << FRAC_BITS;
2816 // buf[x + y*w]-= 128<<FRAC_BITS;
2824 for(mb_x=0; mb_x<=mb_w; mb_x++){
2827 add_yblock_buffered(s, sb, old_buffer, dst8, ref, obmc,
2828 block_w*mb_x - block_w/2,
2829 block_w*mb_y - block_w/2,
2832 w, ref_stride, obmc_stride,
2836 STOP_TIMER("add_yblock")
2839 STOP_TIMER("predict_slice")
2842 static always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){
2843 Plane *p= &s->plane[plane_index];
2844 const int mb_w= s->b_width << s->block_max_depth;
2845 const int mb_h= s->b_height << s->block_max_depth;
2847 int block_size = MB_SIZE >> s->block_max_depth;
2848 int block_w = plane_index ? block_size/2 : block_size;
2849 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2850 int obmc_stride= plane_index ? block_size : 2*block_size;
2851 int ref_stride= s->current_picture.linesize[plane_index];
2852 uint8_t *ref = s->last_picture.data[plane_index];
2853 uint8_t *dst8= s->current_picture.data[plane_index];
2858 if(s->keyframe || (s->avctx->debug&512)){
2863 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2865 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2867 if(v&(~255)) v= ~(v>>31);
2868 dst8[x + y*ref_stride]= v;
2872 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2874 buf[x + y*w]-= 128<<FRAC_BITS;
2882 for(mb_x=0; mb_x<=mb_w; mb_x++){
2885 add_yblock(s, buf, dst8, ref, obmc,
2886 block_w*mb_x - block_w/2,
2887 block_w*mb_y - block_w/2,
2890 w, ref_stride, obmc_stride,
2894 STOP_TIMER("add_yblock")
2897 STOP_TIMER("predict_slice")
2900 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2901 const int mb_h= s->b_height << s->block_max_depth;
2903 for(mb_y=0; mb_y<=mb_h; mb_y++)
2904 predict_slice(s, buf, plane_index, add, mb_y);
2907 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
2908 const int level= b->level;
2909 const int w= b->width;
2910 const int h= b->height;
2911 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
2912 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
2913 int x,y, thres1, thres2;
2916 if(s->qlog == LOSSLESS_QLOG) return;
2918 bias= bias ? 0 : (3*qmul)>>3;
2919 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
2925 int i= src[x + y*stride];
2927 if((unsigned)(i+thres1) > thres2){
2930 i/= qmul; //FIXME optimize
2931 src[x + y*stride]= i;
2935 i/= qmul; //FIXME optimize
2936 src[x + y*stride]= -i;
2939 src[x + y*stride]= 0;
2945 int i= src[x + y*stride];
2947 if((unsigned)(i+thres1) > thres2){
2950 i= (i + bias) / qmul; //FIXME optimize
2951 src[x + y*stride]= i;
2955 i= (i + bias) / qmul; //FIXME optimize
2956 src[x + y*stride]= -i;
2959 src[x + y*stride]= 0;
2963 if(level+1 == s->spatial_decomposition_count){
2964 // STOP_TIMER("quantize")
2968 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
2969 const int w= b->width;
2970 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
2971 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
2972 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
2976 if(s->qlog == LOSSLESS_QLOG) return;
2978 for(y=start_y; y<end_y; y++){
2979 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
2980 DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
2984 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
2986 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
2990 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
2991 STOP_TIMER("dquant")
2995 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
2996 const int w= b->width;
2997 const int h= b->height;
2998 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
2999 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3000 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3004 if(s->qlog == LOSSLESS_QLOG) return;
3008 int i= src[x + y*stride];
3010 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3012 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
3016 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3017 STOP_TIMER("dquant")
3021 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3022 const int w= b->width;
3023 const int h= b->height;
3026 for(y=h-1; y>=0; y--){
3027 for(x=w-1; x>=0; x--){
3028 int i= x + y*stride;
3032 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3033 else src[i] -= src[i - 1];
3035 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3036 else src[i] -= src[i - 1];
3039 if(y) src[i] -= src[i - stride];
3045 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
3046 const int w= b->width;
3055 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3057 for(y=start_y; y<end_y; y++){
3059 // line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3060 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3064 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
3065 else line[x] += line[x - 1];
3067 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
3068 else line[x] += line[x - 1];
3071 if(y) line[x] += prev[x];
3076 // STOP_TIMER("correlate")
3079 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3080 const int w= b->width;
3081 const int h= b->height;
3086 int i= x + y*stride;
3090 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3091 else src[i] += src[i - 1];
3093 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3094 else src[i] += src[i - 1];
3097 if(y) src[i] += src[i - stride];
3103 static void encode_header(SnowContext *s){
3104 int plane_index, level, orientation;
3107 memset(kstate, MID_STATE, sizeof(kstate));
3109 put_rac(&s->c, kstate, s->keyframe);
3110 if(s->keyframe || s->always_reset)
3113 put_symbol(&s->c, s->header_state, s->version, 0);
3114 put_rac(&s->c, s->header_state, s->always_reset);
3115 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
3116 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
3117 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
3118 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
3119 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
3120 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
3121 put_rac(&s->c, s->header_state, s->spatial_scalability);
3122 // put_rac(&s->c, s->header_state, s->rate_scalability);
3124 for(plane_index=0; plane_index<2; plane_index++){
3125 for(level=0; level<s->spatial_decomposition_count; level++){
3126 for(orientation=level ? 1:0; orientation<4; orientation++){
3127 if(orientation==2) continue;
3128 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
3133 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
3134 put_symbol(&s->c, s->header_state, s->qlog, 1);
3135 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
3136 put_symbol(&s->c, s->header_state, s->qbias, 1);
3137 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
3140 static int decode_header(SnowContext *s){
3141 int plane_index, level, orientation;
3144 memset(kstate, MID_STATE, sizeof(kstate));
3146 s->keyframe= get_rac(&s->c, kstate);
3147 if(s->keyframe || s->always_reset)
3150 s->version= get_symbol(&s->c, s->header_state, 0);
3152 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
3155 s->always_reset= get_rac(&s->c, s->header_state);
3156 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3157 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3158 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3159 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
3160 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
3161 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
3162 s->spatial_scalability= get_rac(&s->c, s->header_state);
3163 // s->rate_scalability= get_rac(&s->c, s->header_state);
3165 for(plane_index=0; plane_index<3; plane_index++){
3166 for(level=0; level<s->spatial_decomposition_count; level++){
3167 for(orientation=level ? 1:0; orientation<4; orientation++){
3169 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
3170 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
3171 else q= get_symbol(&s->c, s->header_state, 1);
3172 s->plane[plane_index].band[level][orientation].qlog= q;
3178 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3179 if(s->spatial_decomposition_type > 2){
3180 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
3184 s->qlog= get_symbol(&s->c, s->header_state, 1);
3185 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
3186 s->qbias= get_symbol(&s->c, s->header_state, 1);
3187 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
3188 if(s->block_max_depth > 1){
3189 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);
3190 s->block_max_depth= 0;
3197 static void init_qexp(){
3201 for(i=0; i<QROOT; i++){
3203 v *= pow(2, 1.0 / QROOT);
3207 static int common_init(AVCodecContext *avctx){
3208 SnowContext *s = avctx->priv_data;
3210 int level, orientation, plane_index, dec;
3214 dsputil_init(&s->dsp, avctx);
3217 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
3218 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
3219 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
3220 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
3221 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
3222 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
3241 #define mcfh(dx,dy)\
3242 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
3243 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
3244 mc_block_hpel ## dx ## dy ## 16;\
3245 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
3246 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
3247 mc_block_hpel ## dx ## dy ## 8;
3257 dec= s->spatial_decomposition_count= 5;
3258 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
3260 s->chroma_h_shift= 1; //FIXME XXX
3261 s->chroma_v_shift= 1;
3263 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
3265 width= s->avctx->width;
3266 height= s->avctx->height;
3268 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
3270 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
3271 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
3273 for(plane_index=0; plane_index<3; plane_index++){
3274 int w= s->avctx->width;
3275 int h= s->avctx->height;
3278 w>>= s->chroma_h_shift;
3279 h>>= s->chroma_v_shift;
3281 s->plane[plane_index].width = w;
3282 s->plane[plane_index].height= h;
3283 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
3284 for(level=s->spatial_decomposition_count-1; level>=0; level--){
3285 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3286 SubBand *b= &s->plane[plane_index].band[level][orientation];
3288 b->buf= s->spatial_dwt_buffer;
3290 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
3291 b->width = (w + !(orientation&1))>>1;
3292 b->height= (h + !(orientation>1))>>1;
3294 b->stride_line = 1 << (s->spatial_decomposition_count - level);
3295 b->buf_x_offset = 0;
3296 b->buf_y_offset = 0;
3300 b->buf_x_offset = (w+1)>>1;
3303 b->buf += b->stride>>1;
3304 b->buf_y_offset = b->stride_line >> 1;
3308 b->parent= &s->plane[plane_index].band[level-1][orientation];
3309 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff));
3318 width= s->width= avctx->width;
3319 height= s->height= avctx->height;
3321 assert(width && height);
3323 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
3329 static void calculate_vissual_weight(SnowContext *s, Plane *p){
3330 int width = p->width;
3331 int height= p->height;
3332 int level, orientation, x, y;
3334 for(level=0; level<s->spatial_decomposition_count; level++){
3335 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3336 SubBand *b= &p->band[level][orientation];
3337 DWTELEM *buf= b->buf;
3340 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
3341 buf[b->width/2 + b->height/2*b->stride]= 256*256;
3342 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3343 for(y=0; y<height; y++){
3344 for(x=0; x<width; x++){
3345 int64_t d= s->spatial_dwt_buffer[x + y*width];
3350 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
3351 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
3356 static int encode_init(AVCodecContext *avctx)
3358 SnowContext *s = avctx->priv_data;
3361 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
3362 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n"
3363 "use vstrict=-2 / -strict -2 to use it anyway\n");
3373 s->m.flags = avctx->flags;
3374 s->m.bit_rate= avctx->bit_rate;
3376 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
3377 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3378 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3379 h263_encode_init(&s->m); //mv_penalty
3381 if(avctx->flags&CODEC_FLAG_PASS1){
3382 if(!avctx->stats_out)
3383 avctx->stats_out = av_mallocz(256);
3385 if(avctx->flags&CODEC_FLAG_PASS2){
3386 if(ff_rate_control_init(&s->m) < 0)
3390 for(plane_index=0; plane_index<3; plane_index++){
3391 calculate_vissual_weight(s, &s->plane[plane_index]);
3395 avctx->coded_frame= &s->current_picture;
3396 switch(avctx->pix_fmt){
3397 // case PIX_FMT_YUV444P:
3398 // case PIX_FMT_YUV422P:
3399 case PIX_FMT_YUV420P:
3401 // case PIX_FMT_YUV411P:
3402 // case PIX_FMT_YUV410P:
3403 s->colorspace_type= 0;
3405 /* case PIX_FMT_RGBA32:
3409 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
3412 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
3413 s->chroma_h_shift= 1;
3414 s->chroma_v_shift= 1;
3418 static int frame_start(SnowContext *s){
3420 int w= s->avctx->width; //FIXME round up to x16 ?
3421 int h= s->avctx->height;
3423 if(s->current_picture.data[0]){
3424 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
3425 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
3426 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
3429 tmp= s->last_picture;
3430 s->last_picture= s->current_picture;
3431 s->current_picture= tmp;
3433 s->current_picture.reference= 1;
3434 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
3435 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
3442 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
3443 SnowContext *s = avctx->priv_data;
3444 RangeCoder * const c= &s->c;
3445 AVFrame *pict = data;
3446 const int width= s->avctx->width;
3447 const int height= s->avctx->height;
3448 int level, orientation, plane_index;
3450 ff_init_range_encoder(c, buf, buf_size);
3451 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3453 s->input_picture = *pict;
3455 if(avctx->flags&CODEC_FLAG_PASS2){
3457 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
3458 s->keyframe= pict->pict_type==FF_I_TYPE;
3459 s->m.picture_number= avctx->frame_number;
3460 pict->quality= ff_rate_estimate_qscale(&s->m, 0);
3462 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
3463 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
3467 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
3469 s->qlog += 61*QROOT/8;
3471 s->qlog= LOSSLESS_QLOG;
3475 s->current_picture.key_frame= s->keyframe;
3477 s->m.current_picture_ptr= &s->m.current_picture;
3478 if(pict->pict_type == P_TYPE){
3479 int block_width = (width +15)>>4;
3480 int block_height= (height+15)>>4;
3481 int stride= s->current_picture.linesize[0];
3483 assert(s->current_picture.data[0]);
3484 assert(s->last_picture.data[0]);
3486 s->m.avctx= s->avctx;
3487 s->m.current_picture.data[0]= s->current_picture.data[0];
3488 s->m. last_picture.data[0]= s-> last_picture.data[0];
3489 s->m. new_picture.data[0]= s-> input_picture.data[0];
3490 s->m. last_picture_ptr= &s->m. last_picture;
3492 s->m. last_picture.linesize[0]=
3493 s->m. new_picture.linesize[0]=
3494 s->m.current_picture.linesize[0]= stride;
3495 s->m.uvlinesize= s->current_picture.linesize[1];
3497 s->m.height= height;
3498 s->m.mb_width = block_width;
3499 s->m.mb_height= block_height;
3500 s->m.mb_stride= s->m.mb_width+1;
3501 s->m.b8_stride= 2*s->m.mb_width+1;
3503 s->m.pict_type= pict->pict_type;
3504 s->m.me_method= s->avctx->me_method;
3505 s->m.me.scene_change_score=0;
3506 s->m.flags= s->avctx->flags;
3507 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
3508 s->m.out_format= FMT_H263;
3509 s->m.unrestricted_mv= 1;
3511 s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
3512 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
3513 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
3515 s->m.dsp= s->dsp; //move
3521 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
3524 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start);
3526 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits;
3528 for(plane_index=0; plane_index<3; plane_index++){
3529 Plane *p= &s->plane[plane_index];
3533 // int bits= put_bits_count(&s->c.pb);
3536 if(pict->data[plane_index]) //FIXME gray hack
3539 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
3542 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
3545 && pict->pict_type == P_TYPE
3546 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
3547 ff_init_range_encoder(c, buf, buf_size);
3548 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3549 pict->pict_type= FF_I_TYPE;
3555 if(s->qlog == LOSSLESS_QLOG){
3558 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS;
3563 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3565 for(level=0; level<s->spatial_decomposition_count; level++){
3566 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3567 SubBand *b= &p->band[level][orientation];
3569 quantize(s, b, b->buf, b->stride, s->qbias);
3571 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
3572 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
3573 assert(b->parent==NULL || b->parent->stride == b->stride*2);
3575 correlate(s, b, b->buf, b->stride, 1, 0);
3578 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
3580 for(level=0; level<s->spatial_decomposition_count; level++){
3581 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3582 SubBand *b= &p->band[level][orientation];
3584 dequantize(s, b, b->buf, b->stride);
3588 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3589 if(s->qlog == LOSSLESS_QLOG){
3592 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
3597 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3598 STOP_TIMER("pred-conv")}
3599 if(s->avctx->flags&CODEC_FLAG_PSNR){
3602 if(pict->data[plane_index]) //FIXME gray hack
3605 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];
3609 s->avctx->error[plane_index] += error;
3610 s->current_picture.error[plane_index] = error;
3614 if(s->last_picture.data[0])
3615 avctx->release_buffer(avctx, &s->last_picture);
3617 s->current_picture.coded_picture_number = avctx->frame_number;
3618 s->current_picture.pict_type = pict->pict_type;
3619 s->current_picture.quality = pict->quality;
3620 if(avctx->flags&CODEC_FLAG_PASS1){
3621 s->m.p_tex_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits - s->m.mv_bits;
3622 s->m.current_picture.display_picture_number =
3623 s->m.current_picture.coded_picture_number = avctx->frame_number;
3624 s->m.pict_type = pict->pict_type;
3625 s->m.current_picture.quality = pict->quality;
3626 ff_write_pass1_stats(&s->m);
3628 if(avctx->flags&CODEC_FLAG_PASS2){
3629 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
3634 return ff_rac_terminate(c);
3637 static void common_end(SnowContext *s){
3638 int plane_index, level, orientation;
3640 av_freep(&s->spatial_dwt_buffer);
3642 av_freep(&s->m.me.scratchpad);
3643 av_freep(&s->m.me.map);
3644 av_freep(&s->m.me.score_map);
3646 av_freep(&s->block);
3648 for(plane_index=0; plane_index<3; plane_index++){
3649 for(level=s->spatial_decomposition_count-1; level>=0; level--){
3650 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3651 SubBand *b= &s->plane[plane_index].band[level][orientation];
3653 av_freep(&b->x_coeff);
3659 static int encode_end(AVCodecContext *avctx)
3661 SnowContext *s = avctx->priv_data;
3664 av_free(avctx->stats_out);
3669 static int decode_init(AVCodecContext *avctx)
3671 SnowContext *s = avctx->priv_data;
3674 avctx->pix_fmt= PIX_FMT_YUV420P;
3678 block_size = MB_SIZE >> s->block_max_depth;
3679 slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 2)) + 1, s->plane[0].width, s->spatial_dwt_buffer);
3684 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
3685 SnowContext *s = avctx->priv_data;
3686 RangeCoder * const c= &s->c;
3688 AVFrame *picture = data;
3689 int level, orientation, plane_index;
3691 ff_init_range_decoder(c, buf, buf_size);
3692 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3694 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
3696 if(!s->block) alloc_blocks(s);
3699 //keyframe flag dupliaction mess FIXME
3700 if(avctx->debug&FF_DEBUG_PICT_INFO)
3701 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
3705 for(plane_index=0; plane_index<3; plane_index++){
3706 Plane *p= &s->plane[plane_index];
3710 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
3712 if(s->avctx->debug&2048){
3713 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
3714 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3718 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
3719 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
3725 for(level=0; level<s->spatial_decomposition_count; level++){
3726 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3727 SubBand *b= &p->band[level][orientation];
3728 unpack_coeffs(s, b, b->parent, orientation);
3731 STOP_TIMER("unpack coeffs");
3735 const int mb_h= s->b_height << s->block_max_depth;
3736 const int block_size = MB_SIZE >> s->block_max_depth;
3737 const int block_w = plane_index ? block_size/2 : block_size;
3739 dwt_compose_t cs[MAX_DECOMPOSITIONS];
3744 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count);
3745 for(mb_y=0; mb_y<=mb_h; mb_y++){
3747 int slice_starty = block_w*mb_y;
3748 int slice_h = block_w*(mb_y+1);
3749 if (!(s->keyframe || s->avctx->debug&512)){
3750 slice_starty = FFMAX(0, slice_starty - (block_w >> 1));
3751 slice_h -= (block_w >> 1);
3756 for(level=0; level<s->spatial_decomposition_count; level++){
3757 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3758 SubBand *b= &p->band[level][orientation];
3761 int our_mb_start = mb_y;
3762 int our_mb_end = (mb_y + 1);
3763 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2: 0);
3764 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2);
3765 if (!(s->keyframe || s->avctx->debug&512)){
3766 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level)));
3767 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level)));
3769 start_y = FFMIN(b->height, start_y);
3770 end_y = FFMIN(b->height, end_y);
3772 if (start_y != end_y){
3773 if (orientation == 0){
3774 SubBand * correlate_band = &p->band[0][0];
3775 int correlate_end_y = FFMIN(b->height, end_y + 1);
3776 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
3777 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
3778 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
3779 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y);
3782 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
3786 STOP_TIMER("decode_subband_slice");
3790 for(; yd<slice_h; yd+=4){
3791 ff_spatial_idwt_buffered_slice(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd);
3793 STOP_TIMER("idwt slice");}
3796 if(s->qlog == LOSSLESS_QLOG){
3797 for(; yq<slice_h && yq<h; yq++){
3798 DWTELEM * line = slice_buffer_get_line(&s->sb, yq);
3800 line[x] <<= FRAC_BITS;
3805 predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y);
3807 y = FFMIN(p->height, slice_starty);
3808 end_y = FFMIN(p->height, slice_h);
3810 slice_buffer_release(&s->sb, y++);
3813 slice_buffer_flush(&s->sb);
3815 STOP_TIMER("idwt + predict_slices")}
3820 if(s->last_picture.data[0])
3821 avctx->release_buffer(avctx, &s->last_picture);
3823 if(!(s->avctx->debug&2048))
3824 *picture= s->current_picture;
3826 *picture= s->mconly_picture;
3828 *data_size = sizeof(AVFrame);
3830 bytes_read= c->bytestream - c->bytestream_start;
3831 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
3836 static int decode_end(AVCodecContext *avctx)
3838 SnowContext *s = avctx->priv_data;
3840 slice_buffer_destroy(&s->sb);
3847 AVCodec snow_decoder = {
3851 sizeof(SnowContext),
3856 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
3860 #ifdef CONFIG_ENCODERS
3861 AVCodec snow_encoder = {
3865 sizeof(SnowContext),
3881 int buffer[2][width*height];
3884 s.spatial_decomposition_count=6;
3885 s.spatial_decomposition_type=1;
3887 printf("testing 5/3 DWT\n");
3888 for(i=0; i<width*height; i++)
3889 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3891 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
3892 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
3894 for(i=0; i<width*height; i++)
3895 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3897 printf("testing 9/7 DWT\n");
3898 s.spatial_decomposition_type=0;
3899 for(i=0; i<width*height; i++)
3900 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3902 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
3903 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
3905 for(i=0; i<width*height; i++)
3906 if(ABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3909 printf("testing AC coder\n");
3910 memset(s.header_state, 0, sizeof(s.header_state));
3911 ff_init_range_encoder(&s.c, buffer[0], 256*256);
3912 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3914 for(i=-256; i<256; i++){
3916 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
3917 STOP_TIMER("put_symbol")
3919 ff_rac_terminate(&s.c);
3921 memset(s.header_state, 0, sizeof(s.header_state));
3922 ff_init_range_decoder(&s.c, buffer[0], 256*256);
3923 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3925 for(i=-256; i<256; i++){
3928 j= get_symbol(&s.c, s.header_state, 1);
3929 STOP_TIMER("get_symbol")
3930 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
3934 int level, orientation, x, y;
3935 int64_t errors[8][4];
3938 memset(errors, 0, sizeof(errors));
3939 s.spatial_decomposition_count=3;
3940 s.spatial_decomposition_type=0;
3941 for(level=0; level<s.spatial_decomposition_count; level++){
3942 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3943 int w= width >> (s.spatial_decomposition_count-level);
3944 int h= height >> (s.spatial_decomposition_count-level);
3945 int stride= width << (s.spatial_decomposition_count-level);
3946 DWTELEM *buf= buffer[0];
3949 if(orientation&1) buf+=w;
3950 if(orientation>1) buf+=stride>>1;
3952 memset(buffer[0], 0, sizeof(int)*width*height);
3953 buf[w/2 + h/2*stride]= 256*256;
3954 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
3955 for(y=0; y<height; y++){
3956 for(x=0; x<width; x++){
3957 int64_t d= buffer[0][x + y*width];
3959 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
3961 if(ABS(height/2-y)<9 && level==2) printf("\n");
3963 error= (int)(sqrt(error)+0.5);
3964 errors[level][orientation]= error;
3965 if(g) g=ff_gcd(g, error);
3969 printf("static int const visual_weight[][4]={\n");
3970 for(level=0; level<s.spatial_decomposition_count; level++){
3972 for(orientation=0; orientation<4; orientation++){
3973 printf("%8lld,", errors[level][orientation]/g);
3981 int w= width >> (s.spatial_decomposition_count-level);
3982 int h= height >> (s.spatial_decomposition_count-level);
3983 int stride= width << (s.spatial_decomposition_count-level);
3984 DWTELEM *buf= buffer[0];
3990 memset(buffer[0], 0, sizeof(int)*width*height);
3992 for(y=0; y<height; y++){
3993 for(x=0; x<width; x++){
3994 int tab[4]={0,2,3,1};
3995 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
3998 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4002 buf[x + y*stride ]=169;
4003 buf[x + y*stride-w]=64;
4006 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
4008 for(y=0; y<height; y++){
4009 for(x=0; x<width; x++){
4010 int64_t d= buffer[0][x + y*width];
4012 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
4014 if(ABS(height/2-y)<9) printf("\n");