Mercurial > libavcodec.hg
annotate snow.c @ 2175:24ed7893bf82 libavcodec
cleanup
author | michael |
---|---|
date | Mon, 16 Aug 2004 22:51:18 +0000 |
parents | cbac56a6244f |
children | eedd352930b2 |
rev | line source |
---|---|
2138 | 1 /* |
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
3 * | |
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. | |
8 * | |
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. | |
13 * | |
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 | |
17 */ | |
18 | |
19 #include "avcodec.h" | |
20 #include "common.h" | |
21 #include "dsputil.h" | |
22 #include "cabac.h" | |
23 | |
24 #include "mpegvideo.h" | |
25 | |
26 #undef NDEBUG | |
27 #include <assert.h> | |
28 | |
29 #define MAX_DECOMPOSITIONS 8 | |
30 #define MAX_PLANES 4 | |
31 #define DWTELEM int | |
32 #define QROOT 8 | |
2161 | 33 #define LOSSLESS_QLOG -128 |
2138 | 34 |
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, | |
52 }; | |
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, | |
70 }; | |
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, | |
88 }; | |
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, | |
106 }; | |
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, | |
124 }; | |
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, | |
142 }; | |
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, | |
160 }; | |
161 | |
162 #define OBMC_MAX 64 | |
163 #if 0 //64*cubic | |
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, | |
197 //error:0.000022 | |
198 }; | |
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, | |
216 //error:0.000033 | |
217 }; | |
218 #elif 1 // 64*linear | |
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, | |
252 //error:0.000020 | |
253 }; | |
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, | |
271 //error:0.000015 | |
272 }; | |
273 #else //64*cos | |
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, | |
307 //error:0.000022 | |
308 }; | |
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, | |
326 //error:0.000022 | |
327 }; | |
328 #endif | |
329 | |
330 typedef struct SubBand{ | |
331 int level; | |
332 int stride; | |
333 int width; | |
334 int height; | |
335 int qlog; ///< log(qscale)/log[2^(1/6)] | |
336 DWTELEM *buf; | |
337 struct SubBand *parent; | |
338 uint8_t state[/*7*2*/ 7 + 512][32]; | |
339 }SubBand; | |
340 | |
341 typedef struct Plane{ | |
342 int width; | |
343 int height; | |
344 SubBand band[MAX_DECOMPOSITIONS][4]; | |
345 }Plane; | |
346 | |
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) | |
349 | |
350 AVCodecContext *avctx; | |
351 CABACContext c; | |
352 DSPContext dsp; | |
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]; | |
359 int keyframe; | |
360 int version; | |
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; | |
367 int colorspace_type; | |
368 int chroma_h_shift; | |
369 int chroma_v_shift; | |
370 int spatial_scalability; | |
371 int qlog; | |
372 int mv_scale; | |
373 int qbias; | |
374 #define QBIAS_SHIFT 3 | |
375 int b_width; //FIXME remove? | |
376 int b_height; //FIXME remove? | |
377 Plane plane[MAX_PLANES]; | |
378 SubBand mb_band; | |
379 SubBand mv_band[2]; | |
380 | |
381 uint16_t *mb_type; | |
382 uint8_t *mb_mean; | |
383 uint32_t *dummy; | |
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) | |
387 }SnowContext; | |
388 | |
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 | |
396 }; | |
397 | |
398 static inline int mirror(int v, int m){ | |
399 if (v<0) return -v; | |
400 else if(v>m) return 2*m-v; | |
401 else return v; | |
402 } | |
403 | |
404 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed){ | |
405 int i; | |
406 | |
407 if(v){ | |
408 const int a= ABS(v); | |
409 const int e= av_log2(a); | |
410 #if 1 | |
411 const int el= FFMIN(e, 10); | |
412 put_cabac(c, state+0, 0); | |
413 | |
414 for(i=0; i<el; i++){ | |
415 put_cabac(c, state+1+i, 1); //1..10 | |
416 } | |
417 for(; i<e; i++){ | |
418 put_cabac(c, state+1+9, 1); //1..10 | |
419 } | |
420 put_cabac(c, state+1+FFMIN(i,9), 0); | |
421 | |
422 for(i=e-1; i>=el; i--){ | |
423 put_cabac(c, state+22+9, (a>>i)&1); //22..31 | |
424 } | |
425 for(; i>=0; i--){ | |
426 put_cabac(c, state+22+i, (a>>i)&1); //22..31 | |
427 } | |
428 | |
429 if(is_signed) | |
430 put_cabac(c, state+11 + el, v < 0); //11..21 | |
431 #else | |
432 | |
433 put_cabac(c, state+0, 0); | |
434 if(e<=9){ | |
435 for(i=0; i<e; i++){ | |
436 put_cabac(c, state+1+i, 1); //1..10 | |
437 } | |
438 put_cabac(c, state+1+i, 0); | |
439 | |
440 for(i=e-1; i>=0; i--){ | |
441 put_cabac(c, state+22+i, (a>>i)&1); //22..31 | |
442 } | |
443 | |
444 if(is_signed) | |
445 put_cabac(c, state+11 + e, v < 0); //11..21 | |
446 }else{ | |
447 for(i=0; i<e; i++){ | |
448 put_cabac(c, state+1+FFMIN(i,9), 1); //1..10 | |
449 } | |
450 put_cabac(c, state+1+FFMIN(i,9), 0); | |
451 | |
452 for(i=e-1; i>=0; i--){ | |
453 put_cabac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 | |
454 } | |
455 | |
456 if(is_signed) | |
457 put_cabac(c, state+11 + FFMIN(e,10), v < 0); //11..21 | |
458 } | |
459 #endif | |
460 }else{ | |
461 put_cabac(c, state+0, 1); | |
462 } | |
463 } | |
464 | |
465 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed){ | |
466 if(get_cabac(c, state+0)) | |
467 return 0; | |
468 else{ | |
469 int i, e, a, el; | |
470 //FIXME try to merge loops with FFMIN() maybe they are equally fast and they are surly cuter | |
471 for(e=0; e<10; e++){ | |
472 if(get_cabac(c, state + 1 + e)==0) // 1..10 | |
473 break; | |
474 } | |
475 el= e; | |
476 | |
477 if(e==10){ | |
478 while(get_cabac(c, state + 1 + 9)) //10 | |
479 e++; | |
480 } | |
481 a= 1; | |
482 for(i=e-1; i>=el; i--){ | |
483 a += a + get_cabac(c, state+22+9); //31 | |
484 } | |
485 for(; i>=0; i--){ | |
486 a += a + get_cabac(c, state+22+i); //22..31 | |
487 } | |
488 | |
489 if(is_signed && get_cabac(c, state+11 + el)) //11..21 | |
490 return -a; | |
491 else | |
492 return a; | |
493 } | |
494 } | |
495 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
496 static inline void put_symbol2(CABACContext *c, uint8_t *state, int v, int log2){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
497 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
498 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
499 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
500 assert(v>=0); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
501 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
502 |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
503 while(v >= r){ |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
504 put_cabac(c, state+4+log2, 1); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
505 v -= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
506 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
507 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
508 } |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
509 put_cabac(c, state+4+log2, 0); |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
510 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
511 for(i=log2-1; i>=0; i--){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
512 put_cabac(c, state+31-i, (v>>i)&1); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
513 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
514 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
515 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
516 static inline int get_symbol2(CABACContext *c, uint8_t *state, int log2){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
517 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
518 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
519 int v=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
520 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
521 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
522 |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
523 while(get_cabac(c, state+4+log2)){ |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
524 v+= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
525 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
526 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
527 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
528 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
529 for(i=log2-1; i>=0; i--){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
530 v+= get_cabac(c, state+31-i)<<i; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
531 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
532 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
533 return v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
534 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
535 |
2138 | 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); | |
540 int i; | |
541 | |
542 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) | |
543 if(mirror_left){ | |
544 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); | |
545 dst += dst_step; | |
546 src += src_step; | |
547 } | |
548 | |
549 for(i=0; i<w; i++){ | |
550 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse); | |
551 } | |
552 | |
553 if(mirror_right){ | |
554 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse); | |
555 } | |
556 } | |
557 | |
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); | |
562 int i; | |
563 | |
564 if(mirror_left){ | |
565 int r= 3*2*ref[0]; | |
566 r += r>>4; | |
567 r += r>>8; | |
568 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse); | |
569 dst += dst_step; | |
570 src += src_step; | |
571 } | |
572 | |
573 for(i=0; i<w; i++){ | |
574 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]); | |
575 r += r>>4; | |
576 r += r>>8; | |
577 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse); | |
578 } | |
579 | |
580 if(mirror_right){ | |
581 int r= 3*2*ref[w*ref_step]; | |
582 r += r>>4; | |
583 r += r>>8; | |
584 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse); | |
585 } | |
586 } | |
587 | |
588 | |
589 static void inplace_lift(int *dst, int width, int *coeffs, int n, int shift, int start, int inverse){ | |
590 int x, i; | |
591 | |
592 for(x=start; x<width; x+=2){ | |
593 int64_t sum=0; | |
594 | |
595 for(i=0; i<n; i++){ | |
596 int x2= x + 2*i - n + 1; | |
597 if (x2< 0) x2= -x2; | |
598 else if(x2>=width) x2= 2*width-x2-2; | |
599 sum += coeffs[i]*(int64_t)dst[x2]; | |
600 } | |
601 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift; | |
602 else dst[x] += (sum + (1<<shift)/2)>>shift; | |
603 } | |
604 } | |
605 | |
606 static void inplace_liftV(int *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){ | |
607 int x, y, i; | |
608 for(y=start; y<height; y+=2){ | |
609 for(x=0; x<width; x++){ | |
610 int64_t sum=0; | |
611 | |
612 for(i=0; i<n; i++){ | |
613 int y2= y + 2*i - n + 1; | |
614 if (y2< 0) y2= -y2; | |
615 else if(y2>=height) y2= 2*height-y2-2; | |
616 sum += coeffs[i]*(int64_t)dst[x + y2*stride]; | |
617 } | |
618 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift; | |
619 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift; | |
620 } | |
621 } | |
622 } | |
623 | |
624 #define SCALEX 1 | |
625 #define LX0 0 | |
626 #define LX1 1 | |
627 | |
2139 | 628 #if 0 // more accurate 9/7 |
2138 | 629 #define N1 2 |
630 #define SHIFT1 14 | |
631 #define COEFFS1 (int[]){-25987,-25987} | |
632 #define N2 2 | |
633 #define SHIFT2 19 | |
634 #define COEFFS2 (int[]){-27777,-27777} | |
635 #define N3 2 | |
636 #define SHIFT3 15 | |
637 #define COEFFS3 (int[]){28931,28931} | |
638 #define N4 2 | |
639 #define SHIFT4 15 | |
640 #define COEFFS4 (int[]){14533,14533} | |
641 #elif 1 // 13/7 CRF | |
642 #define N1 4 | |
643 #define SHIFT1 4 | |
644 #define COEFFS1 (int[]){1,-9,-9,1} | |
2139 | 645 #define N2 4 |
2138 | 646 #define SHIFT2 4 |
647 #define COEFFS2 (int[]){-1,5,5,-1} | |
648 #define N3 0 | |
649 #define SHIFT3 1 | |
650 #define COEFFS3 NULL | |
651 #define N4 0 | |
652 #define SHIFT4 1 | |
653 #define COEFFS4 NULL | |
654 #elif 1 // 3/5 | |
655 #define LX0 1 | |
656 #define LX1 0 | |
657 #define SCALEX 0.5 | |
658 #define N1 2 | |
659 #define SHIFT1 1 | |
660 #define COEFFS1 (int[]){1,1} | |
661 #define N2 2 | |
662 #define SHIFT2 2 | |
663 #define COEFFS2 (int[]){-1,-1} | |
664 #define N3 0 | |
665 #define SHIFT3 0 | |
666 #define COEFFS3 NULL | |
667 #define N4 0 | |
668 #define SHIFT4 0 | |
669 #define COEFFS4 NULL | |
670 #elif 1 // 11/5 | |
671 #define N1 0 | |
672 #define SHIFT1 1 | |
673 #define COEFFS1 NULL | |
674 #define N2 2 | |
675 #define SHIFT2 2 | |
676 #define COEFFS2 (int[]){-1,-1} | |
677 #define N3 2 | |
678 #define SHIFT3 0 | |
679 #define COEFFS3 (int[]){-1,-1} | |
680 #define N4 4 | |
681 #define SHIFT4 7 | |
682 #define COEFFS4 (int[]){-5,29,29,-5} | |
683 #define SCALEX 4 | |
684 #elif 1 // 9/7 CDF | |
685 #define N1 2 | |
686 #define SHIFT1 7 | |
687 #define COEFFS1 (int[]){-203,-203} | |
688 #define N2 2 | |
689 #define SHIFT2 12 | |
690 #define COEFFS2 (int[]){-217,-217} | |
691 #define N3 2 | |
692 #define SHIFT3 7 | |
693 #define COEFFS3 (int[]){113,113} | |
694 #define N4 2 | |
695 #define SHIFT4 9 | |
696 #define COEFFS4 (int[]){227,227} | |
697 #define SCALEX 1 | |
698 #elif 1 // 7/5 CDF | |
699 #define N1 0 | |
700 #define SHIFT1 1 | |
701 #define COEFFS1 NULL | |
702 #define N2 2 | |
703 #define SHIFT2 2 | |
704 #define COEFFS2 (int[]){-1,-1} | |
705 #define N3 2 | |
706 #define SHIFT3 0 | |
707 #define COEFFS3 (int[]){-1,-1} | |
708 #define N4 2 | |
709 #define SHIFT4 4 | |
710 #define COEFFS4 (int[]){3,3} | |
711 #elif 1 // 9/7 MN | |
712 #define N1 4 | |
713 #define SHIFT1 4 | |
714 #define COEFFS1 (int[]){1,-9,-9,1} | |
715 #define N2 2 | |
716 #define SHIFT2 2 | |
717 #define COEFFS2 (int[]){1,1} | |
718 #define N3 0 | |
719 #define SHIFT3 1 | |
720 #define COEFFS3 NULL | |
721 #define N4 0 | |
722 #define SHIFT4 1 | |
723 #define COEFFS4 NULL | |
724 #else // 13/7 CRF | |
725 #define N1 4 | |
726 #define SHIFT1 4 | |
727 #define COEFFS1 (int[]){1,-9,-9,1} | |
728 #define N2 4 | |
729 #define SHIFT2 4 | |
730 #define COEFFS2 (int[]){-1,5,5,-1} | |
731 #define N3 0 | |
732 #define SHIFT3 1 | |
733 #define COEFFS3 NULL | |
734 #define N4 0 | |
735 #define SHIFT4 1 | |
736 #define COEFFS4 NULL | |
737 #endif | |
738 static void horizontal_decomposeX(int *b, int width){ | |
739 int temp[width]; | |
740 const int width2= width>>1; | |
741 const int w2= (width+1)>>1; | |
742 int A1,A2,A3,A4, x; | |
743 | |
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); | |
748 | |
749 for(x=0; x<width2; x++){ | |
750 temp[x ]= b[2*x ]; | |
751 temp[x+w2]= b[2*x + 1]; | |
752 } | |
753 if(width&1) | |
754 temp[x ]= b[2*x ]; | |
755 memcpy(b, temp, width*sizeof(int)); | |
756 } | |
757 | |
758 static void horizontal_composeX(int *b, int width){ | |
759 int temp[width]; | |
760 const int width2= width>>1; | |
761 int A1,A2,A3,A4, x; | |
762 const int w2= (width+1)>>1; | |
763 | |
764 memcpy(temp, b, width*sizeof(int)); | |
765 for(x=0; x<width2; x++){ | |
766 b[2*x ]= temp[x ]; | |
767 b[2*x + 1]= temp[x+w2]; | |
768 } | |
769 if(width&1) | |
770 b[2*x ]= temp[x ]; | |
771 | |
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); | |
776 } | |
777 | |
778 static void spatial_decomposeX(int *buffer, int width, int height, int stride){ | |
779 int x, y; | |
780 | |
781 for(y=0; y<height; y++){ | |
782 for(x=0; x<width; x++){ | |
783 buffer[y*stride + x] *= SCALEX; | |
784 } | |
785 } | |
786 | |
787 for(y=0; y<height; y++){ | |
788 horizontal_decomposeX(buffer + y*stride, width); | |
789 } | |
790 | |
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); | |
795 } | |
796 | |
797 static void spatial_composeX(int *buffer, int width, int height, int stride){ | |
798 int x, y; | |
799 | |
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); | |
804 | |
805 for(y=0; y<height; y++){ | |
806 horizontal_composeX(buffer + y*stride, width); | |
807 } | |
808 | |
809 for(y=0; y<height; y++){ | |
810 for(x=0; x<width; x++){ | |
811 buffer[y*stride + x] /= SCALEX; | |
812 } | |
813 } | |
814 } | |
815 | |
816 static void horizontal_decompose53i(int *b, int width){ | |
817 int temp[width]; | |
818 const int width2= width>>1; | |
819 int A1,A2,A3,A4, x; | |
820 const int w2= (width+1)>>1; | |
821 | |
822 for(x=0; x<width2; x++){ | |
823 temp[x ]= b[2*x ]; | |
824 temp[x+w2]= b[2*x + 1]; | |
825 } | |
826 if(width&1) | |
827 temp[x ]= b[2*x ]; | |
828 #if 0 | |
829 A2= temp[1 ]; | |
830 A4= temp[0 ]; | |
831 A1= temp[0+width2]; | |
832 A1 -= (A2 + A4)>>1; | |
833 A4 += (A1 + 1)>>1; | |
834 b[0+width2] = A1; | |
835 b[0 ] = A4; | |
836 for(x=1; x+1<width2; x+=2){ | |
837 A3= temp[x+width2]; | |
838 A4= temp[x+1 ]; | |
839 A3 -= (A2 + A4)>>1; | |
840 A2 += (A1 + A3 + 2)>>2; | |
841 b[x+width2] = A3; | |
842 b[x ] = A2; | |
843 | |
844 A1= temp[x+1+width2]; | |
845 A2= temp[x+2 ]; | |
846 A1 -= (A2 + A4)>>1; | |
847 A4 += (A1 + A3 + 2)>>2; | |
848 b[x+1+width2] = A1; | |
849 b[x+1 ] = A4; | |
850 } | |
851 A3= temp[width-1]; | |
852 A3 -= A2; | |
853 A2 += (A1 + A3 + 2)>>2; | |
854 b[width -1] = A3; | |
855 b[width2-1] = A2; | |
856 #else | |
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); | |
859 #endif | |
860 } | |
861 | |
862 static void vertical_decompose53iH0(int *b0, int *b1, int *b2, int width){ | |
863 int i; | |
864 | |
865 for(i=0; i<width; i++){ | |
866 b1[i] -= (b0[i] + b2[i])>>1; | |
867 } | |
868 } | |
869 | |
870 static void vertical_decompose53iL0(int *b0, int *b1, int *b2, int width){ | |
871 int i; | |
872 | |
873 for(i=0; i<width; i++){ | |
874 b1[i] += (b0[i] + b2[i] + 2)>>2; | |
875 } | |
876 } | |
877 | |
878 static void spatial_decompose53i(int *buffer, int width, int height, int stride){ | |
879 int x, y; | |
880 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride; | |
881 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride; | |
882 | |
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; | |
886 | |
887 {START_TIMER | |
888 if(b1 <= b3) horizontal_decompose53i(b2, width); | |
889 if(y+2 < height) horizontal_decompose53i(b3, width); | |
890 STOP_TIMER("horizontal_decompose53i")} | |
891 | |
892 {START_TIMER | |
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*")} | |
896 | |
897 b0=b2; | |
898 b1=b3; | |
899 } | |
900 } | |
901 | |
902 #define lift5 lift | |
903 #if 1 | |
904 #define W_AM 3 | |
905 #define W_AO 0 | |
906 #define W_AS 1 | |
907 | |
908 #define W_BM 1 | |
909 #define W_BO 8 | |
910 #define W_BS 4 | |
911 | |
912 #undef lift5 | |
913 #define W_CM 9999 | |
914 #define W_CO 2 | |
915 #define W_CS 2 | |
916 | |
917 #define W_DM 15 | |
918 #define W_DO 16 | |
919 #define W_DS 5 | |
920 #elif 0 | |
921 #define W_AM 55 | |
922 #define W_AO 16 | |
923 #define W_AS 5 | |
924 | |
925 #define W_BM 3 | |
926 #define W_BO 32 | |
927 #define W_BS 6 | |
928 | |
929 #define W_CM 127 | |
930 #define W_CO 64 | |
931 #define W_CS 7 | |
932 | |
933 #define W_DM 7 | |
934 #define W_DO 8 | |
935 #define W_DS 4 | |
936 #elif 0 | |
937 #define W_AM 97 | |
938 #define W_AO 32 | |
939 #define W_AS 6 | |
940 | |
941 #define W_BM 63 | |
942 #define W_BO 512 | |
943 #define W_BS 10 | |
944 | |
945 #define W_CM 13 | |
946 #define W_CO 8 | |
947 #define W_CS 4 | |
948 | |
949 #define W_DM 15 | |
950 #define W_DO 16 | |
951 #define W_DS 5 | |
952 | |
953 #else | |
954 | |
955 #define W_AM 203 | |
956 #define W_AO 64 | |
957 #define W_AS 7 | |
958 | |
959 #define W_BM 217 | |
960 #define W_BO 2048 | |
961 #define W_BS 12 | |
962 | |
963 #define W_CM 113 | |
964 #define W_CO 64 | |
965 #define W_CS 7 | |
966 | |
967 #define W_DM 227 | |
968 #define W_DO 128 | |
969 #define W_DS 9 | |
970 #endif | |
971 static void horizontal_decompose97i(int *b, int width){ | |
972 int temp[width]; | |
973 const int w2= (width+1)>>1; | |
974 | |
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); | |
979 } | |
980 | |
981 | |
982 static void vertical_decompose97iH0(int *b0, int *b1, int *b2, int width){ | |
983 int i; | |
984 | |
985 for(i=0; i<width; i++){ | |
986 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
987 } | |
988 } | |
989 | |
990 static void vertical_decompose97iH1(int *b0, int *b1, int *b2, int width){ | |
991 int i; | |
992 | |
993 for(i=0; i<width; i++){ | |
994 #ifdef lift5 | |
995 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
996 #else | |
997 int r= 3*(b0[i] + b2[i]); | |
998 r+= r>>4; | |
999 r+= r>>8; | |
1000 b1[i] += (r+W_CO)>>W_CS; | |
1001 #endif | |
1002 } | |
1003 } | |
1004 | |
1005 static void vertical_decompose97iL0(int *b0, int *b1, int *b2, int width){ | |
1006 int i; | |
1007 | |
1008 for(i=0; i<width; i++){ | |
1009 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; | |
1010 } | |
1011 } | |
1012 | |
1013 static void vertical_decompose97iL1(int *b0, int *b1, int *b2, int width){ | |
1014 int i; | |
1015 | |
1016 for(i=0; i<width; i++){ | |
1017 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1018 } | |
1019 } | |
1020 | |
1021 static void spatial_decompose97i(int *buffer, int width, int height, int stride){ | |
1022 int x, y; | |
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; | |
1027 | |
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; | |
1031 | |
1032 {START_TIMER | |
1033 if(b3 <= b5) horizontal_decompose97i(b4, width); | |
1034 if(y+4 < height) horizontal_decompose97i(b5, width); | |
1035 if(width>400){ | |
1036 STOP_TIMER("horizontal_decompose97i") | |
1037 }} | |
1038 | |
1039 {START_TIMER | |
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); | |
1044 | |
1045 if(width>400){ | |
1046 STOP_TIMER("vertical_decompose97i") | |
1047 }} | |
1048 | |
1049 b0=b2; | |
1050 b1=b3; | |
1051 b2=b4; | |
1052 b3=b5; | |
1053 } | |
1054 } | |
1055 | |
2164 | 1056 void ff_spatial_dwt(int *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1057 int level; |
1058 | |
2164 | 1059 for(level=0; level<decomposition_count; level++){ |
1060 switch(type){ | |
2138 | 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; | |
1064 } | |
1065 } | |
1066 } | |
1067 | |
1068 static void horizontal_compose53i(int *b, int width){ | |
1069 int temp[width]; | |
1070 const int width2= width>>1; | |
1071 const int w2= (width+1)>>1; | |
1072 int A1,A2,A3,A4, x; | |
1073 | |
1074 #if 0 | |
1075 A2= temp[1 ]; | |
1076 A4= temp[0 ]; | |
1077 A1= temp[0+width2]; | |
1078 A1 -= (A2 + A4)>>1; | |
1079 A4 += (A1 + 1)>>1; | |
1080 b[0+width2] = A1; | |
1081 b[0 ] = A4; | |
1082 for(x=1; x+1<width2; x+=2){ | |
1083 A3= temp[x+width2]; | |
1084 A4= temp[x+1 ]; | |
1085 A3 -= (A2 + A4)>>1; | |
1086 A2 += (A1 + A3 + 2)>>2; | |
1087 b[x+width2] = A3; | |
1088 b[x ] = A2; | |
1089 | |
1090 A1= temp[x+1+width2]; | |
1091 A2= temp[x+2 ]; | |
1092 A1 -= (A2 + A4)>>1; | |
1093 A4 += (A1 + A3 + 2)>>2; | |
1094 b[x+1+width2] = A1; | |
1095 b[x+1 ] = A4; | |
1096 } | |
1097 A3= temp[width-1]; | |
1098 A3 -= A2; | |
1099 A2 += (A1 + A3 + 2)>>2; | |
1100 b[width -1] = A3; | |
1101 b[width2-1] = A2; | |
1102 #else | |
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); | |
1105 #endif | |
1106 for(x=0; x<width2; x++){ | |
1107 b[2*x ]= temp[x ]; | |
1108 b[2*x + 1]= temp[x+w2]; | |
1109 } | |
1110 if(width&1) | |
1111 b[2*x ]= temp[x ]; | |
1112 } | |
1113 | |
1114 static void vertical_compose53iH0(int *b0, int *b1, int *b2, int width){ | |
1115 int i; | |
1116 | |
1117 for(i=0; i<width; i++){ | |
1118 b1[i] += (b0[i] + b2[i])>>1; | |
1119 } | |
1120 } | |
1121 | |
1122 static void vertical_compose53iL0(int *b0, int *b1, int *b2, int width){ | |
1123 int i; | |
1124 | |
1125 for(i=0; i<width; i++){ | |
1126 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
1127 } | |
1128 } | |
1129 | |
1130 static void spatial_compose53i(int *buffer, int width, int height, int stride){ | |
1131 int x, y; | |
1132 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride; | |
1133 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride; | |
1134 | |
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; | |
1138 | |
1139 {START_TIMER | |
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*")} | |
1143 | |
1144 {START_TIMER | |
1145 if(y-1 >= 0) horizontal_compose53i(b0, width); | |
1146 if(b0 <= b2) horizontal_compose53i(b1, width); | |
1147 STOP_TIMER("horizontal_compose53i")} | |
1148 | |
1149 b0=b2; | |
1150 b1=b3; | |
1151 } | |
1152 } | |
1153 | |
1154 | |
1155 static void horizontal_compose97i(int *b, int width){ | |
1156 int temp[width]; | |
1157 const int w2= (width+1)>>1; | |
1158 | |
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); | |
1163 } | |
1164 | |
1165 static void vertical_compose97iH0(int *b0, int *b1, int *b2, int width){ | |
1166 int i; | |
1167 | |
1168 for(i=0; i<width; i++){ | |
1169 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1170 } | |
1171 } | |
1172 | |
1173 static void vertical_compose97iH1(int *b0, int *b1, int *b2, int width){ | |
1174 int i; | |
1175 | |
1176 for(i=0; i<width; i++){ | |
1177 #ifdef lift5 | |
1178 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1179 #else | |
1180 int r= 3*(b0[i] + b2[i]); | |
1181 r+= r>>4; | |
1182 r+= r>>8; | |
1183 b1[i] -= (r+W_CO)>>W_CS; | |
1184 #endif | |
1185 } | |
1186 } | |
1187 | |
1188 static void vertical_compose97iL0(int *b0, int *b1, int *b2, int width){ | |
1189 int i; | |
1190 | |
1191 for(i=0; i<width; i++){ | |
1192 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; | |
1193 } | |
1194 } | |
1195 | |
1196 static void vertical_compose97iL1(int *b0, int *b1, int *b2, int width){ | |
1197 int i; | |
1198 | |
1199 for(i=0; i<width; i++){ | |
1200 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1201 } | |
1202 } | |
1203 | |
1204 static void spatial_compose97i(int *buffer, int width, int height, int stride){ | |
1205 int x, y; | |
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; | |
1210 | |
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; | |
1214 | |
1215 if(stride == width && y+4 < height && 0){ | |
1216 int x; | |
1217 for(x=0; x<width/2; x++) | |
1218 b5[x] += 64*2; | |
1219 for(; x<width; x++) | |
1220 b5[x] += 169*2; | |
1221 } | |
1222 | |
1223 {START_TIMER | |
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); | |
1228 if(width>400){ | |
1229 STOP_TIMER("vertical_compose97i")}} | |
1230 | |
1231 {START_TIMER | |
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")}} | |
1236 | |
1237 b0=b2; | |
1238 b1=b3; | |
1239 b2=b4; | |
1240 b3=b5; | |
1241 } | |
1242 } | |
1243 | |
2164 | 1244 void ff_spatial_idwt(int *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1245 int level; |
1246 | |
2164 | 1247 for(level=decomposition_count-1; level>=0; level--){ |
1248 switch(type){ | |
2138 | 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; | |
1252 } | |
1253 } | |
1254 } | |
1255 | |
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}, | |
1261 }; | |
1262 #if 0 | |
1263 -o o- | |
1264 | | | |
1265 o-o | |
1266 | |
1267 -o-o o-o- | |
1268 | | | |
1269 o-o o-o | |
1270 | | | |
1271 o o-o o | |
1272 | | | | | |
1273 o-o o-o | |
1274 | |
1275 0112122312232334122323342334 | |
1276 0123456789ABCDEF0123456789AB | |
1277 RLLRMRRLLRRMRLLMLRRLMLLRRLLM | |
1278 | |
1279 4 B F 14 1B | |
1280 4 11 15 20 27 | |
1281 | |
1282 -o o-o-o o-o-o o- | |
1283 | | | | | | | |
1284 o-o o-o o-o o-o | |
1285 | | | |
1286 o-o o-o o-o o-o | |
1287 | | | | | | | |
1288 o o-o-o o-o-o o | |
1289 | | | |
1290 o-o o-o-o-o o-o | |
1291 | | | | | |
1292 o-o o-o o-o o-o | |
1293 | | | | | |
1294 o o-o o o o-o o | |
1295 | | | | | | | | | |
1296 o-o o-o o-o o-o | |
1297 | |
1298 #endif | |
1299 | |
1300 #define SVI(a, i, x, y) \ | |
1301 {\ | |
1302 a[i][0]= x;\ | |
1303 a[i][1]= y;\ | |
1304 i++;\ | |
1305 } | |
1306 | |
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; | |
1310 | |
1311 if(da[1] != db[1]) return da[1] - db[1]; | |
1312 else return da[0] - db[0]; | |
1313 } | |
1314 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1315 static int deint(unsigned int a){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1316 a &= 0x55555555; //0 1 2 3 4 5 6 7 8 9 A B C D E F |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1317 a += a & 0x11111111; // 01 23 45 67 89 AB CD EF |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1318 a += 3*(a & 0x0F0F0F0F);// 0123 4567 89AB CDEF |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1319 a += 15*(a & 0x00FF00FF);// 01234567 89ABCDEF |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1320 a +=255*(a & 0x0000FFFF);// 0123456789ABCDEF |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1321 return a>>15; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1322 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1323 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1324 static void encode_subband_z0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1325 const int level= b->level; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1326 const int w= b->width; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1327 const int h= b->height; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1328 int x, y, pos; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1329 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1330 if(1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1331 int run=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1332 int runs[w*h]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1333 int run_index=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1334 int count=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1335 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1336 for(pos=0; ; pos++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1337 int x= deint(pos ); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1338 int y= deint(pos>>1); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1339 int v, p=0, pr=0, pd=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1340 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1341 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1342 if(x>=w || y>=h){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1343 if(x>=w && y>=h) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1344 break; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1345 continue; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1346 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1347 count++; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1348 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1349 v= src[x + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1350 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1351 if(y){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1352 t= src[x + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1353 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1354 lt= src[x - 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1355 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1356 if(x + 1 < w){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1357 /*rt= src[x + 1 + (y-1)*stride]*/; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1358 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1359 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1360 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1361 l= src[x - 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1362 /*if(x > 1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1363 if(orientation==1) ll= src[y + (x-2)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1364 else ll= src[x - 2 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1365 }*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1366 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1367 if(parent){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1368 int px= x>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1369 int py= y>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1370 if(px<b->parent->width && py<b->parent->height){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1371 p= parent[px + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1372 /*if(px+1<b->parent->width) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1373 pr= parent[px + 1 + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1374 if(py+1<b->parent->height) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1375 pd= parent[px + (py+1)*2*stride];*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1376 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1377 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1378 if(!(/*ll|*/l|lt|t|/*rt|*/p)){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1379 if(v){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1380 runs[run_index++]= run; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1381 run=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1382 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1383 run++; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1384 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1385 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1386 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1387 assert(count==w*h); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1388 runs[run_index++]= run; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1389 run_index=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1390 run= runs[run_index++]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1391 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1392 put_symbol(&s->c, b->state[1], run, 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1393 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1394 for(pos=0; ; pos++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1395 int x= deint(pos ); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1396 int y= deint(pos>>1); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1397 int v, p=0, pr=0, pd=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1398 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1399 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1400 if(x>=w || y>=h){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1401 if(x>=w && y>=h) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1402 break; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1403 continue; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1404 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1405 v= src[x + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1406 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1407 if(y){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1408 t= src[x + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1409 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1410 lt= src[x - 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1411 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1412 if(x + 1 < w){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1413 // rt= src[x + 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1414 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1415 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1416 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1417 l= src[x - 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1418 /*if(x > 1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1419 if(orientation==1) ll= src[y + (x-2)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1420 else ll= src[x - 2 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1421 }*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1422 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1423 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1424 if(parent){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1425 int px= x>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1426 int py= y>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1427 if(px<b->parent->width && py<b->parent->height){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1428 p= parent[px + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1429 /* if(px+1<b->parent->width) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1430 pr= parent[px + 1 + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1431 if(py+1<b->parent->height) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1432 pd= parent[px + (py+1)*2*stride];*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1433 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1434 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1435 if(/*ll|*/l|lt|t|/*rt|*/p){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1436 int context= av_log2(/*ABS(ll) + */2*(3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p))); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1437 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1438 put_cabac(&s->c, &b->state[0][context], !!v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1439 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1440 if(!run){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1441 run= runs[run_index++]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1442 put_symbol(&s->c, b->state[1], run, 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1443 assert(v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1444 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1445 run--; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1446 assert(!v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1447 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1448 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1449 if(v){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1450 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p)); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1451 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1452 put_symbol(&s->c, b->state[context + 2], ABS(v)-1, 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1453 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1454 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1455 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1456 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1457 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1458 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1459 static void encode_subband_bp(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
2138 | 1460 const int level= b->level; |
1461 const int w= b->width; | |
1462 const int h= b->height; | |
1463 int x, y; | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1464 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1465 #if 0 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1466 int plane; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1467 for(plane=24; plane>=0; plane--){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1468 int run=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1469 int runs[w*h]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1470 int run_index=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1471 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1472 for(y=0; y<h; y++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1473 for(x=0; x<w; x++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1474 int v, lv, p=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1475 int d=0, r=0, rd=0, ld=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1476 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1477 v= src[x + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1478 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1479 if(y){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1480 t= src[x + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1481 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1482 lt= src[x - 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1483 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1484 if(x + 1 < w){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1485 rt= src[x + 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1486 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1487 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1488 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1489 l= src[x - 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1490 /*if(x > 1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1491 if(orientation==1) ll= src[y + (x-2)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1492 else ll= src[x - 2 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1493 }*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1494 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1495 if(y+1<h){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1496 d= src[x + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1497 if(x) ld= src[x - 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1498 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1499 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1500 if(x + 1 < w) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1501 r= src[x + 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1502 if(parent){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1503 int px= x>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1504 int py= y>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1505 if(px<b->parent->width && py<b->parent->height) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1506 p= parent[px + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1507 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1508 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane))); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1509 lv=v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1510 HIDE( v, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1511 HIDE(lv, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1512 HIDE( p, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1513 HIDE( l, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1514 HIDE(lt, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1515 HIDE( t, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1516 HIDE(rt, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1517 HIDE( r, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1518 HIDE(rd, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1519 HIDE( d, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1520 HIDE(ld, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1521 if(!(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv)){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1522 if(v){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1523 runs[run_index++]= run; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1524 run=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1525 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1526 run++; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1527 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1528 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1529 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1530 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1531 runs[run_index++]= run; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1532 run_index=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1533 run= runs[run_index++]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1534 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1535 put_symbol(&s->c, b->state[1], run, 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1536 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1537 for(y=0; y<h; y++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1538 for(x=0; x<w; x++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1539 int v, p=0, lv; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1540 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1541 int d=0, r=0, rd=0, ld=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1542 v= src[x + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1543 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1544 if(y){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1545 t= src[x + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1546 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1547 lt= src[x - 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1548 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1549 if(x + 1 < w){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1550 rt= src[x + 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1551 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1552 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1553 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1554 l= src[x - 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1555 /*if(x > 1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1556 if(orientation==1) ll= src[y + (x-2)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1557 else ll= src[x - 2 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1558 }*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1559 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1560 if(y+1<h){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1561 d= src[x + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1562 if(x) ld= src[x - 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1563 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1564 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1565 if(x + 1 < w) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1566 r= src[x + 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1567 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1568 if(parent){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1569 int px= x>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1570 int py= y>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1571 if(px<b->parent->width && py<b->parent->height) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1572 p= parent[px + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1573 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1574 lv=v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1575 HIDE( v, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1576 HIDE(lv, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1577 HIDE( p, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1578 HIDE( l, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1579 HIDE(lt, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1580 HIDE( t, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1581 HIDE(rt, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1582 HIDE( r, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1583 HIDE(rd, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1584 HIDE( d, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1585 HIDE(ld, plane+1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1586 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1587 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1588 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld)); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1589 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1590 if(lv) put_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)], !!(v-lv)); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1591 else put_cabac(&s->c, &b->state[ 0][context], !!v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1592 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1593 assert(!lv); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1594 if(!run){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1595 run= runs[run_index++]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1596 put_symbol(&s->c, b->state[1], run, 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1597 assert(v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1598 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1599 run--; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1600 assert(!v); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1601 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1602 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1603 if(v && !lv){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1604 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1605 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1606 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + context], v<0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1607 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1608 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1609 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1610 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1611 return; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1612 #endif |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1613 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1614 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1615 static void encode_subband_X(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1616 const int level= b->level; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1617 const int w= b->width; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1618 const int h= b->height; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1619 int x, y; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1620 |
2149 | 1621 #if 0 |
2138 | 1622 if(orientation==3 && parent && 0){ |
1623 int16_t candidate[w*h][2]; | |
1624 uint8_t state[w*h]; | |
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; | |
1630 int rle_pos=0; | |
1631 int v, last_v; | |
1632 int primary= orientation==1; | |
1633 | |
1634 memset(candidate, 0, sizeof(candidate)); | |
1635 memset(state, 0, sizeof(state)); | |
1636 memset(boarder, 0, sizeof(boarder)); | |
1637 | |
1638 for(y=0; y<h; y++){ | |
1639 for(x=0; x<w; x++){ | |
1640 if(parent[(x>>1) + (y>>1)*2*stride]) | |
1641 SVI(candidate, candidate_count, x, y) | |
1642 } | |
1643 } | |
1644 | |
1645 for(;;){ | |
1646 while(candidate_count && !boarder_count[0] && !boarder_count[1] && !boarder_count[2]){ | |
1647 candidate_count--; | |
1648 x= candidate[ candidate_count][0]; | |
1649 y= candidate[ candidate_count][1]; | |
1650 if(state[x + y*w]) | |
1651 continue; | |
1652 state[x + y*w]= 1; | |
1653 v= !!src[x + y*stride]; | |
1654 put_cabac(&s->c, &b->state[0][0], v); | |
1655 if(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) | |
1665 } | |
1666 } | |
1667 while(!boarder_count[0] && !boarder_count[1] && !boarder_count[2] && rle_pos < w*h){ | |
1668 int run=0; | |
1669 for(; rle_pos < w*h;){ | |
1670 x= rle_pos % w; //FIXME speed | |
1671 y= rle_pos / w; | |
1672 rle_pos++; | |
1673 if(state[x + y*w]) | |
1674 continue; | |
1675 state[x + y*w]= 1; | |
1676 v= !!src[x + y*stride]; | |
1677 if(v){ | |
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) | |
1688 break; | |
1689 //FIXME note only right & down can be boarders | |
1690 } | |
1691 run++; | |
1692 } | |
1693 } | |
1694 if(!boarder_count[0] && !boarder_count[1] && !boarder_count[2]) | |
1695 break; | |
1696 | |
1697 while(boarder_count[0] || boarder_count[1] || boarder_count[2]){ | |
1698 int index; | |
1699 | |
1700 if (boarder_count[ primary]) index= primary; | |
1701 else if(boarder_count[1-primary]) index=1-primary; | |
1702 else index=2; | |
1703 | |
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 | |
1708 continue; | |
1709 state[x + y*w]= 1; | |
1710 v= !!src[x + y*stride]; | |
1711 put_cabac(&s->c, &b->state[0][index+1], v); | |
1712 if(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) | |
1722 } | |
1723 } | |
1724 } | |
1725 //FIXME sort significant coeffs maybe | |
1726 if(1){ | |
1727 qsort(significant, significant_count, sizeof(int16_t[2]), sig_cmp); | |
1728 } | |
1729 | |
1730 last_v=1; | |
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!! | |
1738 last_v= v; | |
1739 } | |
1740 } | |
1741 #endif | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1742 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1743 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1744 static void encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1745 const int level= b->level; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1746 const int w= b->width; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1747 const int h= b->height; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1748 int x, y; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1749 |
2138 | 1750 if(1){ |
1751 int run=0; | |
2149 | 1752 int runs[w*h]; |
2138 | 1753 int run_index=0; |
1754 | |
1755 for(y=0; y<h; y++){ | |
1756 for(x=0; x<w; x++){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1757 int v, p=0; |
2144 | 1758 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
2149 | 1759 v= src[x + y*stride]; |
2138 | 1760 |
1761 if(y){ | |
2149 | 1762 t= src[x + (y-1)*stride]; |
2138 | 1763 if(x){ |
2149 | 1764 lt= src[x - 1 + (y-1)*stride]; |
2138 | 1765 } |
1766 if(x + 1 < w){ | |
2149 | 1767 rt= src[x + 1 + (y-1)*stride]; |
2138 | 1768 } |
1769 } | |
1770 if(x){ | |
2149 | 1771 l= src[x - 1 + y*stride]; |
2144 | 1772 /*if(x > 1){ |
1773 if(orientation==1) ll= src[y + (x-2)*stride]; | |
1774 else ll= src[x - 2 + y*stride]; | |
2138 | 1775 }*/ |
1776 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1777 if(parent){ |
2149 | 1778 int px= x>>1; |
1779 int py= y>>1; | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1780 if(px<b->parent->width && py<b->parent->height) |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1781 p= parent[px + py*2*stride]; |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1782 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1783 if(!(/*ll|*/l|lt|t|rt|p)){ |
2138 | 1784 if(v){ |
1785 runs[run_index++]= run; | |
1786 run=0; | |
1787 }else{ | |
1788 run++; | |
1789 } | |
1790 } | |
1791 } | |
1792 } | |
1793 runs[run_index++]= run; | |
1794 run_index=0; | |
1795 run= runs[run_index++]; | |
1796 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1797 put_symbol2(&s->c, b->state[1], run, 3); |
2138 | 1798 |
1799 for(y=0; y<h; y++){ | |
1800 for(x=0; x<w; x++){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1801 int v, p=0; |
2144 | 1802 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
2149 | 1803 v= src[x + y*stride]; |
2138 | 1804 |
1805 if(y){ | |
2149 | 1806 t= src[x + (y-1)*stride]; |
2138 | 1807 if(x){ |
2149 | 1808 lt= src[x - 1 + (y-1)*stride]; |
2138 | 1809 } |
1810 if(x + 1 < w){ | |
2149 | 1811 rt= src[x + 1 + (y-1)*stride]; |
2138 | 1812 } |
1813 } | |
1814 if(x){ | |
2149 | 1815 l= src[x - 1 + y*stride]; |
2144 | 1816 /*if(x > 1){ |
1817 if(orientation==1) ll= src[y + (x-2)*stride]; | |
1818 else ll= src[x - 2 + y*stride]; | |
2138 | 1819 }*/ |
1820 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1821 if(parent){ |
2149 | 1822 int px= x>>1; |
1823 int py= y>>1; | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1824 if(px<b->parent->width && py<b->parent->height) |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1825 p= parent[px + py*2*stride]; |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1826 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1827 if(/*ll|*/l|lt|t|rt|p){ |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1828 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1829 |
1830 put_cabac(&s->c, &b->state[0][context], !!v); | |
2138 | 1831 }else{ |
1832 if(!run){ | |
1833 run= runs[run_index++]; | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1834 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1835 put_symbol2(&s->c, b->state[1], run, 3); |
2138 | 1836 assert(v); |
1837 }else{ | |
1838 run--; | |
1839 assert(!v); | |
1840 } | |
1841 } | |
1842 if(v){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1843 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1844 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
1845 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4); |
2138 | 1846 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0); |
1847 } | |
1848 } | |
1849 } | |
1850 } | |
1851 } | |
1852 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1853 static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1854 // encode_subband_qtree(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1855 // encode_subband_z0run(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1856 encode_subband_c0run(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1857 // encode_subband_dzr(s, b, src, parent, stride, orientation); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1858 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1859 |
2149 | 1860 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
2138 | 1861 const int level= b->level; |
1862 const int w= b->width; | |
1863 const int h= b->height; | |
1864 int x,y; | |
1865 | |
1866 START_TIMER | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1867 #if 0 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1868 for(y=0; y<b->height; y++) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1869 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM)); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1870 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1871 int plane; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1872 for(plane=24; plane>=0; plane--){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1873 int run; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1874 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1875 run= get_symbol(&s->c, b->state[1], 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1876 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1877 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane))); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1878 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1879 for(y=0; y<h; y++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1880 for(x=0; x<w; x++){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1881 int v, p=0, lv; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1882 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1883 int d=0, r=0, rd=0, ld=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1884 lv= src[x + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1885 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1886 if(y){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1887 t= src[x + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1888 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1889 lt= src[x - 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1890 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1891 if(x + 1 < w){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1892 rt= src[x + 1 + (y-1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1893 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1894 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1895 if(x){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1896 l= src[x - 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1897 /*if(x > 1){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1898 if(orientation==1) ll= src[y + (x-2)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1899 else ll= src[x - 2 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1900 }*/ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1901 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1902 if(y+1<h){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1903 d= src[x + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1904 if(x) ld= src[x - 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1905 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1906 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1907 if(x + 1 < w) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1908 r= src[x + 1 + y*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1909 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1910 if(parent){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1911 int px= x>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1912 int py= y>>1; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1913 if(px<b->parent->width && py<b->parent->height) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1914 p= parent[px + py*2*stride]; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1915 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1916 HIDE( p, plane) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1917 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1918 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1919 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld)); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1920 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1921 if(lv){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1922 assert(context + 8*av_log2(ABS(lv)) < 512 - 100); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1923 if(get_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)])){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1924 if(lv<0) v= lv - (1<<plane); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1925 else v= lv + (1<<plane); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1926 }else |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1927 v=lv; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1928 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1929 v= get_cabac(&s->c, &b->state[ 0][context]) << plane; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1930 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1931 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1932 assert(!lv); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1933 if(!run){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1934 run= get_symbol(&s->c, b->state[1], 0); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1935 v= 1<<plane; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1936 }else{ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1937 run--; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1938 v=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1939 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1940 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1941 if(v && !lv){ |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1942 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1943 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1); |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1944 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + context])) |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1945 v= -v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1946 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1947 src[x + y*stride]= v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1948 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1949 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1950 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1951 return; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1952 #endif |
2138 | 1953 if(1){ |
1954 int run; | |
1955 | |
1956 for(y=0; y<b->height; y++) | |
1957 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM)); | |
1958 | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1959 run= get_symbol2(&s->c, b->state[1], 3); |
2138 | 1960 for(y=0; y<h; y++){ |
1961 for(x=0; x<w; x++){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1962 int v, p=0; |
2144 | 1963 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
2138 | 1964 |
1965 if(y){ | |
2149 | 1966 t= src[x + (y-1)*stride]; |
2138 | 1967 if(x){ |
2149 | 1968 lt= src[x - 1 + (y-1)*stride]; |
2138 | 1969 } |
1970 if(x + 1 < w){ | |
2149 | 1971 rt= src[x + 1 + (y-1)*stride]; |
2138 | 1972 } |
1973 } | |
1974 if(x){ | |
2149 | 1975 l= src[x - 1 + y*stride]; |
2144 | 1976 /*if(x > 1){ |
1977 if(orientation==1) ll= src[y + (x-2)*stride]; | |
1978 else ll= src[x - 2 + y*stride]; | |
2138 | 1979 }*/ |
1980 } | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1981 if(parent){ |
2149 | 1982 int px= x>>1; |
1983 int py= y>>1; | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1984 if(px<b->parent->width && py<b->parent->height) |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1985 p= parent[px + py*2*stride]; |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1986 } |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1987 if(/*ll|*/l|lt|t|rt|p){ |
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1988 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2144 | 1989 |
1990 v=get_cabac(&s->c, &b->state[0][context]); | |
2138 | 1991 }else{ |
1992 if(!run){ | |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1993 run= get_symbol2(&s->c, b->state[1], 3); |
2138 | 1994 //FIXME optimize this here |
1995 //FIXME try to store a more naive run | |
1996 v=1; | |
1997 }else{ | |
1998 run--; | |
1999 v=0; | |
2000 } | |
2001 } | |
2002 if(v){ | |
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
2003 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
2004 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1; |
2138 | 2005 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])) |
2006 v= -v; | |
2149 | 2007 src[x + y*stride]= v; |
2138 | 2008 } |
2009 } | |
2010 } | |
2011 if(level+1 == s->spatial_decomposition_count){ | |
2012 STOP_TIMER("decode_subband") | |
2013 } | |
2014 | |
2015 return; | |
2016 } | |
2017 } | |
2018 | |
2019 static void reset_contexts(SnowContext *s){ | |
2020 int plane_index, level, orientation; | |
2021 | |
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)); | |
2026 } | |
2027 } | |
2028 } | |
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)); | |
2033 } | |
2034 | |
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){ | |
2036 int x, y; | |
2037 | |
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; | |
2051 | |
2052 // if(b_w==16) am= 8*(a1+a2); | |
2053 | |
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; | |
2056 | |
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;*/ | |
2061 } | |
2062 } | |
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;*/ | |
2075 | |
2076 // if(b_w==16) am= 8*(a1+a2); | |
2077 | |
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; | |
2080 | |
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;*/ | |
2085 } | |
2086 } | |
2087 } | |
2088 | |
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);\ | |
2093 } | |
2094 | |
2095 mcb( 0, 0,16) | |
2096 mcb( 4, 0,16) | |
2097 mcb( 8, 0,16) | |
2098 mcb(12, 0,16) | |
2099 mcb( 0, 4,16) | |
2100 mcb( 4, 4,16) | |
2101 mcb( 8, 4,16) | |
2102 mcb(12, 4,16) | |
2103 mcb( 0, 8,16) | |
2104 mcb( 4, 8,16) | |
2105 mcb( 8, 8,16) | |
2106 mcb(12, 8,16) | |
2107 mcb( 0,12,16) | |
2108 mcb( 4,12,16) | |
2109 mcb( 8,12,16) | |
2110 mcb(12,12,16) | |
2111 | |
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)];\ | |
2115 assert(h==b_w);\ | |
2116 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\ | |
2117 } | |
2118 | |
2119 mca( 0, 0,16) | |
2120 mca( 8, 0,16) | |
2121 mca( 0, 8,16) | |
2122 mca( 8, 8,16) | |
2123 | |
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 | |
2126 int x,y; | |
2127 | |
2128 if(s_x<0){ | |
2129 obmc -= s_x; | |
2130 b_w += s_x; | |
2131 s_x=0; | |
2132 }else if(s_x + b_w > w){ | |
2133 b_w = w - s_x; | |
2134 } | |
2135 if(s_y<0){ | |
2136 obmc -= s_y*obmc_stride; | |
2137 b_h += s_y; | |
2138 s_y=0; | |
2139 }else if(s_y + b_h> h){ | |
2140 b_h = h - s_y; | |
2141 } | |
2142 | |
2152 | 2143 if(b_w<=0 || b_h<=0) return; |
2144 | |
2138 | 2145 dst += s_x + s_y*dst_stride; |
2146 | |
2147 if(mb_type==1){ | |
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); | |
2153 } | |
2154 } | |
2155 }else{ | |
2156 int dx= mv_x&15; | |
2157 int dy= mv_y&15; | |
2158 // int dxy= (mv_x&1) + 2*(mv_y&1); | |
2159 | |
2160 s_x += (mv_x>>4) - 2; | |
2161 s_y += (mv_y>>4) - 2; | |
2162 src += s_x + s_y*src_stride; | |
2163 //use dsputil | |
2164 | |
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); | |
2168 src= tmp + 32; | |
2169 } | |
2170 | |
2171 if(mb_type==0){ | |
2172 mc_block(tmp, src, tmp + 64+8, src_stride, b_w, b_h, dx, dy); | |
2173 }else{ | |
2174 int sum=0; | |
2175 for(y=0; y < b_h; y++){ | |
2176 for(x=0; x < b_w; x++){ | |
2177 sum += src[x+ y*src_stride]; | |
2178 } | |
2179 } | |
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; | |
2184 } | |
2185 } | |
2186 } | |
2187 | |
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); | |
2192 } | |
2193 } | |
2194 } | |
2195 } | |
2196 | |
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]; | |
2209 int w= p->width; | |
2210 int h= p->height; | |
2211 | |
2212 if(s->avctx->debug&512){ | |
2213 for(y=0; y<h; y++){ | |
2214 for(x=0; x<w; x++){ | |
2215 if(add) buf[x + y*w]+= 128*256; | |
2216 else buf[x + y*w]-= 128*256; | |
2217 } | |
2218 } | |
2219 | |
2220 return; | |
2221 } | |
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; | |
2225 | |
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, | |
2231 w, h, | |
2232 w, ref_stride, obmc_stride, | |
2233 s->mb_band.buf[index], add); | |
2234 | |
2235 } | |
2236 } | |
2237 } | |
2238 | |
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); | |
2150 | 2245 int x,y, thres1, thres2; |
2246 START_TIMER | |
2138 | 2247 |
2248 assert(QROOT==8); | |
2249 | |
2161 | 2250 if(s->qlog == LOSSLESS_QLOG) return; |
2251 | |
2138 | 2252 bias= bias ? 0 : (3*qmul)>>3; |
2150 | 2253 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
2254 thres2= 2*thres1; | |
2138 | 2255 |
2256 if(!bias){ | |
2257 for(y=0; y<h; y++){ | |
2258 for(x=0; x<w; x++){ | |
2150 | 2259 int i= src[x + y*stride]; |
2260 | |
2261 if((unsigned)(i+thres1) > thres2){ | |
2262 if(i>=0){ | |
2263 i<<= QEXPSHIFT; | |
2264 i/= qmul; //FIXME optimize | |
2265 src[x + y*stride]= i; | |
2266 }else{ | |
2267 i= -i; | |
2268 i<<= QEXPSHIFT; | |
2269 i/= qmul; //FIXME optimize | |
2270 src[x + y*stride]= -i; | |
2271 } | |
2272 }else | |
2273 src[x + y*stride]= 0; | |
2138 | 2274 } |
2275 } | |
2276 }else{ | |
2277 for(y=0; y<h; y++){ | |
2278 for(x=0; x<w; x++){ | |
2279 int i= src[x + y*stride]; | |
2280 | |
2150 | 2281 if((unsigned)(i+thres1) > thres2){ |
2282 if(i>=0){ | |
2283 i<<= QEXPSHIFT; | |
2284 i= (i + bias) / qmul; //FIXME optimize | |
2285 src[x + y*stride]= i; | |
2286 }else{ | |
2287 i= -i; | |
2288 i<<= QEXPSHIFT; | |
2289 i= (i + bias) / qmul; //FIXME optimize | |
2290 src[x + y*stride]= -i; | |
2291 } | |
2292 }else | |
2293 src[x + y*stride]= 0; | |
2138 | 2294 } |
2295 } | |
2296 } | |
2150 | 2297 if(level+1 == s->spatial_decomposition_count){ |
2298 // STOP_TIMER("quantize") | |
2299 } | |
2138 | 2300 } |
2301 | |
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; | |
2309 int x,y; | |
2310 | |
2161 | 2311 if(s->qlog == LOSSLESS_QLOG) return; |
2312 | |
2138 | 2313 assert(QROOT==8); |
2314 | |
2315 for(y=0; y<h; y++){ | |
2316 for(x=0; x<w; x++){ | |
2317 int i= src[x + y*stride]; | |
2318 if(i<0){ | |
2319 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
2320 }else if(i>0){ | |
2321 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
2322 } | |
2323 } | |
2324 } | |
2325 } | |
2326 | |
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; | |
2330 int x,y; | |
2331 | |
2332 for(y=h-1; y>=0; y--){ | |
2333 for(x=w-1; x>=0; x--){ | |
2334 int i= x + y*stride; | |
2335 | |
2336 if(x){ | |
2337 if(use_median){ | |
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]; | |
2340 }else{ | |
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]; | |
2343 } | |
2344 }else{ | |
2345 if(y) src[i] -= src[i - stride]; | |
2346 } | |
2347 } | |
2348 } | |
2349 } | |
2350 | |
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; | |
2354 int x,y; | |
2355 | |
2356 for(y=0; y<h; y++){ | |
2357 for(x=0; x<w; x++){ | |
2358 int i= x + y*stride; | |
2359 | |
2360 if(x){ | |
2361 if(use_median){ | |
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]; | |
2364 }else{ | |
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]; | |
2367 } | |
2368 }else{ | |
2369 if(y) src[i] += src[i - stride]; | |
2370 } | |
2371 } | |
2372 } | |
2373 } | |
2374 | |
2375 static void encode_header(SnowContext *s){ | |
2376 int plane_index, level, orientation; | |
2377 | |
2378 put_cabac(&s->c, s->header_state, s->keyframe); // state clearing stuff? | |
2379 if(s->keyframe){ | |
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); | |
2391 | |
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); | |
2397 } | |
2398 } | |
2399 } | |
2400 } | |
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); | |
2405 } | |
2406 | |
2407 static int decode_header(SnowContext *s){ | |
2408 int plane_index, level, orientation; | |
2409 | |
2410 s->keyframe= get_cabac(&s->c, s->header_state); | |
2411 if(s->keyframe){ | |
2412 s->version= get_symbol(&s->c, s->header_state, 0); | |
2413 if(s->version>0){ | |
2414 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version); | |
2415 return -1; | |
2416 } | |
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); | |
2427 | |
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++){ | |
2431 int q; | |
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; | |
2436 } | |
2437 } | |
2438 } | |
2439 } | |
2440 | |
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); | |
2444 return -1; | |
2445 } | |
2446 | |
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); | |
2450 | |
2451 return 0; | |
2452 } | |
2453 | |
2454 static int common_init(AVCodecContext *avctx){ | |
2455 SnowContext *s = avctx->priv_data; | |
2456 int width, height; | |
2457 int level, orientation, plane_index, dec; | |
2458 | |
2459 s->avctx= avctx; | |
2460 | |
2461 dsputil_init(&s->dsp, avctx); | |
2462 | |
2463 #define mcf(dx,dy)\ | |
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; | |
2467 | |
2468 mcf( 0, 0) | |
2469 mcf( 4, 0) | |
2470 mcf( 8, 0) | |
2471 mcf(12, 0) | |
2472 mcf( 0, 4) | |
2473 mcf( 4, 4) | |
2474 mcf( 8, 4) | |
2475 mcf(12, 4) | |
2476 mcf( 0, 8) | |
2477 mcf( 4, 8) | |
2478 mcf( 8, 8) | |
2479 mcf(12, 8) | |
2480 mcf( 0,12) | |
2481 mcf( 4,12) | |
2482 mcf( 8,12) | |
2483 mcf(12,12) | |
2484 | |
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; | |
2489 | |
2490 mcfh(0, 0) | |
2491 mcfh(8, 0) | |
2492 mcfh(0, 8) | |
2493 mcfh(8, 8) | |
2494 | |
2495 dec= s->spatial_decomposition_count= 5; | |
2496 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type | |
2497 | |
2498 s->chroma_h_shift= 1; //FIXME XXX | |
2499 s->chroma_v_shift= 1; | |
2500 | |
2501 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift); | |
2502 | |
2503 s->b_width = (s->avctx->width +(1<<dec)-1)>>dec; | |
2504 s->b_height= (s->avctx->height+(1<<dec)-1)>>dec; | |
2505 | |
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)); | |
2508 | |
2509 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4; | |
2510 | |
2511 for(plane_index=0; plane_index<3; plane_index++){ | |
2512 int w= s->avctx->width; | |
2513 int h= s->avctx->height; | |
2514 | |
2515 if(plane_index){ | |
2516 w>>= s->chroma_h_shift; | |
2517 h>>= s->chroma_v_shift; | |
2518 } | |
2519 s->plane[plane_index].width = w; | |
2520 s->plane[plane_index].height= h; | |
2160 | 2521 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h); |
2138 | 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]; | |
2525 | |
2526 b->buf= s->spatial_dwt_buffer; | |
2527 b->level= level; | |
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; | |
2531 | |
2532 if(orientation&1) b->buf += (w+1)>>1; | |
2533 if(orientation>1) b->buf += b->stride>>1; | |
2534 | |
2535 if(level) | |
2536 b->parent= &s->plane[plane_index].band[level-1][orientation]; | |
2537 } | |
2538 w= (w+1)>>1; | |
2539 h= (h+1)>>1; | |
2540 } | |
2541 } | |
2542 | |
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)); | |
2550 | |
2551 reset_contexts(s); | |
2552 /* | |
2553 width= s->width= avctx->width; | |
2554 height= s->height= avctx->height; | |
2555 | |
2556 assert(width && height); | |
2557 */ | |
2558 s->avctx->get_buffer(s->avctx, &s->mconly_picture); | |
2559 | |
2560 return 0; | |
2561 } | |
2562 | |
2563 | |
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; | |
2568 | |
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; | |
2573 int64_t error=0; | |
2574 | |
2575 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height); | |
2576 buf[b->width/2 + b->height/2*b->stride]= 256*256; | |
2164 | 2577 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 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]; | |
2581 error += d*d; | |
2582 } | |
2583 } | |
2584 | |
2585 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
2164 | 2586 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/); |
2138 | 2587 } |
2588 } | |
2589 } | |
2590 | |
2591 static int encode_init(AVCodecContext *avctx) | |
2592 { | |
2593 SnowContext *s = avctx->priv_data; | |
2594 int i; | |
2595 int level, orientation, plane_index; | |
2596 | |
2151 | 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"); | |
2600 return -1; | |
2601 } | |
2602 | |
2138 | 2603 common_init(avctx); |
2604 | |
2605 s->version=0; | |
2606 | |
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 | |
2614 | |
2615 for(plane_index=0; plane_index<3; plane_index++){ | |
2616 calculate_vissual_weight(s, &s->plane[plane_index]); | |
2617 } | |
2618 | |
2619 | |
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: | |
2625 case PIX_FMT_GRAY8: | |
2626 // case PIX_FMT_YUV411P: | |
2627 // case PIX_FMT_YUV410P: | |
2628 s->colorspace_type= 0; | |
2629 break; | |
2630 /* case PIX_FMT_RGBA32: | |
2631 s->colorspace= 1; | |
2632 break;*/ | |
2633 default: | |
2634 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); | |
2635 return -1; | |
2636 } | |
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; | |
2640 return 0; | |
2641 } | |
2642 | |
2643 static int frame_start(SnowContext *s){ | |
2644 AVFrame tmp; | |
2645 | |
2646 if(s->keyframe) | |
2647 reset_contexts(s); | |
2648 | |
2649 tmp= s->last_picture; | |
2650 s->last_picture= s->current_picture; | |
2651 s->current_picture= tmp; | |
2652 | |
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"); | |
2656 return -1; | |
2657 } | |
2658 | |
2659 return 0; | |
2660 } | |
2661 | |
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; | |
2668 int used_count= 0; | |
2669 int log2_threshold, level, orientation, plane_index, i; | |
2670 | |
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); | |
2673 | |
2674 s->input_picture = *pict; | |
2675 | |
2676 memset(s->header_state, 0, sizeof(s->header_state)); | |
2677 | |
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; | |
2680 | |
2161 | 2681 if(pict->quality){ |
2682 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2)); | |
2683 //<64 >60 | |
2684 s->qlog += 61; | |
2685 }else{ | |
2686 s->qlog= LOSSLESS_QLOG; | |
2687 } | |
2138 | 2688 |
2689 for(i=0; i<s->mb_band.stride * s->mb_band.height; i++){ | |
2690 s->mb_band.buf[i]= s->keyframe; | |
2691 } | |
2692 | |
2693 frame_start(s); | |
2694 | |
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]; | |
2701 int x,y; | |
2702 | |
2703 assert(s->current_picture.data[0]); | |
2704 assert(s->last_picture.data[0]); | |
2705 | |
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; | |
2712 s->m.linesize= | |
2713 s->m. last_picture.linesize[0]= | |
2714 s->m. new_picture.linesize[0]= | |
2715 s->m.current_picture.linesize[0]= stride; | |
2716 s->m.width = width; | |
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; | |
2722 s->m.f_code=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; | |
2730 | |
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; | |
2734 | |
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)); | |
2738 } | |
2739 | |
2740 s->m.mb_type= s->mb_type; | |
2741 | |
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; | |
2747 | |
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 | |
2751 ff_init_me(&s->m); | |
2752 | |
2753 | |
2754 s->m.me.pre_pass=1; | |
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]; | |
2759 | |
2760 s->m.new_picture.data[0]= src - y*16*stride; //ugly | |
2761 s->m.mb_y= y; | |
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]; | |
2766 } | |
2767 for(; i<16 && i + 16*y<16*block_height; i++) | |
2768 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width); | |
2769 | |
2770 for(x=block_width-1; x >=0 ;x--) { | |
2771 s->m.mb_x= 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); | |
2775 } | |
2776 s->m.first_slice_line=0; | |
2777 } | |
2778 s->m.me.pre_pass=0; | |
2779 | |
2780 | |
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]; | |
2785 | |
2786 s->m.new_picture.data[0]= src - y*16*stride; //ugly | |
2787 s->m.mb_y= y; | |
2788 | |
2789 assert(width <= stride); | |
2790 assert(width <= 16*block_width); | |
2791 | |
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]; | |
2796 } | |
2797 for(; i<16 && i + 16*y<16*block_height; i++) | |
2798 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width); | |
2799 | |
2800 for (x = 0; x < block_width; x++) { | |
2801 int mb_xy= x + y*(s->mb_band.stride); | |
2802 s->m.mb_x= x; | |
2803 ff_init_block_index(&s->m); | |
2804 ff_update_block_index(&s->m); | |
2805 | |
2806 ff_estimate_p_frame_motion(&s->m, x, y); | |
2807 | |
2808 s->mb_band .buf[mb_xy]= (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER) | |
2809 ? 0 : 2; | |
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]; | |
2812 | |
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; | |
2816 | |
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 ]; | |
2820 dc2= (dc0+dc1)>>1; | |
2821 #if 0 | |
2822 if (ABS(dc0 - dc) < ABS(dc1 - dc) && ABS(dc0 - dc) < ABS(dc2 - dc)) | |
2823 dir= 1; | |
2824 else if(ABS(dc0 - dc) >=ABS(dc1 - dc) && ABS(dc1 - dc) < ABS(dc2 - dc)) | |
2825 dir=-1; | |
2826 else | |
2827 dir=0; | |
2828 #endif | |
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; | |
2833 }else if(y){ | |
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; | |
2837 } | |
2838 } | |
2839 // s->mb_band .buf[x + y*(s->mb_band.stride)]=1; //FIXME intra only test | |
2840 } | |
2841 s->m.first_slice_line=0; | |
2842 } | |
2843 assert(s->m.pict_type == P_TYPE); | |
2844 if(s->m.me.scene_change_score > s->avctx->scenechange_threshold){ | |
2845 s->m.pict_type= | |
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; | |
2851 } | |
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); | |
2853 } | |
2854 } | |
2855 | |
2856 s->m.first_slice_line=1; | |
2857 | |
2858 s->qbias= pict->pict_type == P_TYPE ? 2 : 0; | |
2859 | |
2860 encode_header(s); | |
2861 | |
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); | |
2868 | |
2869 //FIXME avoid this | |
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); | |
2873 | |
2874 for(plane_index=0; plane_index<3; plane_index++){ | |
2875 Plane *p= &s->plane[plane_index]; | |
2876 int w= p->width; | |
2877 int h= p->height; | |
2878 int x, y; | |
2879 int bits= put_bits_count(&s->c.pb); | |
2880 | |
2881 //FIXME optimize | |
2882 if(pict->data[plane_index]) //FIXME gray hack | |
2883 for(y=0; y<h; y++){ | |
2884 for(x=0; x<w; x++){ | |
2885 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<8; | |
2886 } | |
2887 } | |
2888 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0); | |
2161 | 2889 if(s->qlog == LOSSLESS_QLOG){ |
2890 for(y=0; y<h; y++){ | |
2891 for(x=0; x<w; x++){ | |
2892 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + 127)>>8; | |
2893 } | |
2894 } | |
2895 } | |
2896 | |
2164 | 2897 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 2898 |
2138 | 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]; | |
2902 | |
2903 quantize(s, b, b->buf, b->stride, s->qbias); | |
2904 if(orientation==0) | |
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); | |
2908 if(orientation==0) | |
2909 correlate(s, b, b->buf, b->stride, 1, 0); | |
2910 } | |
2911 } | |
2912 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits); | |
2913 | |
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]; | |
2917 | |
2918 dequantize(s, b, b->buf, b->stride); | |
2919 } | |
2920 } | |
2161 | 2921 |
2164 | 2922 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 2923 if(s->qlog == LOSSLESS_QLOG){ |
2924 for(y=0; y<h; y++){ | |
2925 for(x=0; x<w; x++){ | |
2926 s->spatial_dwt_buffer[y*w + x]<<=8; | |
2927 } | |
2928 } | |
2929 } | |
2138 | 2930 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
2931 //FIXME optimize | |
2932 for(y=0; y<h; y++){ | |
2933 for(x=0; x<w; x++){ | |
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; | |
2937 } | |
2938 } | |
2939 if(s->avctx->flags&CODEC_FLAG_PSNR){ | |
2940 int64_t error= 0; | |
2941 | |
2942 if(pict->data[plane_index]) //FIXME gray hack | |
2943 for(y=0; y<h; y++){ | |
2944 for(x=0; x<w; x++){ | |
2161 | 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]; |
2138 | 2946 error += d*d; |
2947 } | |
2948 } | |
2949 s->avctx->error[plane_index] += error; | |
2950 s->avctx->error[3] += error; | |
2951 } | |
2952 } | |
2953 | |
2954 if(s->last_picture.data[0]) | |
2955 avctx->release_buffer(avctx, &s->last_picture); | |
2956 | |
2957 emms_c(); | |
2958 | |
2959 return put_cabac_terminate(c, 1); | |
2960 } | |
2961 | |
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); | |
2967 | |
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); | |
2976 } | |
2977 | |
2978 static int encode_end(AVCodecContext *avctx) | |
2979 { | |
2980 SnowContext *s = avctx->priv_data; | |
2981 | |
2982 common_end(s); | |
2983 | |
2984 return 0; | |
2985 } | |
2986 | |
2987 static int decode_init(AVCodecContext *avctx) | |
2988 { | |
2989 // SnowContext *s = avctx->priv_data; | |
2990 | |
2991 common_init(avctx); | |
2992 | |
2993 return 0; | |
2994 } | |
2995 | |
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; | |
3001 int bytes_read; | |
3002 AVFrame *picture = data; | |
3003 int log2_threshold, level, orientation, plane_index; | |
3004 | |
3005 | |
3006 /* no supplementary picture */ | |
3007 if (buf_size == 0) | |
3008 return 0; | |
3009 | |
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); | |
3012 | |
3013 memset(s->header_state, 0, sizeof(s->header_state)); | |
3014 | |
3015 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P | |
3016 decode_header(s); | |
3017 | |
3018 frame_start(s); | |
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); | |
3022 | |
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); | |
3029 | |
3030 for(plane_index=0; plane_index<3; plane_index++){ | |
3031 Plane *p= &s->plane[plane_index]; | |
3032 int w= p->width; | |
3033 int h= p->height; | |
3034 int x, y; | |
3035 | |
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); | |
3039 | |
3040 for(y=0; y<h; y++){ | |
3041 for(x=0; x<w; x++){ | |
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; | |
3045 } | |
3046 } | |
3047 } | |
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]; | |
3051 | |
3052 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation); | |
3053 if(orientation==0) | |
3054 correlate(s, b, b->buf, b->stride, 1, 0); | |
3055 } | |
3056 } | |
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]; | |
3061 | |
3062 dequantize(s, b, b->buf, b->stride); | |
3063 } | |
3064 } | |
3065 | |
2164 | 3066 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2161 | 3067 if(s->qlog == LOSSLESS_QLOG){ |
3068 for(y=0; y<h; y++){ | |
3069 for(x=0; x<w; x++){ | |
3070 s->spatial_dwt_buffer[y*w + x]<<=8; | |
3071 } | |
3072 } | |
3073 } | |
2138 | 3074 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
3075 | |
3076 //FIXME optimize | |
3077 for(y=0; y<h; y++){ | |
3078 for(x=0; x<w; x++){ | |
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; | |
3082 } | |
3083 } | |
3084 } | |
3085 | |
3086 emms_c(); | |
3087 | |
3088 if(s->last_picture.data[0]) | |
3089 avctx->release_buffer(avctx, &s->last_picture); | |
3090 | |
3091 if(!(s->avctx->debug&2048)) | |
3092 *picture= s->current_picture; | |
3093 else | |
3094 *picture= s->mconly_picture; | |
3095 | |
3096 *data_size = sizeof(AVFrame); | |
3097 | |
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"); | |
3100 | |
3101 return bytes_read; | |
3102 } | |
3103 | |
3104 static int decode_end(AVCodecContext *avctx) | |
3105 { | |
3106 SnowContext *s = avctx->priv_data; | |
3107 | |
3108 common_end(s); | |
3109 | |
3110 return 0; | |
3111 } | |
3112 | |
3113 AVCodec snow_decoder = { | |
3114 "snow", | |
3115 CODEC_TYPE_VIDEO, | |
3116 CODEC_ID_SNOW, | |
3117 sizeof(SnowContext), | |
3118 decode_init, | |
3119 NULL, | |
3120 decode_end, | |
3121 decode_frame, | |
3122 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/, | |
3123 NULL | |
3124 }; | |
3125 | |
3126 AVCodec snow_encoder = { | |
3127 "snow", | |
3128 CODEC_TYPE_VIDEO, | |
3129 CODEC_ID_SNOW, | |
3130 sizeof(SnowContext), | |
3131 encode_init, | |
3132 encode_frame, | |
3133 encode_end, | |
3134 }; | |
3135 | |
3136 | |
3137 #if 0 | |
3138 #undef malloc | |
3139 #undef free | |
3140 #undef printf | |
3141 | |
3142 int main(){ | |
3143 int width=256; | |
3144 int height=256; | |
3145 int buffer[2][width*height]; | |
3146 SnowContext s; | |
3147 int i; | |
3148 s.spatial_decomposition_count=6; | |
3149 s.spatial_decomposition_type=1; | |
3150 | |
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; | |
3154 | |
2164 | 3155 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
3156 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
2138 | 3157 |
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]); | |
3160 | |
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; | |
3165 | |
2164 | 3166 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
3167 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
2138 | 3168 |
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]); | |
3171 | |
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); | |
3176 | |
3177 for(i=-256; i<256; i++){ | |
3178 START_TIMER | |
3179 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1); | |
3180 STOP_TIMER("put_symbol") | |
3181 } | |
3182 put_cabac_terminate(&s.c, 1); | |
3183 | |
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); | |
3187 | |
3188 for(i=-256; i<256; i++){ | |
3189 int j; | |
3190 START_TIMER | |
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); | |
3194 } | |
3195 { | |
3196 int level, orientation, x, y; | |
3197 int64_t errors[8][4]; | |
3198 int64_t g=0; | |
3199 | |
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]; | |
3209 int64_t error=0; | |
3210 | |
3211 if(orientation&1) buf+=w; | |
3212 if(orientation>1) buf+=stride>>1; | |
3213 | |
3214 memset(buffer[0], 0, sizeof(int)*width*height); | |
3215 buf[w/2 + h/2*stride]= 256*256; | |
2164 | 3216 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3217 for(y=0; y<height; y++){ |
3218 for(x=0; x<width; x++){ | |
3219 int64_t d= buffer[0][x + y*width]; | |
3220 error += d*d; | |
3221 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d); | |
3222 } | |
3223 if(ABS(height/2-y)<9 && level==2) printf("\n"); | |
3224 } | |
3225 error= (int)(sqrt(error)+0.5); | |
3226 errors[level][orientation]= error; | |
3227 if(g) g=ff_gcd(g, error); | |
3228 else g= error; | |
3229 } | |
3230 } | |
3231 printf("static int const visual_weight[][4]={\n"); | |
3232 for(level=0; level<s.spatial_decomposition_count; level++){ | |
3233 printf(" {"); | |
3234 for(orientation=0; orientation<4; orientation++){ | |
3235 printf("%8lld,", errors[level][orientation]/g); | |
3236 } | |
3237 printf("},\n"); | |
3238 } | |
3239 printf("};\n"); | |
3240 { | |
3241 int level=2; | |
3242 int orientation=3; | |
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]; | |
3247 int64_t error=0; | |
3248 | |
3249 buf+=w; | |
3250 buf+=stride>>1; | |
3251 | |
3252 memset(buffer[0], 0, sizeof(int)*width*height); | |
3253 #if 1 | |
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)]; | |
3258 } | |
3259 } | |
2164 | 3260 ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3261 #else |
3262 for(y=0; y<h; y++){ | |
3263 for(x=0; x<w; x++){ | |
3264 buf[x + y*stride ]=169; | |
3265 buf[x + y*stride-w]=64; | |
3266 } | |
3267 } | |
2164 | 3268 ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 3269 #endif |
3270 for(y=0; y<height; y++){ | |
3271 for(x=0; x<width; x++){ | |
3272 int64_t d= buffer[0][x + y*width]; | |
3273 error += d*d; | |
3274 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d); | |
3275 } | |
3276 if(ABS(height/2-y)<9) printf("\n"); | |
3277 } | |
3278 } | |
3279 | |
3280 } | |
3281 return 0; | |
3282 } | |
3283 #endif | |
3284 |