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
24 #include "mpegvideo.h"
29 #define MAX_DECOMPOSITIONS 8
33 #define LOSSLESS_QLOG -128
35 static const int8_t quant3[256]={
36 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
53 static const int8_t quant3b[256]={
54 0, 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, 1,
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
63 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
64 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71 static const int8_t quant5[256]={
72 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
73 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
75 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
80 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
81 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
82 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
83 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
84 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
85 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
86 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
89 static const int8_t quant7[256]={
90 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
93 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
94 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
95 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
98 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
99 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
100 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
101 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
102 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
103 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-1,-1,
107 static const int8_t quant9[256]={
108 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
109 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
110 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
111 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
112 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
115 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
116 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
117 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
118 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
119 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
120 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
121 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
122 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
123 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
125 static const int8_t quant11[256]={
126 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
127 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
128 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
129 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
131 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
134 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
135 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
136 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
137 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
138 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
139 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
143 static const int8_t quant13[256]={
144 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
145 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
146 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
147 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
148 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
149 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
150 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
151 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
152 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
153 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
154 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
155 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
156 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-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 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
164 static const uint8_t obmc32[1024]={
165 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,
166 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,
167 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,
168 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,
169 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,
170 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,
171 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,
172 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,
173 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,
174 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,
175 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,
176 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,
177 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,
178 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,
179 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,
180 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,
181 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,
182 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,
183 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,
184 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,
185 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,
186 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,
187 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,
188 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,
189 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,
190 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,
191 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,
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, 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,
194 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,
195 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,
196 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,
199 static const uint8_t obmc16[256]={
200 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
201 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
202 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
203 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
204 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
205 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
206 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
207 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
208 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
209 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
210 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
211 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
212 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
213 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
214 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
215 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
219 static const uint8_t obmc32[1024]={
220 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,
221 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,
222 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,
223 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,
224 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,
225 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,
226 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,
227 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,
228 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,
229 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,
230 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,
231 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,
232 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,
233 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,
234 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,
235 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,
236 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,
237 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,
238 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,
239 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,
240 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,
241 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,
242 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,
243 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,
244 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,
245 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,
246 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,
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 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,
249 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,
250 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,
251 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,
254 static const uint8_t obmc16[256]={
255 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
256 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
257 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
258 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
259 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
260 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
261 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
262 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
263 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
264 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
265 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
266 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
267 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
268 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
269 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
270 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
274 static const uint8_t obmc32[1024]={
275 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,
276 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,
277 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,
278 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,
279 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,
280 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,
281 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,
282 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,
283 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,
284 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,
285 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,
286 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,
287 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,
288 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,
289 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,
290 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,
291 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,
292 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,
293 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,
294 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,
295 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,
296 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,
297 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,
298 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,
299 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,
300 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,
301 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,
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, 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,
304 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,
305 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,
306 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,
309 static const uint8_t obmc16[256]={
310 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
311 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
312 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
313 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
314 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
315 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
316 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
317 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
318 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
319 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
320 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
321 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
322 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
323 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
324 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
325 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
330 typedef struct SubBand{
335 int qlog; ///< log(qscale)/log[2^(1/6)]
337 struct SubBand *parent;
338 uint8_t state[/*7*2*/ 7 + 512][32];
341 typedef struct Plane{
344 SubBand band[MAX_DECOMPOSITIONS][4];
347 typedef struct SnowContext{
348 // 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)
350 AVCodecContext *avctx;
353 AVFrame input_picture;
354 AVFrame current_picture;
355 AVFrame last_picture;
356 AVFrame mconly_picture;
357 // uint8_t q_context[16];
358 uint8_t header_state[32];
361 int spatial_decomposition_type;
362 int temporal_decomposition_type;
363 int spatial_decomposition_count;
364 int temporal_decomposition_count;
365 DWTELEM *spatial_dwt_buffer;
366 DWTELEM *pred_buffer;
370 int spatial_scalability;
374 #define QBIAS_SHIFT 3
375 int b_width; //FIXME remove?
376 int b_height; //FIXME remove?
377 Plane plane[MAX_PLANES];
384 int16_t (*motion_val8)[2];
385 int16_t (*motion_val16)[2];
386 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)
389 #define QEXPSHIFT 7 //FIXME try to change this to 0
390 static const uint8_t qexp[8]={
391 128, 140, 152, 166, 181, 197, 215, 235
392 // 64, 70, 76, 83, 91, 99, 108, 117
393 // 32, 35, 38, 41, 45, 49, 54, 59
394 // 16, 17, 19, 21, 23, 25, 27, 29
395 // 8, 9, 10, 10, 11, 12, 13, 15
398 static inline int mirror(int v, int m){
400 else if(v>m) return 2*m-v;
404 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed){
409 const int e= av_log2(a);
411 const int el= FFMIN(e, 10);
412 put_cabac(c, state+0, 0);
415 put_cabac(c, state+1+i, 1); //1..10
418 put_cabac(c, state+1+9, 1); //1..10
420 put_cabac(c, state+1+FFMIN(i,9), 0);
422 for(i=e-1; i>=el; i--){
423 put_cabac(c, state+22+9, (a>>i)&1); //22..31
426 put_cabac(c, state+22+i, (a>>i)&1); //22..31
430 put_cabac(c, state+11 + el, v < 0); //11..21
433 put_cabac(c, state+0, 0);
436 put_cabac(c, state+1+i, 1); //1..10
438 put_cabac(c, state+1+i, 0);
440 for(i=e-1; i>=0; i--){
441 put_cabac(c, state+22+i, (a>>i)&1); //22..31
445 put_cabac(c, state+11 + e, v < 0); //11..21
448 put_cabac(c, state+1+FFMIN(i,9), 1); //1..10
450 put_cabac(c, state+1+FFMIN(i,9), 0);
452 for(i=e-1; i>=0; i--){
453 put_cabac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
457 put_cabac(c, state+11 + FFMIN(e,10), v < 0); //11..21
461 put_cabac(c, state+0, 1);
465 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed){
466 if(get_cabac(c, state+0))
470 //FIXME try to merge loops with FFMIN() maybe they are equally fast and they are surly cuter
472 if(get_cabac(c, state + 1 + e)==0) // 1..10
478 while(get_cabac(c, state + 1 + 9)) //10
482 for(i=e-1; i>=el; i--){
483 a += a + get_cabac(c, state+22+9); //31
486 a += a + get_cabac(c, state+22+i); //22..31
489 if(is_signed && get_cabac(c, state+11 + el)) //11..21
496 static inline void put_symbol2(CABACContext *c, uint8_t *state, int v, int log2){
498 int r= log2>=0 ? 1<<log2 : 1;
504 put_cabac(c, state+4+log2, 1);
509 put_cabac(c, state+4+log2, 0);
511 for(i=log2-1; i>=0; i--){
512 put_cabac(c, state+31-i, (v>>i)&1);
516 static inline int get_symbol2(CABACContext *c, uint8_t *state, int log2){
518 int r= log2>=0 ? 1<<log2 : 1;
523 while(get_cabac(c, state+4+log2)){
529 for(i=log2-1; i>=0; i--){
530 v+= get_cabac(c, state+31-i)<<i;
536 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){
537 const int mirror_left= !highpass;
538 const int mirror_right= (width&1) ^ highpass;
539 const int w= (width>>1) - 1 + (highpass & width);
542 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
544 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
550 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
554 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
558 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){
559 const int mirror_left= !highpass;
560 const int mirror_right= (width&1) ^ highpass;
561 const int w= (width>>1) - 1 + (highpass & width);
568 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
574 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
577 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
581 int r= 3*2*ref[w*ref_step];
584 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
589 static void inplace_lift(int *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
592 for(x=start; x<width; x+=2){
596 int x2= x + 2*i - n + 1;
598 else if(x2>=width) x2= 2*width-x2-2;
599 sum += coeffs[i]*(int64_t)dst[x2];
601 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
602 else dst[x] += (sum + (1<<shift)/2)>>shift;
606 static void inplace_liftV(int *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
608 for(y=start; y<height; y+=2){
609 for(x=0; x<width; x++){
613 int y2= y + 2*i - n + 1;
615 else if(y2>=height) y2= 2*height-y2-2;
616 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
618 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
619 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
628 #if 0 // more accurate 9/7
631 #define COEFFS1 (int[]){-25987,-25987}
634 #define COEFFS2 (int[]){-27777,-27777}
637 #define COEFFS3 (int[]){28931,28931}
640 #define COEFFS4 (int[]){14533,14533}
644 #define COEFFS1 (int[]){1,-9,-9,1}
647 #define COEFFS2 (int[]){-1,5,5,-1}
660 #define COEFFS1 (int[]){1,1}
663 #define COEFFS2 (int[]){-1,-1}
676 #define COEFFS2 (int[]){-1,-1}
679 #define COEFFS3 (int[]){-1,-1}
682 #define COEFFS4 (int[]){-5,29,29,-5}
687 #define COEFFS1 (int[]){-203,-203}
690 #define COEFFS2 (int[]){-217,-217}
693 #define COEFFS3 (int[]){113,113}
696 #define COEFFS4 (int[]){227,227}
704 #define COEFFS2 (int[]){-1,-1}
707 #define COEFFS3 (int[]){-1,-1}
710 #define COEFFS4 (int[]){3,3}
714 #define COEFFS1 (int[]){1,-9,-9,1}
717 #define COEFFS2 (int[]){1,1}
727 #define COEFFS1 (int[]){1,-9,-9,1}
730 #define COEFFS2 (int[]){-1,5,5,-1}
738 static void horizontal_decomposeX(int *b, int width){
740 const int width2= width>>1;
741 const int w2= (width+1)>>1;
744 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
745 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
746 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
747 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
749 for(x=0; x<width2; x++){
751 temp[x+w2]= b[2*x + 1];
755 memcpy(b, temp, width*sizeof(int));
758 static void horizontal_composeX(int *b, int width){
760 const int width2= width>>1;
762 const int w2= (width+1)>>1;
764 memcpy(temp, b, width*sizeof(int));
765 for(x=0; x<width2; x++){
767 b[2*x + 1]= temp[x+w2];
772 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
773 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
774 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
775 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
778 static void spatial_decomposeX(int *buffer, int width, int height, int stride){
781 for(y=0; y<height; y++){
782 for(x=0; x<width; x++){
783 buffer[y*stride + x] *= SCALEX;
787 for(y=0; y<height; y++){
788 horizontal_decomposeX(buffer + y*stride, width);
791 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
792 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
793 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
794 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
797 static void spatial_composeX(int *buffer, int width, int height, int stride){
800 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
801 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
802 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
803 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
805 for(y=0; y<height; y++){
806 horizontal_composeX(buffer + y*stride, width);
809 for(y=0; y<height; y++){
810 for(x=0; x<width; x++){
811 buffer[y*stride + x] /= SCALEX;
816 static void horizontal_decompose53i(int *b, int width){
818 const int width2= width>>1;
820 const int w2= (width+1)>>1;
822 for(x=0; x<width2; x++){
824 temp[x+w2]= b[2*x + 1];
836 for(x=1; x+1<width2; x+=2){
840 A2 += (A1 + A3 + 2)>>2;
844 A1= temp[x+1+width2];
847 A4 += (A1 + A3 + 2)>>2;
853 A2 += (A1 + A3 + 2)>>2;
857 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
858 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
862 static void vertical_decompose53iH0(int *b0, int *b1, int *b2, int width){
865 for(i=0; i<width; i++){
866 b1[i] -= (b0[i] + b2[i])>>1;
870 static void vertical_decompose53iL0(int *b0, int *b1, int *b2, int width){
873 for(i=0; i<width; i++){
874 b1[i] += (b0[i] + b2[i] + 2)>>2;
878 static void spatial_decompose53i(int *buffer, int width, int height, int stride){
880 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
881 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
883 for(y=-2; y<height; y+=2){
884 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
885 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
888 if(b1 <= b3) horizontal_decompose53i(b2, width);
889 if(y+2 < height) horizontal_decompose53i(b3, width);
890 STOP_TIMER("horizontal_decompose53i")}
893 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
894 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
895 STOP_TIMER("vertical_decompose53i*")}
971 static void horizontal_decompose97i(int *b, int width){
973 const int w2= (width+1)>>1;
975 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
976 lift (temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
977 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
978 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
982 static void vertical_decompose97iH0(int *b0, int *b1, int *b2, int width){
985 for(i=0; i<width; i++){
986 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
990 static void vertical_decompose97iH1(int *b0, int *b1, int *b2, int width){
993 for(i=0; i<width; i++){
995 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
997 int r= 3*(b0[i] + b2[i]);
1000 b1[i] += (r+W_CO)>>W_CS;
1005 static void vertical_decompose97iL0(int *b0, int *b1, int *b2, int width){
1008 for(i=0; i<width; i++){
1009 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1013 static void vertical_decompose97iL1(int *b0, int *b1, int *b2, int width){
1016 for(i=0; i<width; i++){
1017 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1021 static void spatial_decompose97i(int *buffer, int width, int height, int stride){
1023 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1024 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1025 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1026 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1028 for(y=-4; y<height; y+=2){
1029 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1030 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1033 if(b3 <= b5) horizontal_decompose97i(b4, width);
1034 if(y+4 < height) horizontal_decompose97i(b5, width);
1036 STOP_TIMER("horizontal_decompose97i")
1040 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1041 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1042 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1043 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1046 STOP_TIMER("vertical_decompose97i")
1056 static void spatial_dwt(SnowContext *s, int *buffer, int width, int height, int stride){
1059 for(level=0; level<s->spatial_decomposition_count; level++){
1060 switch(s->spatial_decomposition_type){
1061 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1062 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1063 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1068 static void horizontal_compose53i(int *b, int width){
1070 const int width2= width>>1;
1071 const int w2= (width+1)>>1;
1082 for(x=1; x+1<width2; x+=2){
1086 A2 += (A1 + A3 + 2)>>2;
1090 A1= temp[x+1+width2];
1093 A4 += (A1 + A3 + 2)>>2;
1099 A2 += (A1 + A3 + 2)>>2;
1103 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1104 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1106 for(x=0; x<width2; x++){
1108 b[2*x + 1]= temp[x+w2];
1114 static void vertical_compose53iH0(int *b0, int *b1, int *b2, int width){
1117 for(i=0; i<width; i++){
1118 b1[i] += (b0[i] + b2[i])>>1;
1122 static void vertical_compose53iL0(int *b0, int *b1, int *b2, int width){
1125 for(i=0; i<width; i++){
1126 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1130 static void spatial_compose53i(int *buffer, int width, int height, int stride){
1132 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride;
1133 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride;
1135 for(y=-1; y<=height; y+=2){
1136 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1137 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1140 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1141 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1142 STOP_TIMER("vertical_compose53i*")}
1145 if(y-1 >= 0) horizontal_compose53i(b0, width);
1146 if(b0 <= b2) horizontal_compose53i(b1, width);
1147 STOP_TIMER("horizontal_compose53i")}
1155 static void horizontal_compose97i(int *b, int width){
1157 const int w2= (width+1)>>1;
1159 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1160 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1161 lift (b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1162 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1165 static void vertical_compose97iH0(int *b0, int *b1, int *b2, int width){
1168 for(i=0; i<width; i++){
1169 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1173 static void vertical_compose97iH1(int *b0, int *b1, int *b2, int width){
1176 for(i=0; i<width; i++){
1178 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1180 int r= 3*(b0[i] + b2[i]);
1183 b1[i] -= (r+W_CO)>>W_CS;
1188 static void vertical_compose97iL0(int *b0, int *b1, int *b2, int width){
1191 for(i=0; i<width; i++){
1192 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1196 static void vertical_compose97iL1(int *b0, int *b1, int *b2, int width){
1199 for(i=0; i<width; i++){
1200 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1204 static void spatial_compose97i(int *buffer, int width, int height, int stride){
1206 DWTELEM *b0= buffer + mirror(-3-1, height-1)*stride;
1207 DWTELEM *b1= buffer + mirror(-3 , height-1)*stride;
1208 DWTELEM *b2= buffer + mirror(-3+1, height-1)*stride;
1209 DWTELEM *b3= buffer + mirror(-3+2, height-1)*stride;
1211 for(y=-3; y<=height; y+=2){
1212 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1213 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1215 if(stride == width && y+4 < height && 0){
1217 for(x=0; x<width/2; x++)
1224 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1225 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1226 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1227 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1229 STOP_TIMER("vertical_compose97i")}}
1232 if(y-1>= 0) horizontal_compose97i(b0, width);
1233 if(b0 <= b2) horizontal_compose97i(b1, width);
1234 if(width>400 && b0 <= b2){
1235 STOP_TIMER("horizontal_compose97i")}}
1244 static void spatial_idwt(SnowContext *s, int *buffer, int width, int height, int stride){
1247 for(level=s->spatial_decomposition_count-1; level>=0; level--){
1248 switch(s->spatial_decomposition_type){
1249 case 0: spatial_compose97i(buffer, width>>level, height>>level, stride<<level); break;
1250 case 1: spatial_compose53i(buffer, width>>level, height>>level, stride<<level); break;
1251 case 2: spatial_composeX (buffer, width>>level, height>>level, stride<<level); break;
1256 static const int hilbert[16][2]={
1257 {0,0}, {1,0}, {1,1}, {0,1},
1258 {0,2}, {0,3}, {1,3}, {1,2},
1259 {2,2}, {2,3}, {3,3}, {3,2},
1260 {3,1}, {2,1}, {2,0}, {3,0},
1275 0112122312232334122323342334
1276 0123456789ABCDEF0123456789AB
1277 RLLRMRRLLRRMRLLMLRRLMLLRRLLM
1300 #define SVI(a, i, x, y) \
1307 static int sig_cmp(const void *a, const void *b){
1308 const int16_t* da = (const int16_t *) a;
1309 const int16_t* db = (const int16_t *) b;
1311 if(da[1] != db[1]) return da[1] - db[1];
1312 else return da[0] - db[0];
1315 static int deint(unsigned int a){
1316 a &= 0x55555555; //0 1 2 3 4 5 6 7 8 9 A B C D E F
1317 a += a & 0x11111111; // 01 23 45 67 89 AB CD EF
1318 a += 3*(a & 0x0F0F0F0F);// 0123 4567 89AB CDEF
1319 a += 15*(a & 0x00FF00FF);// 01234567 89ABCDEF
1320 a +=255*(a & 0x0000FFFF);// 0123456789ABCDEF
1324 static void encode_subband_z0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1325 const int level= b->level;
1326 const int w= b->width;
1327 const int h= b->height;
1336 for(pos=0; ; pos++){
1338 int y= deint(pos>>1);
1339 int v, p=0, pr=0, pd=0;
1340 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/;
1349 v= src[x + y*stride];
1352 t= src[x + (y-1)*stride];
1354 lt= src[x - 1 + (y-1)*stride];
1357 /*rt= src[x + 1 + (y-1)*stride]*/;
1361 l= src[x - 1 + y*stride];
1363 if(orientation==1) ll= src[y + (x-2)*stride];
1364 else ll= src[x - 2 + y*stride];
1370 if(px<b->parent->width && py<b->parent->height){
1371 p= parent[px + py*2*stride];
1372 /*if(px+1<b->parent->width)
1373 pr= parent[px + 1 + py*2*stride];
1374 if(py+1<b->parent->height)
1375 pd= parent[px + (py+1)*2*stride];*/
1378 if(!(/*ll|*/l|lt|t|/*rt|*/p)){
1380 runs[run_index++]= run;
1388 runs[run_index++]= run;
1390 run= runs[run_index++];
1392 put_symbol(&s->c, b->state[1], run, 0);
1394 for(pos=0; ; pos++){
1396 int y= deint(pos>>1);
1397 int v, p=0, pr=0, pd=0;
1398 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/;
1405 v= src[x + y*stride];
1408 t= src[x + (y-1)*stride];
1410 lt= src[x - 1 + (y-1)*stride];
1413 // rt= src[x + 1 + (y-1)*stride];
1417 l= src[x - 1 + y*stride];
1419 if(orientation==1) ll= src[y + (x-2)*stride];
1420 else ll= src[x - 2 + y*stride];
1427 if(px<b->parent->width && py<b->parent->height){
1428 p= parent[px + py*2*stride];
1429 /* if(px+1<b->parent->width)
1430 pr= parent[px + 1 + py*2*stride];
1431 if(py+1<b->parent->height)
1432 pd= parent[px + (py+1)*2*stride];*/
1435 if(/*ll|*/l|lt|t|/*rt|*/p){
1436 int context= av_log2(/*ABS(ll) + */2*(3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p)));
1438 put_cabac(&s->c, &b->state[0][context], !!v);
1441 run= runs[run_index++];
1442 put_symbol(&s->c, b->state[1], run, 0);
1450 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p));
1452 put_symbol(&s->c, b->state[context + 2], ABS(v)-1, 0);
1453 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
1459 static void encode_subband_bp(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1460 const int level= b->level;
1461 const int w= b->width;
1462 const int h= b->height;
1467 for(plane=24; plane>=0; plane--){
1475 int d=0, r=0, rd=0, ld=0;
1476 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1477 v= src[x + y*stride];
1480 t= src[x + (y-1)*stride];
1482 lt= src[x - 1 + (y-1)*stride];
1485 rt= src[x + 1 + (y-1)*stride];
1489 l= src[x - 1 + y*stride];
1491 if(orientation==1) ll= src[y + (x-2)*stride];
1492 else ll= src[x - 2 + y*stride];
1496 d= src[x + (y+1)*stride];
1497 if(x) ld= src[x - 1 + (y+1)*stride];
1498 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
1501 r= src[x + 1 + y*stride];
1505 if(px<b->parent->width && py<b->parent->height)
1506 p= parent[px + py*2*stride];
1508 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane)));
1521 if(!(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv)){
1523 runs[run_index++]= run;
1531 runs[run_index++]= run;
1533 run= runs[run_index++];
1535 put_symbol(&s->c, b->state[1], run, 0);
1540 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1541 int d=0, r=0, rd=0, ld=0;
1542 v= src[x + y*stride];
1545 t= src[x + (y-1)*stride];
1547 lt= src[x - 1 + (y-1)*stride];
1550 rt= src[x + 1 + (y-1)*stride];
1554 l= src[x - 1 + y*stride];
1556 if(orientation==1) ll= src[y + (x-2)*stride];
1557 else ll= src[x - 2 + y*stride];
1561 d= src[x + (y+1)*stride];
1562 if(x) ld= src[x - 1 + (y+1)*stride];
1563 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
1566 r= src[x + 1 + y*stride];
1571 if(px<b->parent->width && py<b->parent->height)
1572 p= parent[px + py*2*stride];
1586 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){
1587 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)
1588 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld));
1590 if(lv) put_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)], !!(v-lv));
1591 else put_cabac(&s->c, &b->state[ 0][context], !!v);
1595 run= runs[run_index++];
1596 put_symbol(&s->c, b->state[1], run, 0);
1604 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1)
1605 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1);
1606 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + context], v<0);
1615 static void encode_subband_X(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1616 const int level= b->level;
1617 const int w= b->width;
1618 const int h= b->height;
1622 if(orientation==3 && parent && 0){
1623 int16_t candidate[w*h][2];
1625 int16_t boarder[3][w*h*4][2];
1626 int16_t significant[w*h][2];
1627 int candidate_count=0;
1628 int boarder_count[3]={0,0,0};
1629 int significant_count=0;
1632 int primary= orientation==1;
1634 memset(candidate, 0, sizeof(candidate));
1635 memset(state, 0, sizeof(state));
1636 memset(boarder, 0, sizeof(boarder));
1640 if(parent[(x>>1) + (y>>1)*2*stride])
1641 SVI(candidate, candidate_count, x, y)
1646 while(candidate_count && !boarder_count[0] && !boarder_count[1] && !boarder_count[2]){
1648 x= candidate[ candidate_count][0];
1649 y= candidate[ candidate_count][1];
1653 v= !!src[x + y*stride];
1654 put_cabac(&s->c, &b->state[0][0], v);
1656 SVI(significant, significant_count, x,y)
1657 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1658 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1659 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1660 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1661 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1662 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1663 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1664 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1667 while(!boarder_count[0] && !boarder_count[1] && !boarder_count[2] && rle_pos < w*h){
1669 for(; rle_pos < w*h;){
1670 x= rle_pos % w; //FIXME speed
1676 v= !!src[x + y*stride];
1678 put_symbol(&s->c, b->state[1], run, 0);
1679 SVI(significant, significant_count, x,y)
1680 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1681 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1682 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1683 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1684 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1685 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1686 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1687 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1689 //FIXME note only right & down can be boarders
1694 if(!boarder_count[0] && !boarder_count[1] && !boarder_count[2])
1697 while(boarder_count[0] || boarder_count[1] || boarder_count[2]){
1700 if (boarder_count[ primary]) index= primary;
1701 else if(boarder_count[1-primary]) index=1-primary;
1704 boarder_count[index]--;
1705 x= boarder[index][ boarder_count[index] ][0];
1706 y= boarder[index][ boarder_count[index] ][1];
1707 if(state[x + y*w]) //FIXME maybe check earlier
1710 v= !!src[x + y*stride];
1711 put_cabac(&s->c, &b->state[0][index+1], v);
1713 SVI(significant, significant_count, x,y)
1714 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1715 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1716 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1717 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1718 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1719 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1720 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1721 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1725 //FIXME sort significant coeffs maybe
1727 qsort(significant, significant_count, sizeof(int16_t[2]), sig_cmp);
1731 while(significant_count){
1732 int context= 3 + quant7[last_v&0xFF]; //use significance of suroundings
1733 significant_count--;
1734 x= significant[significant_count][0];//FIXME try opposit direction
1735 y= significant[significant_count][1];
1736 v= src[x + y*stride];
1737 put_symbol(&s->c, b->state[context + 2], v, 1); //FIXME try to avoid first bit, try this with the old code too!!
1744 static void encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1745 const int level= b->level;
1746 const int w= b->width;
1747 const int h= b->height;
1758 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1759 v= src[x + y*stride];
1762 t= src[x + (y-1)*stride];
1764 lt= src[x - 1 + (y-1)*stride];
1767 rt= src[x + 1 + (y-1)*stride];
1771 l= src[x - 1 + y*stride];
1773 if(orientation==1) ll= src[y + (x-2)*stride];
1774 else ll= src[x - 2 + y*stride];
1780 if(px<b->parent->width && py<b->parent->height)
1781 p= parent[px + py*2*stride];
1783 if(!(/*ll|*/l|lt|t|rt|p)){
1785 runs[run_index++]= run;
1793 runs[run_index++]= run;
1795 run= runs[run_index++];
1797 put_symbol2(&s->c, b->state[1], run, 3);
1802 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1803 v= src[x + y*stride];
1806 t= src[x + (y-1)*stride];
1808 lt= src[x - 1 + (y-1)*stride];
1811 rt= src[x + 1 + (y-1)*stride];
1815 l= src[x - 1 + y*stride];
1817 if(orientation==1) ll= src[y + (x-2)*stride];
1818 else ll= src[x - 2 + y*stride];
1824 if(px<b->parent->width && py<b->parent->height)
1825 p= parent[px + py*2*stride];
1827 if(/*ll|*/l|lt|t|rt|p){
1828 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1830 put_cabac(&s->c, &b->state[0][context], !!v);
1833 run= runs[run_index++];
1835 put_symbol2(&s->c, b->state[1], run, 3);
1843 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1845 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1846 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
1853 static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1854 // encode_subband_qtree(s, b, src, parent, stride, orientation);
1855 // encode_subband_z0run(s, b, src, parent, stride, orientation);
1856 encode_subband_c0run(s, b, src, parent, stride, orientation);
1857 // encode_subband_dzr(s, b, src, parent, stride, orientation);
1860 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1861 const int level= b->level;
1862 const int w= b->width;
1863 const int h= b->height;
1868 for(y=0; y<b->height; y++)
1869 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
1872 for(plane=24; plane>=0; plane--){
1875 run= get_symbol(&s->c, b->state[1], 0);
1877 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane)));
1882 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1883 int d=0, r=0, rd=0, ld=0;
1884 lv= src[x + y*stride];
1887 t= src[x + (y-1)*stride];
1889 lt= src[x - 1 + (y-1)*stride];
1892 rt= src[x + 1 + (y-1)*stride];
1896 l= src[x - 1 + y*stride];
1898 if(orientation==1) ll= src[y + (x-2)*stride];
1899 else ll= src[x - 2 + y*stride];
1903 d= src[x + (y+1)*stride];
1904 if(x) ld= src[x - 1 + (y+1)*stride];
1905 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
1908 r= src[x + 1 + y*stride];
1913 if(px<b->parent->width && py<b->parent->height)
1914 p= parent[px + py*2*stride];
1917 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){
1918 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)
1919 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld));
1922 assert(context + 8*av_log2(ABS(lv)) < 512 - 100);
1923 if(get_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)])){
1924 if(lv<0) v= lv - (1<<plane);
1925 else v= lv + (1<<plane);
1929 v= get_cabac(&s->c, &b->state[ 0][context]) << plane;
1934 run= get_symbol(&s->c, b->state[1], 0);
1942 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1)
1943 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1);
1944 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + context]))
1947 src[x + y*stride]= v;
1956 for(y=0; y<b->height; y++)
1957 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
1959 run= get_symbol2(&s->c, b->state[1], 3);
1963 int /*ll=0, */l=0, lt=0, t=0, rt=0;
1966 t= src[x + (y-1)*stride];
1968 lt= src[x - 1 + (y-1)*stride];
1971 rt= src[x + 1 + (y-1)*stride];
1975 l= src[x - 1 + y*stride];
1977 if(orientation==1) ll= src[y + (x-2)*stride];
1978 else ll= src[x - 2 + y*stride];
1984 if(px<b->parent->width && py<b->parent->height)
1985 p= parent[px + py*2*stride];
1987 if(/*ll|*/l|lt|t|rt|p){
1988 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1990 v=get_cabac(&s->c, &b->state[0][context]);
1993 run= get_symbol2(&s->c, b->state[1], 3);
1994 //FIXME optimize this here
1995 //FIXME try to store a more naive run
2003 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
2004 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1;
2005 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]]))
2007 src[x + y*stride]= v;
2011 if(level+1 == s->spatial_decomposition_count){
2012 STOP_TIMER("decode_subband")
2019 static void reset_contexts(SnowContext *s){
2020 int plane_index, level, orientation;
2022 for(plane_index=0; plane_index<2; plane_index++){
2023 for(level=0; level<s->spatial_decomposition_count; level++){
2024 for(orientation=level ? 1:0; orientation<4; orientation++){
2025 memset(s->plane[plane_index].band[level][orientation].state, 0, sizeof(s->plane[plane_index].band[level][orientation].state));
2029 memset(s->mb_band.state, 0, sizeof(s->mb_band.state));
2030 memset(s->mv_band[0].state, 0, sizeof(s->mv_band[0].state));
2031 memset(s->mv_band[1].state, 0, sizeof(s->mv_band[1].state));
2032 memset(s->header_state, 0, sizeof(s->header_state));
2035 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){
2038 for(y=0; y < b_h+5; y++){
2039 for(x=0; x < b_w; x++){
2040 int a0= src[x + y*stride];
2041 int a1= src[x + 1 + y*stride];
2042 int a2= src[x + 2 + y*stride];
2043 int a3= src[x + 3 + y*stride];
2044 int a4= src[x + 4 + y*stride];
2045 int a5= src[x + 5 + y*stride];
2046 // int am= 9*(a1+a2) - (a0+a3);
2047 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2048 // int am= 18*(a2+a3) - 2*(a1+a4);
2049 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2050 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2052 // if(b_w==16) am= 8*(a1+a2);
2054 if(dx<8) tmp[x + y*stride]= (32*a2*( 8-dx) + am* dx + 128)>>8;
2055 else tmp[x + y*stride]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2057 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
2058 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
2059 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
2060 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2063 for(y=0; y < b_h; y++){
2064 for(x=0; x < b_w; x++){
2065 int a0= tmp[x + y *stride];
2066 int a1= tmp[x + (y + 1)*stride];
2067 int a2= tmp[x + (y + 2)*stride];
2068 int a3= tmp[x + (y + 3)*stride];
2069 int a4= tmp[x + (y + 4)*stride];
2070 int a5= tmp[x + (y + 5)*stride];
2071 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2072 // int am= 18*(a2+a3) - 2*(a1+a4);
2073 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2074 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
2076 // if(b_w==16) am= 8*(a1+a2);
2078 if(dy<8) dst[x + y*stride]= (32*a2*( 8-dy) + am* dy + 128)>>8;
2079 else dst[x + y*stride]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
2081 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
2082 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2083 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2084 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2089 #define mcb(dx,dy,b_w)\
2090 static void mc_block ## dx ## dy(uint8_t *dst, uint8_t *src, int stride){\
2091 uint8_t tmp[stride*(b_w+5)];\
2092 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2112 #define mca(dx,dy,b_w)\
2113 static void mc_block_hpel ## dx ## dy(uint8_t *dst, uint8_t *src, int stride, int h){\
2114 uint8_t tmp[stride*(b_w+5)];\
2116 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2124 static void add_xblock(DWTELEM *dst, uint8_t *src, uint8_t *obmc, int s_x, int s_y, int b_w, int b_h, int mv_x, int mv_y, int w, int h, int dst_stride, int src_stride, int obmc_stride, int mb_type, int add){
2125 uint8_t tmp[src_stride*(b_h+5)]; //FIXME move to context to gurantee alignment
2132 }else if(s_x + b_w > w){
2136 obmc -= s_y*obmc_stride;
2139 }else if(s_y + b_h> h){
2143 if(b_w<=0 || b_h<=0) return;
2145 dst += s_x + s_y*dst_stride;
2148 src += s_x + s_y*src_stride;
2149 for(y=0; y < b_h; y++){
2150 for(x=0; x < b_w; x++){
2151 if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);
2152 else dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);
2158 // int dxy= (mv_x&1) + 2*(mv_y&1);
2160 s_x += (mv_x>>4) - 2;
2161 s_y += (mv_y>>4) - 2;
2162 src += s_x + s_y*src_stride;
2165 if( (unsigned)s_x >= w - b_w - 4
2166 || (unsigned)s_y >= h - b_h - 4){
2167 ff_emulated_edge_mc(tmp + 32, src, src_stride, b_w+5, b_h+5, s_x, s_y, w, h);
2172 mc_block(tmp, src, tmp + 64+8, src_stride, b_w, b_h, dx, dy);
2175 for(y=0; y < b_h; y++){
2176 for(x=0; x < b_w; x++){
2177 sum += src[x+ y*src_stride];
2180 sum= (sum + b_h*b_w/2) / (b_h*b_w);
2181 for(y=0; y < b_h; y++){
2182 for(x=0; x < b_w; x++){
2183 tmp[x + y*src_stride]= sum;
2188 for(y=0; y < b_h; y++){
2189 for(x=0; x < b_w; x++){
2190 if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);
2191 else dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);
2197 static void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2198 Plane *p= &s->plane[plane_index];
2199 const int mb_w= s->mb_band.width;
2200 const int mb_h= s->mb_band.height;
2201 const int mb_stride= s->mb_band.stride;
2202 int x, y, mb_x, mb_y;
2203 int scale = plane_index ? s->mv_scale : 2*s->mv_scale;
2204 int block_w = plane_index ? 8 : 16;
2205 uint8_t *obmc = plane_index ? obmc16 : obmc32;
2206 int obmc_stride= plane_index ? 16 : 32;
2207 int ref_stride= s->last_picture.linesize[plane_index];
2208 uint8_t *ref = s->last_picture.data[plane_index];
2212 if(s->avctx->debug&512){
2215 if(add) buf[x + y*w]+= 128*256;
2216 else buf[x + y*w]-= 128*256;
2222 for(mb_y=-1; mb_y<=mb_h; mb_y++){
2223 for(mb_x=-1; mb_x<=mb_w; mb_x++){
2224 int index= clip(mb_x, 0, mb_w-1) + clip(mb_y, 0, mb_h-1)*mb_stride;
2226 add_xblock(buf, ref, obmc,
2227 block_w*mb_x - block_w/2,
2228 block_w*mb_y - block_w/2,
2229 2*block_w, 2*block_w,
2230 s->mv_band[0].buf[index]*scale, s->mv_band[1].buf[index]*scale,
2232 w, ref_stride, obmc_stride,
2233 s->mb_band.buf[index], add);
2239 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
2240 const int level= b->level;
2241 const int w= b->width;
2242 const int h= b->height;
2243 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2244 const int qmul= qexp[qlog&7]<<(qlog>>3);
2245 int x,y, thres1, thres2;
2250 if(s->qlog == LOSSLESS_QLOG) return;
2252 bias= bias ? 0 : (3*qmul)>>3;
2253 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
2259 int i= src[x + y*stride];
2261 if((unsigned)(i+thres1) > thres2){
2264 i/= qmul; //FIXME optimize
2265 src[x + y*stride]= i;
2269 i/= qmul; //FIXME optimize
2270 src[x + y*stride]= -i;
2273 src[x + y*stride]= 0;
2279 int i= src[x + y*stride];
2281 if((unsigned)(i+thres1) > thres2){
2284 i= (i + bias) / qmul; //FIXME optimize
2285 src[x + y*stride]= i;
2289 i= (i + bias) / qmul; //FIXME optimize
2290 src[x + y*stride]= -i;
2293 src[x + y*stride]= 0;
2297 if(level+1 == s->spatial_decomposition_count){
2298 // STOP_TIMER("quantize")
2302 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
2303 const int level= b->level;
2304 const int w= b->width;
2305 const int h= b->height;
2306 const int qlog= clip(s->qlog + b->qlog, 0, 128);
2307 const int qmul= qexp[qlog&7]<<(qlog>>3);
2308 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
2311 if(s->qlog == LOSSLESS_QLOG) return;
2317 int i= src[x + y*stride];
2319 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
2321 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
2327 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2328 const int w= b->width;
2329 const int h= b->height;
2332 for(y=h-1; y>=0; y--){
2333 for(x=w-1; x>=0; x--){
2334 int i= x + y*stride;
2338 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2339 else src[i] -= src[i - 1];
2341 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2342 else src[i] -= src[i - 1];
2345 if(y) src[i] -= src[i - stride];
2351 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
2352 const int w= b->width;
2353 const int h= b->height;
2358 int i= x + y*stride;
2362 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
2363 else src[i] += src[i - 1];
2365 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
2366 else src[i] += src[i - 1];
2369 if(y) src[i] += src[i - stride];
2375 static void encode_header(SnowContext *s){
2376 int plane_index, level, orientation;
2378 put_cabac(&s->c, s->header_state, s->keyframe); // state clearing stuff?
2380 put_symbol(&s->c, s->header_state, s->version, 0);
2381 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
2382 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
2383 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
2384 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
2385 put_symbol(&s->c, s->header_state, s->b_width, 0);
2386 put_symbol(&s->c, s->header_state, s->b_height, 0);
2387 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
2388 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
2389 put_cabac(&s->c, s->header_state, s->spatial_scalability);
2390 // put_cabac(&s->c, s->header_state, s->rate_scalability);
2392 for(plane_index=0; plane_index<2; plane_index++){
2393 for(level=0; level<s->spatial_decomposition_count; level++){
2394 for(orientation=level ? 1:0; orientation<4; orientation++){
2395 if(orientation==2) continue;
2396 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
2401 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
2402 put_symbol(&s->c, s->header_state, s->qlog, 1);
2403 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
2404 put_symbol(&s->c, s->header_state, s->qbias, 1);
2407 static int decode_header(SnowContext *s){
2408 int plane_index, level, orientation;
2410 s->keyframe= get_cabac(&s->c, s->header_state);
2412 s->version= get_symbol(&s->c, s->header_state, 0);
2414 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
2417 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2418 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2419 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
2420 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
2421 s->b_width= get_symbol(&s->c, s->header_state, 0);
2422 s->b_height= get_symbol(&s->c, s->header_state, 0);
2423 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
2424 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
2425 s->spatial_scalability= get_cabac(&s->c, s->header_state);
2426 // s->rate_scalability= get_cabac(&s->c, s->header_state);
2428 for(plane_index=0; plane_index<3; plane_index++){
2429 for(level=0; level<s->spatial_decomposition_count; level++){
2430 for(orientation=level ? 1:0; orientation<4; orientation++){
2432 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
2433 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
2434 else q= get_symbol(&s->c, s->header_state, 1);
2435 s->plane[plane_index].band[level][orientation].qlog= q;
2441 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
2442 if(s->spatial_decomposition_type > 2){
2443 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
2447 s->qlog= get_symbol(&s->c, s->header_state, 1);
2448 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
2449 s->qbias= get_symbol(&s->c, s->header_state, 1);
2454 static int common_init(AVCodecContext *avctx){
2455 SnowContext *s = avctx->priv_data;
2457 int level, orientation, plane_index, dec;
2461 dsputil_init(&s->dsp, avctx);
2464 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
2465 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
2466 mc_block ## dx ## dy;
2485 #define mcfh(dx,dy)\
2486 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
2487 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
2488 mc_block_hpel ## dx ## dy;
2495 dec= s->spatial_decomposition_count= 5;
2496 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
2498 s->chroma_h_shift= 1; //FIXME XXX
2499 s->chroma_v_shift= 1;
2501 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
2503 s->b_width = (s->avctx->width +(1<<dec)-1)>>dec;
2504 s->b_height= (s->avctx->height+(1<<dec)-1)>>dec;
2506 s->spatial_dwt_buffer= av_mallocz(s->b_width*s->b_height*sizeof(DWTELEM)<<(2*dec));
2507 s->pred_buffer= av_mallocz(s->b_width*s->b_height*sizeof(DWTELEM)<<(2*dec));
2509 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
2511 for(plane_index=0; plane_index<3; plane_index++){
2512 int w= s->avctx->width;
2513 int h= s->avctx->height;
2516 w>>= s->chroma_h_shift;
2517 h>>= s->chroma_v_shift;
2519 s->plane[plane_index].width = w;
2520 s->plane[plane_index].height= h;
2521 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
2522 for(level=s->spatial_decomposition_count-1; level>=0; level--){
2523 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2524 SubBand *b= &s->plane[plane_index].band[level][orientation];
2526 b->buf= s->spatial_dwt_buffer;
2528 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
2529 b->width = (w + !(orientation&1))>>1;
2530 b->height= (h + !(orientation>1))>>1;
2532 if(orientation&1) b->buf += (w+1)>>1;
2533 if(orientation>1) b->buf += b->stride>>1;
2536 b->parent= &s->plane[plane_index].band[level-1][orientation];
2543 //FIXME init_subband() ?
2544 s->mb_band.stride= s->mv_band[0].stride= s->mv_band[1].stride=
2545 s->mb_band.width = s->mv_band[0].width = s->mv_band[1].width = (s->avctx->width + 15)>>4;
2546 s->mb_band.height= s->mv_band[0].height= s->mv_band[1].height= (s->avctx->height+ 15)>>4;
2547 s->mb_band .buf= av_mallocz(s->mb_band .stride * s->mb_band .height*sizeof(DWTELEM));
2548 s->mv_band[0].buf= av_mallocz(s->mv_band[0].stride * s->mv_band[0].height*sizeof(DWTELEM));
2549 s->mv_band[1].buf= av_mallocz(s->mv_band[1].stride * s->mv_band[1].height*sizeof(DWTELEM));
2553 width= s->width= avctx->width;
2554 height= s->height= avctx->height;
2556 assert(width && height);
2558 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
2564 static void calculate_vissual_weight(SnowContext *s, Plane *p){
2565 int width = p->width;
2566 int height= p->height;
2567 int i, level, orientation, x, y;
2569 for(level=0; level<s->spatial_decomposition_count; level++){
2570 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2571 SubBand *b= &p->band[level][orientation];
2572 DWTELEM *buf= b->buf;
2575 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
2576 buf[b->width/2 + b->height/2*b->stride]= 256*256;
2577 spatial_idwt(s, s->spatial_dwt_buffer, width, height, width);
2578 for(y=0; y<height; y++){
2579 for(x=0; x<width; x++){
2580 int64_t d= s->spatial_dwt_buffer[x + y*width];
2585 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
2586 av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
2591 static int encode_init(AVCodecContext *avctx)
2593 SnowContext *s = avctx->priv_data;
2595 int level, orientation, plane_index;
2597 if(avctx->strict_std_compliance >= 0){
2598 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
2599 "use vstrict=-1 to use it anyway\n");
2607 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
2608 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2609 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
2610 s->mb_type = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int16_t));
2611 s->mb_mean = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int8_t ));
2612 s->dummy = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int32_t));
2613 h263_encode_init(&s->m); //mv_penalty
2615 for(plane_index=0; plane_index<3; plane_index++){
2616 calculate_vissual_weight(s, &s->plane[plane_index]);
2620 avctx->coded_frame= &s->current_picture;
2621 switch(avctx->pix_fmt){
2622 // case PIX_FMT_YUV444P:
2623 // case PIX_FMT_YUV422P:
2624 case PIX_FMT_YUV420P:
2626 // case PIX_FMT_YUV411P:
2627 // case PIX_FMT_YUV410P:
2628 s->colorspace_type= 0;
2630 /* case PIX_FMT_RGBA32:
2634 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
2637 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
2638 s->chroma_h_shift= 1;
2639 s->chroma_v_shift= 1;
2643 static int frame_start(SnowContext *s){
2649 tmp= s->last_picture;
2650 s->last_picture= s->current_picture;
2651 s->current_picture= tmp;
2653 s->current_picture.reference= 1;
2654 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
2655 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2662 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
2663 SnowContext *s = avctx->priv_data;
2664 CABACContext * const c= &s->c;
2665 AVFrame *pict = data;
2666 const int width= s->avctx->width;
2667 const int height= s->avctx->height;
2669 int log2_threshold, level, orientation, plane_index, i;
2671 ff_init_cabac_encoder(c, buf, buf_size);
2672 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
2674 s->input_picture = *pict;
2676 memset(s->header_state, 0, sizeof(s->header_state));
2678 s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
2679 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
2682 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
2686 s->qlog= LOSSLESS_QLOG;
2689 for(i=0; i<s->mb_band.stride * s->mb_band.height; i++){
2690 s->mb_band.buf[i]= s->keyframe;
2695 if(pict->pict_type == P_TYPE){
2696 int block_width = (width +15)>>4;
2697 int block_height= (height+15)>>4;
2698 int stride= s->current_picture.linesize[0];
2699 uint8_t *src_plane= s->input_picture.data[0];
2700 int src_stride= s->input_picture.linesize[0];
2703 assert(s->current_picture.data[0]);
2704 assert(s->last_picture.data[0]);
2706 s->m.avctx= s->avctx;
2707 s->m.current_picture.data[0]= s->current_picture.data[0];
2708 s->m. last_picture.data[0]= s-> last_picture.data[0];
2709 s->m. new_picture.data[0]= s-> input_picture.data[0];
2710 s->m.current_picture_ptr= &s->m.current_picture;
2711 s->m. last_picture_ptr= &s->m. last_picture;
2713 s->m. last_picture.linesize[0]=
2714 s->m. new_picture.linesize[0]=
2715 s->m.current_picture.linesize[0]= stride;
2717 s->m.height= height;
2718 s->m.mb_width = block_width;
2719 s->m.mb_height= block_height;
2720 s->m.mb_stride= s->m.mb_width+1;
2721 s->m.b8_stride= 2*s->m.mb_width+1;
2723 s->m.pict_type= pict->pict_type;
2724 s->m.me_method= s->avctx->me_method;
2725 s->m.me.scene_change_score=0;
2726 s->m.flags= s->avctx->flags;
2727 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
2728 s->m.out_format= FMT_H263;
2729 s->m.unrestricted_mv= 1;
2731 s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
2732 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
2733 s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
2735 if(!s->motion_val8){
2736 s->motion_val8 = av_mallocz(s->m.b8_stride*block_height*2*2*sizeof(int16_t));
2737 s->motion_val16= av_mallocz(s->m.mb_stride*block_height*2*sizeof(int16_t));
2740 s->m.mb_type= s->mb_type;
2742 //dummies, to avoid segfaults
2743 s->m.current_picture.mb_mean = s->mb_mean;
2744 s->m.current_picture.mb_var = (int16_t*)s->dummy;
2745 s->m.current_picture.mc_mb_var= (int16_t*)s->dummy;
2746 s->m.current_picture.mb_type = s->dummy;
2748 s->m.current_picture.motion_val[0]= s->motion_val8;
2749 s->m.p_mv_table= s->motion_val16;
2750 s->m.dsp= s->dsp; //move
2755 s->m.me.dia_size= s->avctx->pre_dia_size;
2756 s->m.first_slice_line=1;
2757 for(y= block_height-1; y >= 0; y--) {
2758 uint8_t src[stride*16];
2760 s->m.new_picture.data[0]= src - y*16*stride; //ugly
2762 for(i=0; i<16 && i + 16*y<height; i++){
2763 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
2764 for(x=width; x<16*block_width; x++)
2765 src[i*stride+x]= src[i*stride+x-1];
2767 for(; i<16 && i + 16*y<16*block_height; i++)
2768 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
2770 for(x=block_width-1; x >=0 ;x--) {
2772 ff_init_block_index(&s->m);
2773 ff_update_block_index(&s->m);
2774 ff_pre_estimate_p_frame_motion(&s->m, x, y);
2776 s->m.first_slice_line=0;
2781 s->m.me.dia_size= s->avctx->dia_size;
2782 s->m.first_slice_line=1;
2783 for (y = 0; y < block_height; y++) {
2784 uint8_t src[stride*16];
2786 s->m.new_picture.data[0]= src - y*16*stride; //ugly
2789 assert(width <= stride);
2790 assert(width <= 16*block_width);
2792 for(i=0; i<16 && i + 16*y<height; i++){
2793 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
2794 for(x=width; x<16*block_width; x++)
2795 src[i*stride+x]= src[i*stride+x-1];
2797 for(; i<16 && i + 16*y<16*block_height; i++)
2798 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
2800 for (x = 0; x < block_width; x++) {
2801 int mb_xy= x + y*(s->mb_band.stride);
2803 ff_init_block_index(&s->m);
2804 ff_update_block_index(&s->m);
2806 ff_estimate_p_frame_motion(&s->m, x, y);
2808 s->mb_band .buf[mb_xy]= (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER)
2810 s->mv_band[0].buf[mb_xy]= s->motion_val16[x + y*s->m.mb_stride][0];
2811 s->mv_band[1].buf[mb_xy]= s->motion_val16[x + y*s->m.mb_stride][1];
2813 if(s->mb_band .buf[x + y*(s->mb_band.stride)]==2 && 0){
2814 int dc0=128, dc1=128, dc, dc2, dir;
2815 int offset= (s->avctx->flags & CODEC_FLAG_QPEL) ? 64 : 32;
2817 dc =s->mb_mean[x + y *s->m.mb_stride ];
2818 if(x) dc0=s->mb_mean[x + y *s->m.mb_stride - 1];
2819 if(y) dc1=s->mb_mean[x + (y-1)*s->m.mb_stride ];
2822 if (ABS(dc0 - dc) < ABS(dc1 - dc) && ABS(dc0 - dc) < ABS(dc2 - dc))
2824 else if(ABS(dc0 - dc) >=ABS(dc1 - dc) && ABS(dc1 - dc) < ABS(dc2 - dc))
2829 if(ABS(dc0 - dc) < ABS(dc1 - dc) && x){
2830 s->mv_band[0].buf[mb_xy]= s->mv_band[0].buf[x + y*(s->mb_band.stride)-1] - offset;
2831 s->mv_band[1].buf[mb_xy]= s->mv_band[1].buf[x + y*(s->mb_band.stride)-1];
2832 s->mb_mean[x + y *s->m.mb_stride ]= dc0;
2834 s->mv_band[0].buf[mb_xy]= s->mv_band[0].buf[x + (y-1)*(s->mb_band.stride)];
2835 s->mv_band[1].buf[mb_xy]= s->mv_band[1].buf[x + (y-1)*(s->mb_band.stride)] - offset;
2836 s->mb_mean[x + y *s->m.mb_stride ]= dc1;
2839 // s->mb_band .buf[x + y*(s->mb_band.stride)]=1; //FIXME intra only test
2841 s->m.first_slice_line=0;
2843 assert(s->m.pict_type == P_TYPE);
2844 if(s->m.me.scene_change_score > s->avctx->scenechange_threshold){
2846 pict->pict_type =I_TYPE;
2847 for(i=0; i<s->mb_band.stride * s->mb_band.height; i++){
2848 s->mb_band.buf[i]= 1;
2849 s->mv_band[0].buf[i]=
2850 s->mv_band[1].buf[i]= 0;
2852 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
2856 s->m.first_slice_line=1;
2858 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
2862 decorrelate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 0, 1);
2863 decorrelate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 0, 1);
2864 decorrelate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 0 ,1);
2865 encode_subband(s, &s->mb_band , s->mb_band .buf, NULL, s->mb_band .stride, 0);
2866 encode_subband(s, &s->mv_band[0], s->mv_band[0].buf, NULL, s->mv_band[0].stride, 0);
2867 encode_subband(s, &s->mv_band[1], s->mv_band[1].buf, NULL, s->mv_band[1].stride, 0);
2870 correlate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 1, 1);
2871 correlate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 1, 1);
2872 correlate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 1, 1);
2874 for(plane_index=0; plane_index<3; plane_index++){
2875 Plane *p= &s->plane[plane_index];
2879 int bits= put_bits_count(&s->c.pb);
2882 if(pict->data[plane_index]) //FIXME gray hack
2885 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<8;
2888 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
2889 if(s->qlog == LOSSLESS_QLOG){
2892 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + 127)>>8;
2897 spatial_dwt(s, s->spatial_dwt_buffer, w, h, w);
2899 for(level=0; level<s->spatial_decomposition_count; level++){
2900 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2901 SubBand *b= &p->band[level][orientation];
2903 quantize(s, b, b->buf, b->stride, s->qbias);
2905 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
2906 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
2907 assert(b->parent==NULL || b->parent->stride == b->stride*2);
2909 correlate(s, b, b->buf, b->stride, 1, 0);
2912 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
2914 for(level=0; level<s->spatial_decomposition_count; level++){
2915 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2916 SubBand *b= &p->band[level][orientation];
2918 dequantize(s, b, b->buf, b->stride);
2922 spatial_idwt(s, s->spatial_dwt_buffer, w, h, w);
2923 if(s->qlog == LOSSLESS_QLOG){
2926 s->spatial_dwt_buffer[y*w + x]<<=8;
2930 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
2934 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
2935 if(v&(~255)) v= ~(v>>31);
2936 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= v;
2939 if(s->avctx->flags&CODEC_FLAG_PSNR){
2942 if(pict->data[plane_index]) //FIXME gray hack
2945 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];
2949 s->avctx->error[plane_index] += error;
2950 s->avctx->error[3] += error;
2954 if(s->last_picture.data[0])
2955 avctx->release_buffer(avctx, &s->last_picture);
2959 return put_cabac_terminate(c, 1);
2962 static void common_end(SnowContext *s){
2963 av_freep(&s->spatial_dwt_buffer);
2964 av_freep(&s->mb_band.buf);
2965 av_freep(&s->mv_band[0].buf);
2966 av_freep(&s->mv_band[1].buf);
2968 av_freep(&s->m.me.scratchpad);
2969 av_freep(&s->m.me.map);
2970 av_freep(&s->m.me.score_map);
2971 av_freep(&s->mb_type);
2972 av_freep(&s->mb_mean);
2973 av_freep(&s->dummy);
2974 av_freep(&s->motion_val8);
2975 av_freep(&s->motion_val16);
2978 static int encode_end(AVCodecContext *avctx)
2980 SnowContext *s = avctx->priv_data;
2987 static int decode_init(AVCodecContext *avctx)
2989 // SnowContext *s = avctx->priv_data;
2996 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
2997 SnowContext *s = avctx->priv_data;
2998 CABACContext * const c= &s->c;
2999 const int width= s->avctx->width;
3000 const int height= s->avctx->height;
3002 AVFrame *picture = data;
3003 int log2_threshold, level, orientation, plane_index;
3006 /* no supplementary picture */
3010 ff_init_cabac_decoder(c, buf, buf_size);
3011 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3013 memset(s->header_state, 0, sizeof(s->header_state));
3015 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
3019 //keyframe flag dupliaction mess FIXME
3020 if(avctx->debug&FF_DEBUG_PICT_INFO)
3021 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
3023 decode_subband(s, &s->mb_band , s->mb_band .buf, NULL, s->mb_band .stride, 0);
3024 decode_subband(s, &s->mv_band[0], s->mv_band[0].buf, NULL, s->mv_band[0].stride, 0);
3025 decode_subband(s, &s->mv_band[1], s->mv_band[1].buf, NULL, s->mv_band[1].stride, 0);
3026 correlate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 1, 1);
3027 correlate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 1, 1);
3028 correlate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 1, 1);
3030 for(plane_index=0; plane_index<3; plane_index++){
3031 Plane *p= &s->plane[plane_index];
3036 if(s->avctx->debug&2048){
3037 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
3038 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3042 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
3043 if(v&(~255)) v= ~(v>>31);
3044 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
3048 for(level=0; level<s->spatial_decomposition_count; level++){
3049 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3050 SubBand *b= &p->band[level][orientation];
3052 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
3054 correlate(s, b, b->buf, b->stride, 1, 0);
3057 if(!(s->avctx->debug&1024))
3058 for(level=0; level<s->spatial_decomposition_count; level++){
3059 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3060 SubBand *b= &p->band[level][orientation];
3062 dequantize(s, b, b->buf, b->stride);
3066 spatial_idwt(s, s->spatial_dwt_buffer, w, h, w);
3067 if(s->qlog == LOSSLESS_QLOG){
3070 s->spatial_dwt_buffer[y*w + x]<<=8;
3074 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3079 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
3080 if(v&(~255)) v= ~(v>>31);
3081 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= v;
3088 if(s->last_picture.data[0])
3089 avctx->release_buffer(avctx, &s->last_picture);
3091 if(!(s->avctx->debug&2048))
3092 *picture= s->current_picture;
3094 *picture= s->mconly_picture;
3096 *data_size = sizeof(AVFrame);
3098 bytes_read= get_cabac_terminate(c);
3099 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n");
3104 static int decode_end(AVCodecContext *avctx)
3106 SnowContext *s = avctx->priv_data;
3113 AVCodec snow_decoder = {
3117 sizeof(SnowContext),
3122 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
3126 AVCodec snow_encoder = {
3130 sizeof(SnowContext),
3145 int buffer[2][width*height];
3148 s.spatial_decomposition_count=6;
3149 s.spatial_decomposition_type=1;
3151 printf("testing 5/3 DWT\n");
3152 for(i=0; i<width*height; i++)
3153 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3155 spatial_dwt(&s, buffer[0], width, height, width);
3156 spatial_idwt(&s, buffer[0], width, height, width);
3158 for(i=0; i<width*height; i++)
3159 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3161 printf("testing 9/7 DWT\n");
3162 s.spatial_decomposition_type=0;
3163 for(i=0; i<width*height; i++)
3164 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3166 spatial_dwt(&s, buffer[0], width, height, width);
3167 spatial_idwt(&s, buffer[0], width, height, width);
3169 for(i=0; i<width*height; i++)
3170 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3172 printf("testing AC coder\n");
3173 memset(s.header_state, 0, sizeof(s.header_state));
3174 ff_init_cabac_encoder(&s.c, buffer[0], 256*256);
3175 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3177 for(i=-256; i<256; i++){
3179 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
3180 STOP_TIMER("put_symbol")
3182 put_cabac_terminate(&s.c, 1);
3184 memset(s.header_state, 0, sizeof(s.header_state));
3185 ff_init_cabac_decoder(&s.c, buffer[0], 256*256);
3186 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3188 for(i=-256; i<256; i++){
3191 j= get_symbol(&s.c, s.header_state, 1);
3192 STOP_TIMER("get_symbol")
3193 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
3196 int level, orientation, x, y;
3197 int64_t errors[8][4];
3200 memset(errors, 0, sizeof(errors));
3201 s.spatial_decomposition_count=3;
3202 s.spatial_decomposition_type=0;
3203 for(level=0; level<s.spatial_decomposition_count; level++){
3204 for(orientation=level ? 1 : 0; orientation<4; orientation++){
3205 int w= width >> (s.spatial_decomposition_count-level);
3206 int h= height >> (s.spatial_decomposition_count-level);
3207 int stride= width << (s.spatial_decomposition_count-level);
3208 DWTELEM *buf= buffer[0];
3211 if(orientation&1) buf+=w;
3212 if(orientation>1) buf+=stride>>1;
3214 memset(buffer[0], 0, sizeof(int)*width*height);
3215 buf[w/2 + h/2*stride]= 256*256;
3216 spatial_idwt(&s, buffer[0], width, height, width);
3217 for(y=0; y<height; y++){
3218 for(x=0; x<width; x++){
3219 int64_t d= buffer[0][x + y*width];
3221 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
3223 if(ABS(height/2-y)<9 && level==2) printf("\n");
3225 error= (int)(sqrt(error)+0.5);
3226 errors[level][orientation]= error;
3227 if(g) g=ff_gcd(g, error);
3231 printf("static int const visual_weight[][4]={\n");
3232 for(level=0; level<s.spatial_decomposition_count; level++){
3234 for(orientation=0; orientation<4; orientation++){
3235 printf("%8lld,", errors[level][orientation]/g);
3243 int w= width >> (s.spatial_decomposition_count-level);
3244 int h= height >> (s.spatial_decomposition_count-level);
3245 int stride= width << (s.spatial_decomposition_count-level);
3246 DWTELEM *buf= buffer[0];
3252 memset(buffer[0], 0, sizeof(int)*width*height);
3254 for(y=0; y<height; y++){
3255 for(x=0; x<width; x++){
3256 int tab[4]={0,2,3,1};
3257 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
3260 spatial_dwt(&s, buffer[0], width, height, width);
3264 buf[x + y*stride ]=169;
3265 buf[x + y*stride-w]=64;
3268 spatial_idwt(&s, buffer[0], width, height, width);
3270 for(y=0; y<height; y++){
3271 for(x=0; x<width; x++){
3272 int64_t d= buffer[0][x + y*width];
3274 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
3276 if(ABS(height/2-y)<9) printf("\n");