2
* Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
#include "rangecoder.h"
26
#include "mpegvideo.h"
31
#define MAX_DECOMPOSITIONS 8
35
#define QROOT (1<<QSHIFT)
36
#define LOSSLESS_QLOG -128
39
static const int8_t quant3[256]={
40
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
57
static const int8_t quant3b[256]={
58
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
61
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
62
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
65
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
66
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
72
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
73
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75
static const int8_t quant3bA[256]={
76
0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
77
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
78
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
79
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
80
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
81
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
82
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
83
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
84
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
85
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
86
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
87
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
88
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
89
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
90
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
91
1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
93
static const int8_t quant5[256]={
94
0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
96
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
97
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
103
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
104
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
105
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
106
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
107
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
108
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
109
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
111
static const int8_t quant7[256]={
112
0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
113
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
114
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
115
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
116
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
118
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
119
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
120
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
121
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
122
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
123
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
124
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
125
-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
126
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
127
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
129
static const int8_t quant9[256]={
130
0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
131
3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
132
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
133
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
134
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
135
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
136
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
137
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
138
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
139
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
140
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
141
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
142
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
145
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
147
static const int8_t quant11[256]={
148
0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
149
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
150
4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
151
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
152
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
153
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
154
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
155
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
157
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
158
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
159
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
160
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
161
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
162
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
163
-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
165
static const int8_t quant13[256]={
166
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
167
4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
168
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
169
5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
170
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
171
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
172
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
173
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
174
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
175
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
176
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
177
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
178
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
179
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
180
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
181
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
184
#define LOG2_OBMC_MAX 6
185
#define OBMC_MAX (1<<(LOG2_OBMC_MAX))
187
static const uint8_t obmc32[1024]={
188
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
189
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
190
0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
191
0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
192
0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
193
0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
194
0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
195
0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
196
0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
197
0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
198
0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
199
0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
200
0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
201
0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
202
0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
203
0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
204
0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
205
0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
206
0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
207
0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
208
0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
209
0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
210
0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
211
0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
212
0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
213
0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
214
0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
215
0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
216
0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
217
0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
218
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
219
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222
static const uint8_t obmc16[256]={
223
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
224
0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
225
0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
226
0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
227
0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
228
0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
229
1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
230
1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
231
1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
232
1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
233
0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
234
0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
235
0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
236
0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
237
0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
238
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
242
static const uint8_t obmc32[1024]={
243
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
244
0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
245
0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
246
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
247
1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
248
1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
249
1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
250
1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
251
1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
252
1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
253
1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
254
1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
255
2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
256
2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
257
2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
258
2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
259
2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
260
2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
261
2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
262
2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
263
1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
264
1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
265
1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
266
1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
267
1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
268
1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
269
1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
270
1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
271
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
272
0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
273
0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
274
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
277
static const uint8_t obmc16[256]={
278
0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
279
1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
280
1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
281
2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
282
2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
283
3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
284
3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
285
4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
286
4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
287
3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
288
3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
289
2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
290
2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
291
1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
292
1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
293
0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
297
static const uint8_t obmc32[1024]={
298
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
300
0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
301
0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
302
0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
303
0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
304
0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
305
0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
306
0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
307
0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
308
0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
309
0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
310
0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
311
0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
312
0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
313
0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
314
0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
315
0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
316
0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
317
0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
318
0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
319
0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
320
0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
321
0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
322
0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
323
0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
324
0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
325
0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
326
0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
327
0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
328
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
329
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332
static const uint8_t obmc16[256]={
333
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
334
0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
335
0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
336
0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
337
0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
338
1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
339
1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
340
0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
341
0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
342
1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
343
1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
344
0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
345
0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
346
0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
347
0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
348
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
354
static const uint8_t obmc8[64]={
355
1, 3, 5, 7, 7, 5, 3, 1,
356
3, 9,15,21,21,15, 9, 3,
357
5,15,25,35,35,25,15, 5,
358
7,21,35,49,49,35,21, 7,
359
7,21,35,49,49,35,21, 7,
360
5,15,25,35,35,25,15, 5,
361
3, 9,15,21,21,15, 9, 3,
362
1, 3, 5, 7, 7, 5, 3, 1,
367
static const uint8_t obmc4[16]={
375
static const uint8_t *obmc_tab[4]={
376
obmc32, obmc16, obmc8, obmc4
379
typedef struct BlockNode{
384
//#define TYPE_SPLIT 1
385
#define BLOCK_INTRA 1
386
//#define TYPE_NOCOLOR 4
387
uint8_t level; //FIXME merge into type?
390
#define LOG2_MB_SIZE 4
391
#define MB_SIZE (1<<LOG2_MB_SIZE)
393
typedef struct x_and_coeff{
398
typedef struct SubBand{
403
int qlog; ///< log(qscale)/log[2^(1/6)]
407
int stride_line; ///< Stride measured in lines, not pixels.
408
x_and_coeff * x_coeff;
409
struct SubBand *parent;
410
uint8_t state[/*7*2*/ 7 + 512][32];
413
typedef struct Plane{
416
SubBand band[MAX_DECOMPOSITIONS][4];
419
/** Used to minimize the amount of memory used in order to optimize cache performance. **/
421
DWTELEM * * line; ///< For use by idwt and predict_slices.
422
DWTELEM * * data_stack; ///< Used for internal purposes.
427
DWTELEM * base_buffer; ///< Buffer that this structure is caching.
430
typedef struct SnowContext{
431
// MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
433
AVCodecContext *avctx;
436
AVFrame input_picture;
437
AVFrame current_picture;
438
AVFrame last_picture;
439
AVFrame mconly_picture;
440
// uint8_t q_context[16];
441
uint8_t header_state[32];
442
uint8_t block_state[128 + 32*128];
446
int spatial_decomposition_type;
447
int temporal_decomposition_type;
448
int spatial_decomposition_count;
449
int temporal_decomposition_count;
450
DWTELEM *spatial_dwt_buffer;
454
int spatial_scalability;
460
#define QBIAS_SHIFT 3
464
Plane plane[MAX_PLANES];
468
MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
479
#define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
480
//#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
482
static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
486
buf->base_buffer = base_buffer;
487
buf->line_count = line_count;
488
buf->line_width = line_width;
489
buf->data_count = max_allocated_lines;
490
buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
491
buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
493
for (i = 0; i < max_allocated_lines; i++)
495
buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
498
buf->data_stack_top = max_allocated_lines - 1;
501
static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
506
// av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
508
assert(buf->data_stack_top >= 0);
509
// assert(!buf->line[line]);
511
return buf->line[line];
513
offset = buf->line_width * line;
514
buffer = buf->data_stack[buf->data_stack_top];
515
buf->data_stack_top--;
516
buf->line[line] = buffer;
518
// av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
523
static void slice_buffer_release(slice_buffer * buf, int line)
528
assert(line >= 0 && line < buf->line_count);
529
assert(buf->line[line]);
531
offset = buf->line_width * line;
532
buffer = buf->line[line];
533
buf->data_stack_top++;
534
buf->data_stack[buf->data_stack_top] = buffer;
535
buf->line[line] = NULL;
537
// av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
540
static void slice_buffer_flush(slice_buffer * buf)
543
for (i = 0; i < buf->line_count; i++)
547
// av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
548
slice_buffer_release(buf, i);
553
static void slice_buffer_destroy(slice_buffer * buf)
556
slice_buffer_flush(buf);
558
for (i = buf->data_count - 1; i >= 0; i--)
560
assert(buf->data_stack[i]);
561
av_free(buf->data_stack[i]);
563
assert(buf->data_stack);
564
av_free(buf->data_stack);
570
// Avoid a name clash on SGI IRIX
573
#define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
574
static uint8_t qexp[QROOT];
576
static inline int mirror(int v, int m){
578
else if(v>m) return 2*m-v;
582
static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
587
const int e= av_log2(a);
589
const int el= FFMIN(e, 10);
590
put_rac(c, state+0, 0);
593
put_rac(c, state+1+i, 1); //1..10
596
put_rac(c, state+1+9, 1); //1..10
598
put_rac(c, state+1+FFMIN(i,9), 0);
600
for(i=e-1; i>=el; i--){
601
put_rac(c, state+22+9, (a>>i)&1); //22..31
604
put_rac(c, state+22+i, (a>>i)&1); //22..31
608
put_rac(c, state+11 + el, v < 0); //11..21
611
put_rac(c, state+0, 0);
614
put_rac(c, state+1+i, 1); //1..10
616
put_rac(c, state+1+i, 0);
618
for(i=e-1; i>=0; i--){
619
put_rac(c, state+22+i, (a>>i)&1); //22..31
623
put_rac(c, state+11 + e, v < 0); //11..21
626
put_rac(c, state+1+FFMIN(i,9), 1); //1..10
628
put_rac(c, state+1+FFMIN(i,9), 0);
630
for(i=e-1; i>=0; i--){
631
put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
635
put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
639
put_rac(c, state+0, 1);
643
static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
644
if(get_rac(c, state+0))
649
while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
654
for(i=e-1; i>=0; i--){
655
a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
658
if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
665
static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
667
int r= log2>=0 ? 1<<log2 : 1;
673
put_rac(c, state+4+log2, 1);
678
put_rac(c, state+4+log2, 0);
680
for(i=log2-1; i>=0; i--){
681
put_rac(c, state+31-i, (v>>i)&1);
685
static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
687
int r= log2>=0 ? 1<<log2 : 1;
692
while(get_rac(c, state+4+log2)){
698
for(i=log2-1; i>=0; i--){
699
v+= get_rac(c, state+31-i)<<i;
705
static always_inline void lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
706
const int mirror_left= !highpass;
707
const int mirror_right= (width&1) ^ highpass;
708
const int w= (width>>1) - 1 + (highpass & width);
711
#define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
713
dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
719
dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
723
dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
727
static always_inline void lift5(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
728
const int mirror_left= !highpass;
729
const int mirror_right= (width&1) ^ highpass;
730
const int w= (width>>1) - 1 + (highpass & width);
737
dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
743
int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
746
dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
750
int r= 3*2*ref[w*ref_step];
753
dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
757
static always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
758
const int mirror_left= !highpass;
759
const int mirror_right= (width&1) ^ highpass;
760
const int w= (width>>1) - 1 + (highpass & width);
764
#define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
766
dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
772
dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
776
dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
781
static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
784
for(x=start; x<width; x+=2){
788
int x2= x + 2*i - n + 1;
790
else if(x2>=width) x2= 2*width-x2-2;
791
sum += coeffs[i]*(int64_t)dst[x2];
793
if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
794
else dst[x] += (sum + (1<<shift)/2)>>shift;
798
static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
800
for(y=start; y<height; y+=2){
801
for(x=0; x<width; x++){
805
int y2= y + 2*i - n + 1;
807
else if(y2>=height) y2= 2*height-y2-2;
808
sum += coeffs[i]*(int64_t)dst[x + y2*stride];
810
if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
811
else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
820
#if 0 // more accurate 9/7
823
#define COEFFS1 (int[]){-25987,-25987}
826
#define COEFFS2 (int[]){-27777,-27777}
829
#define COEFFS3 (int[]){28931,28931}
832
#define COEFFS4 (int[]){14533,14533}
836
#define COEFFS1 (int[]){1,-9,-9,1}
839
#define COEFFS2 (int[]){-1,5,5,-1}
852
#define COEFFS1 (int[]){1,1}
855
#define COEFFS2 (int[]){-1,-1}
868
#define COEFFS2 (int[]){-1,-1}
871
#define COEFFS3 (int[]){-1,-1}
874
#define COEFFS4 (int[]){-5,29,29,-5}
879
#define COEFFS1 (int[]){-203,-203}
882
#define COEFFS2 (int[]){-217,-217}
885
#define COEFFS3 (int[]){113,113}
888
#define COEFFS4 (int[]){227,227}
896
#define COEFFS2 (int[]){-1,-1}
899
#define COEFFS3 (int[]){-1,-1}
902
#define COEFFS4 (int[]){3,3}
906
#define COEFFS1 (int[]){1,-9,-9,1}
909
#define COEFFS2 (int[]){1,1}
919
#define COEFFS1 (int[]){1,-9,-9,1}
922
#define COEFFS2 (int[]){-1,5,5,-1}
930
static void horizontal_decomposeX(DWTELEM *b, int width){
932
const int width2= width>>1;
933
const int w2= (width+1)>>1;
936
inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
937
inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
938
inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
939
inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
941
for(x=0; x<width2; x++){
943
temp[x+w2]= b[2*x + 1];
947
memcpy(b, temp, width*sizeof(int));
950
static void horizontal_composeX(DWTELEM *b, int width){
952
const int width2= width>>1;
954
const int w2= (width+1)>>1;
956
memcpy(temp, b, width*sizeof(int));
957
for(x=0; x<width2; x++){
959
b[2*x + 1]= temp[x+w2];
964
inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
965
inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
966
inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
967
inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
970
static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
973
for(y=0; y<height; y++){
974
for(x=0; x<width; x++){
975
buffer[y*stride + x] *= SCALEX;
979
for(y=0; y<height; y++){
980
horizontal_decomposeX(buffer + y*stride, width);
983
inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
984
inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
985
inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
986
inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
989
static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
992
inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
993
inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
994
inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
995
inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
997
for(y=0; y<height; y++){
998
horizontal_composeX(buffer + y*stride, width);
1001
for(y=0; y<height; y++){
1002
for(x=0; x<width; x++){
1003
buffer[y*stride + x] /= SCALEX;
1008
static void horizontal_decompose53i(DWTELEM *b, int width){
1009
DWTELEM temp[width];
1010
const int width2= width>>1;
1012
const int w2= (width+1)>>1;
1014
for(x=0; x<width2; x++){
1016
temp[x+w2]= b[2*x + 1];
1030
for(x=1; x+1<width2; x+=2){
1034
A2 += (A1 + A3 + 2)>>2;
1038
A1= temp[x+1+width2];
1041
A4 += (A1 + A3 + 2)>>2;
1047
A2 += (A1 + A3 + 2)>>2;
1052
lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1053
lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
1057
static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1060
for(i=0; i<width; i++){
1061
b1[i] -= (b0[i] + b2[i])>>1;
1065
static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1068
for(i=0; i<width; i++){
1069
b1[i] += (b0[i] + b2[i] + 2)>>2;
1073
static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
1075
DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1076
DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
1078
for(y=-2; y<height; y+=2){
1079
DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1080
DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1083
if(b1 <= b3) horizontal_decompose53i(b2, width);
1084
if(y+2 < height) horizontal_decompose53i(b3, width);
1085
STOP_TIMER("horizontal_decompose53i")}
1088
if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
1089
if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
1090
STOP_TIMER("vertical_decompose53i*")}
1167
static void horizontal_decompose97i(DWTELEM *b, int width){
1168
DWTELEM temp[width];
1169
const int w2= (width+1)>>1;
1171
lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1172
liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1173
lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1174
lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1178
static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1181
for(i=0; i<width; i++){
1182
b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1186
static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1189
for(i=0; i<width; i++){
1191
b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1193
int r= 3*(b0[i] + b2[i]);
1196
b1[i] += (r+W_CO)>>W_CS;
1201
static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1204
for(i=0; i<width; i++){
1206
b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1208
b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
1213
static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1216
for(i=0; i<width; i++){
1217
b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1221
static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1223
DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1224
DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1225
DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1226
DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1228
for(y=-4; y<height; y+=2){
1229
DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1230
DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1233
if(b3 <= b5) horizontal_decompose97i(b4, width);
1234
if(y+4 < height) horizontal_decompose97i(b5, width);
1236
STOP_TIMER("horizontal_decompose97i")
1240
if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1241
if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1242
if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1243
if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1246
STOP_TIMER("vertical_decompose97i")
1256
void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1259
for(level=0; level<decomposition_count; level++){
1261
case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1262
case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1263
case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1268
static void horizontal_compose53i(DWTELEM *b, int width){
1269
DWTELEM temp[width];
1270
const int width2= width>>1;
1271
const int w2= (width+1)>>1;
1283
for(x=1; x+1<width2; x+=2){
1287
A2 += (A1 + A3 + 2)>>2;
1291
A1= temp[x+1+width2];
1294
A4 += (A1 + A3 + 2)>>2;
1300
A2 += (A1 + A3 + 2)>>2;
1304
lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1305
lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1307
for(x=0; x<width2; x++){
1309
b[2*x + 1]= temp[x+w2];
1315
static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1318
for(i=0; i<width; i++){
1319
b1[i] += (b0[i] + b2[i])>>1;
1323
static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1326
for(i=0; i<width; i++){
1327
b1[i] -= (b0[i] + b2[i] + 2)>>2;
1331
static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1332
cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
1333
cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line);
1337
static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1338
cs->b0 = buffer + mirror(-1-1, height-1)*stride;
1339
cs->b1 = buffer + mirror(-1 , height-1)*stride;
1343
static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1345
int mirror0 = mirror(y-1, height-1);
1346
int mirror1 = mirror(y , height-1);
1347
int mirror2 = mirror(y+1, height-1);
1348
int mirror3 = mirror(y+2, height-1);
1350
DWTELEM *b0= cs->b0;
1351
DWTELEM *b1= cs->b1;
1352
DWTELEM *b2= slice_buffer_get_line(sb, mirror2 * stride_line);
1353
DWTELEM *b3= slice_buffer_get_line(sb, mirror3 * stride_line);
1356
if(mirror1 <= mirror3) vertical_compose53iL0(b1, b2, b3, width);
1357
if(mirror0 <= mirror2) vertical_compose53iH0(b0, b1, b2, width);
1358
STOP_TIMER("vertical_compose53i*")}
1361
if(y-1 >= 0) horizontal_compose53i(b0, width);
1362
if(mirror0 <= mirror2) horizontal_compose53i(b1, width);
1363
STOP_TIMER("horizontal_compose53i")}
1370
static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1372
DWTELEM *b0= cs->b0;
1373
DWTELEM *b1= cs->b1;
1374
DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1375
DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1378
if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1379
if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1380
STOP_TIMER("vertical_compose53i*")}
1383
if(y-1 >= 0) horizontal_compose53i(b0, width);
1384
if(b0 <= b2) horizontal_compose53i(b1, width);
1385
STOP_TIMER("horizontal_compose53i")}
1392
static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1394
spatial_compose53i_init(&cs, buffer, height, stride);
1395
while(cs.y <= height)
1396
spatial_compose53i_dy(&cs, buffer, width, height, stride);
1400
static void horizontal_compose97i(DWTELEM *b, int width){
1401
DWTELEM temp[width];
1402
const int w2= (width+1)>>1;
1404
lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1405
lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1406
liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1407
lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1410
static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1413
for(i=0; i<width; i++){
1414
b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1418
static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1421
for(i=0; i<width; i++){
1423
b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1425
int r= 3*(b0[i] + b2[i]);
1428
b1[i] -= (r+W_CO)>>W_CS;
1433
static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1436
for(i=0; i<width; i++){
1438
b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1440
b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1445
static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1448
for(i=0; i<width; i++){
1449
b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1453
static void vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1456
for(i=0; i<width; i++){
1460
b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1462
b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1464
r= 3*(b2[i] + b4[i]);
1467
b3[i] -= (r+W_CO)>>W_CS;
1470
b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1472
b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1474
b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1478
static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1479
cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1480
cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
1481
cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1482
cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1486
static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1487
cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1488
cs->b1 = buffer + mirror(-3 , height-1)*stride;
1489
cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1490
cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1494
static void spatial_compose97i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1497
int mirror0 = mirror(y - 1, height - 1);
1498
int mirror1 = mirror(y + 0, height - 1);
1499
int mirror2 = mirror(y + 1, height - 1);
1500
int mirror3 = mirror(y + 2, height - 1);
1501
int mirror4 = mirror(y + 3, height - 1);
1502
int mirror5 = mirror(y + 4, height - 1);
1503
DWTELEM *b0= cs->b0;
1504
DWTELEM *b1= cs->b1;
1505
DWTELEM *b2= cs->b2;
1506
DWTELEM *b3= cs->b3;
1507
DWTELEM *b4= slice_buffer_get_line(sb, mirror4 * stride_line);
1508
DWTELEM *b5= slice_buffer_get_line(sb, mirror5 * stride_line);
1511
if(y>0 && y+4<height){
1512
vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1514
if(mirror3 <= mirror5) vertical_compose97iL1(b3, b4, b5, width);
1515
if(mirror2 <= mirror4) vertical_compose97iH1(b2, b3, b4, width);
1516
if(mirror1 <= mirror3) vertical_compose97iL0(b1, b2, b3, width);
1517
if(mirror0 <= mirror2) vertical_compose97iH0(b0, b1, b2, width);
1520
STOP_TIMER("vertical_compose97i")}}
1523
if(y-1>= 0) horizontal_compose97i(b0, width);
1524
if(mirror0 <= mirror2) horizontal_compose97i(b1, width);
1525
if(width>400 && mirror0 <= mirror2){
1526
STOP_TIMER("horizontal_compose97i")}}
1535
static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1537
DWTELEM *b0= cs->b0;
1538
DWTELEM *b1= cs->b1;
1539
DWTELEM *b2= cs->b2;
1540
DWTELEM *b3= cs->b3;
1541
DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1542
DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1544
if(stride == width && y+4 < height && 0){
1546
for(x=0; x<width/2; x++)
1553
if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1554
if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1555
if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1556
if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1558
STOP_TIMER("vertical_compose97i")}}
1561
if(y-1>= 0) horizontal_compose97i(b0, width);
1562
if(b0 <= b2) horizontal_compose97i(b1, width);
1563
if(width>400 && b0 <= b2){
1564
STOP_TIMER("horizontal_compose97i")}}
1573
static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1575
spatial_compose97i_init(&cs, buffer, height, stride);
1576
while(cs.y <= height)
1577
spatial_compose97i_dy(&cs, buffer, width, height, stride);
1580
void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
1582
for(level=decomposition_count-1; level>=0; level--){
1584
case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1585
case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1586
/* not slicified yet */
1587
case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1588
av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1593
void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1595
for(level=decomposition_count-1; level>=0; level--){
1597
case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1598
case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1599
/* not slicified yet */
1600
case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1605
void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1606
const int support = type==1 ? 3 : 5;
1610
for(level=decomposition_count-1; level>=0; level--){
1611
while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1613
case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1615
case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1623
void ff_spatial_idwt_buffered_slice(dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
1624
const int support = type==1 ? 3 : 5;
1628
for(level=decomposition_count-1; level>=0; level--){
1629
while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1631
case 0: spatial_compose97i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1633
case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1641
void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1644
for(level=decomposition_count-1; level>=0; level--)
1645
spatial_composeX (buffer, width>>level, height>>level, stride<<level);
1647
dwt_compose_t cs[MAX_DECOMPOSITIONS];
1649
ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1650
for(y=0; y<height; y+=4)
1651
ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1655
static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1656
const int w= b->width;
1657
const int h= b->height;
1669
int /*ll=0, */l=0, lt=0, t=0, rt=0;
1670
v= src[x + y*stride];
1673
t= src[x + (y-1)*stride];
1675
lt= src[x - 1 + (y-1)*stride];
1678
rt= src[x + 1 + (y-1)*stride];
1682
l= src[x - 1 + y*stride];
1684
if(orientation==1) ll= src[y + (x-2)*stride];
1685
else ll= src[x - 2 + y*stride];
1691
if(px<b->parent->width && py<b->parent->height)
1692
p= parent[px + py*2*stride];
1694
if(!(/*ll|*/l|lt|t|rt|p)){
1696
runs[run_index++]= run;
1704
max_index= run_index;
1705
runs[run_index++]= run;
1707
run= runs[run_index++];
1709
put_symbol2(&s->c, b->state[30], max_index, 0);
1710
if(run_index <= max_index)
1711
put_symbol2(&s->c, b->state[1], run, 3);
1714
if(s->c.bytestream_end - s->c.bytestream < w*40){
1715
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1720
int /*ll=0, */l=0, lt=0, t=0, rt=0;
1721
v= src[x + y*stride];
1724
t= src[x + (y-1)*stride];
1726
lt= src[x - 1 + (y-1)*stride];
1729
rt= src[x + 1 + (y-1)*stride];
1733
l= src[x - 1 + y*stride];
1735
if(orientation==1) ll= src[y + (x-2)*stride];
1736
else ll= src[x - 2 + y*stride];
1742
if(px<b->parent->width && py<b->parent->height)
1743
p= parent[px + py*2*stride];
1745
if(/*ll|*/l|lt|t|rt|p){
1746
int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1748
put_rac(&s->c, &b->state[0][context], !!v);
1751
run= runs[run_index++];
1753
if(run_index <= max_index)
1754
put_symbol2(&s->c, b->state[1], run, 3);
1762
int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
1763
int l2= 2*ABS(l) + (l<0);
1764
int t2= 2*ABS(t) + (t<0);
1766
put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
1767
put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1775
static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1776
// encode_subband_qtree(s, b, src, parent, stride, orientation);
1777
// encode_subband_z0run(s, b, src, parent, stride, orientation);
1778
return encode_subband_c0run(s, b, src, parent, stride, orientation);
1779
// encode_subband_dzr(s, b, src, parent, stride, orientation);
1782
static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1783
const int w= b->width;
1784
const int h= b->height;
1789
x_and_coeff *xc= b->x_coeff;
1790
x_and_coeff *prev_xc= NULL;
1791
x_and_coeff *prev2_xc= xc;
1792
x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1793
x_and_coeff *prev_parent_xc= parent_xc;
1795
runs= get_symbol2(&s->c, b->state[30], 0);
1796
if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1801
int lt=0, t=0, rt=0;
1803
if(y && prev_xc->x == 0){
1815
if(prev_xc->x == x + 1)
1821
if(x>>1 > parent_xc->x){
1824
if(x>>1 == parent_xc->x){
1825
p= parent_xc->coeff;
1828
if(/*ll|*/l|lt|t|rt|p){
1829
int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1831
v=get_rac(&s->c, &b->state[0][context]);
1833
v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1834
v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1841
if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1843
v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1844
v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1853
if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1854
else max_run= FFMIN(run, w-x-1);
1856
max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1862
(xc++)->x= w+1; //end marker
1868
while(parent_xc->x != parent->width+1)
1871
prev_parent_xc= parent_xc;
1873
parent_xc= prev_parent_xc;
1878
(xc++)->x= w+1; //end marker
1882
static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1883
const int w= b->width;
1885
const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1886
int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1887
int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1892
if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1897
/* If we are on the second or later slice, restore our index. */
1899
new_index = save_state[0];
1902
for(y=start_y; y<h; y++){
1905
DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1906
memset(line, 0, b->width*sizeof(DWTELEM));
1907
v = b->x_coeff[new_index].coeff;
1908
x = b->x_coeff[new_index++].x;
1911
register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1912
register int u= -(v&1);
1913
line[x] = (t^u) - u;
1915
v = b->x_coeff[new_index].coeff;
1916
x = b->x_coeff[new_index++].x;
1919
if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1920
STOP_TIMER("decode_subband")
1923
/* Save our variables for the next slice. */
1924
save_state[0] = new_index;
1929
static void reset_contexts(SnowContext *s){
1930
int plane_index, level, orientation;
1932
for(plane_index=0; plane_index<3; plane_index++){
1933
for(level=0; level<s->spatial_decomposition_count; level++){
1934
for(orientation=level ? 1:0; orientation<4; orientation++){
1935
memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1939
memset(s->header_state, MID_STATE, sizeof(s->header_state));
1940
memset(s->block_state, MID_STATE, sizeof(s->block_state));
1943
static int alloc_blocks(SnowContext *s){
1944
int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1945
int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1950
s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1954
static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1955
uint8_t *bytestream= d->bytestream;
1956
uint8_t *bytestream_start= d->bytestream_start;
1958
d->bytestream= bytestream;
1959
d->bytestream_start= bytestream_start;
1962
//near copy & paste from dsputil, FIXME
1963
static int pix_sum(uint8_t * pix, int line_size, int w)
1968
for (i = 0; i < w; i++) {
1969
for (j = 0; j < w; j++) {
1973
pix += line_size - w;
1978
//near copy & paste from dsputil, FIXME
1979
static int pix_norm1(uint8_t * pix, int line_size, int w)
1982
uint32_t *sq = squareTbl + 256;
1985
for (i = 0; i < w; i++) {
1986
for (j = 0; j < w; j ++) {
1990
pix += line_size - w;
1995
static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int type){
1996
const int w= s->b_width << s->block_max_depth;
1997
const int rem_depth= s->block_max_depth - level;
1998
const int index= (x + y*w) << rem_depth;
1999
const int block_w= 1<<rem_depth;
2011
for(j=0; j<block_w; j++){
2012
for(i=0; i<block_w; i++){
2013
s->block[index + i + j*w]= block;
2018
static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){
2019
const int offset[3]= {
2021
((y*c->uvstride + x)>>1),
2022
((y*c->uvstride + x)>>1),
2026
c->src[0][i]= src [i];
2027
c->ref[0][i]= ref [i] + offset[i];
2035
#define P_TOPRIGHT P[3]
2036
#define P_MEDIAN P[4]
2038
#define FLAG_QPEL 1 //must be 1
2040
#ifdef CONFIG_ENCODERS
2041
static int encode_q_branch(SnowContext *s, int level, int x, int y){
2042
uint8_t p_buffer[1024];
2043
uint8_t i_buffer[1024];
2044
uint8_t p_state[sizeof(s->block_state)];
2045
uint8_t i_state[sizeof(s->block_state)];
2047
uint8_t *pbbak= s->c.bytestream;
2048
uint8_t *pbbak_start= s->c.bytestream_start;
2049
int score, score2, iscore, i_len, p_len, block_s, sum;
2050
const int w= s->b_width << s->block_max_depth;
2051
const int h= s->b_height << s->block_max_depth;
2052
const int rem_depth= s->block_max_depth - level;
2053
const int index= (x + y*w) << rem_depth;
2054
const int block_w= 1<<(LOG2_MB_SIZE - level);
2055
static BlockNode null_block= { //FIXME add border maybe
2056
.color= {128,128,128},
2062
int trx= (x+1)<<rem_depth;
2063
int try= (y+1)<<rem_depth;
2064
BlockNode *left = x ? &s->block[index-1] : &null_block;
2065
BlockNode *top = y ? &s->block[index-w] : &null_block;
2066
BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
2067
BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
2068
BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2069
BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2070
int pl = left->color[0];
2071
int pcb= left->color[1];
2072
int pcr= left->color[2];
2073
int pmx= mid_pred(left->mx, top->mx, tr->mx);
2074
int pmy= mid_pred(left->my, top->my, tr->my);
2077
const int stride= s->current_picture.linesize[0];
2078
const int uvstride= s->current_picture.linesize[1];
2079
const int instride= s->input_picture.linesize[0];
2080
const int uvinstride= s->input_picture.linesize[1];
2081
uint8_t *new_l = s->input_picture.data[0] + (x + y* instride)*block_w;
2082
uint8_t *new_cb= s->input_picture.data[1] + (x + y*uvinstride)*block_w/2;
2083
uint8_t *new_cr= s->input_picture.data[2] + (x + y*uvinstride)*block_w/2;
2084
uint8_t current_mb[3][stride*block_w];
2085
uint8_t *current_data[3]= {¤t_mb[0][0], ¤t_mb[1][0], ¤t_mb[2][0]};
2087
int16_t last_mv[3][2];
2088
int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
2089
const int shift= 1+qpel;
2090
MotionEstContext *c= &s->m.me;
2091
int mx_context= av_log2(2*ABS(left->mx - top->mx));
2092
int my_context= av_log2(2*ABS(left->my - top->my));
2093
int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2095
assert(sizeof(s->block_state) >= 256);
2097
set_blocks(s, level, x, y, pl, pcb, pcr, pmx, pmy, BLOCK_INTRA);
2102
for(i=0; i<block_w; i++)
2103
memcpy(¤t_mb[0][0] + stride*i, new_l + instride*i, block_w);
2104
for(i=0; i<block_w>>1; i++)
2105
memcpy(¤t_mb[1][0] + uvstride*i, new_cb + uvinstride*i, block_w>>1);
2106
for(i=0; i<block_w>>1; i++)
2107
memcpy(¤t_mb[2][0] + uvstride*i, new_cr + uvinstride*i, block_w>>1);
2109
// clip predictors / edge ?
2111
P_LEFT[0]= left->mx;
2112
P_LEFT[1]= left->my;
2115
P_TOPRIGHT[0]= tr->mx;
2116
P_TOPRIGHT[1]= tr->my;
2118
last_mv[0][0]= s->block[index].mx;
2119
last_mv[0][1]= s->block[index].my;
2120
last_mv[1][0]= right->mx;
2121
last_mv[1][1]= right->my;
2122
last_mv[2][0]= bottom->mx;
2123
last_mv[2][1]= bottom->my;
2130
init_ref(c, current_data, s->last_picture.data, NULL, block_w*x, block_w*y, 0);
2132
assert(s->m.me. stride == stride);
2133
assert(s->m.me.uvstride == uvstride);
2135
c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2136
c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2137
c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2138
c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2140
c->xmin = - x*block_w - 16+2;
2141
c->ymin = - y*block_w - 16+2;
2142
c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2143
c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2145
if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
2146
if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
2147
if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
2148
if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
2149
if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2150
if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2151
if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2153
P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
2154
P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
2157
c->pred_x= P_LEFT[0];
2158
c->pred_y= P_LEFT[1];
2160
c->pred_x = P_MEDIAN[0];
2161
c->pred_y = P_MEDIAN[1];
2164
score= ff_epzs_motion_search(&s->m, &mx, &my, P, 0, /*ref_index*/ 0, last_mv,
2165
(1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
2167
assert(mx >= c->xmin);
2168
assert(mx <= c->xmax);
2169
assert(my >= c->ymin);
2170
assert(my <= c->ymax);
2172
score= s->m.me.sub_motion_search(&s->m, &mx, &my, score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
2173
score= ff_get_mb_score(&s->m, mx, my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
2174
//FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
2178
pc.bytestream_start=
2179
pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
2180
memcpy(p_state, s->block_state, sizeof(s->block_state));
2182
if(level!=s->block_max_depth)
2183
put_rac(&pc, &p_state[4 + s_context], 1);
2184
put_rac(&pc, &p_state[1 + left->type + top->type], 0);
2185
put_symbol(&pc, &p_state[128 + 32*mx_context], mx - pmx, 1);
2186
put_symbol(&pc, &p_state[128 + 32*my_context], my - pmy, 1);
2187
p_len= pc.bytestream - pc.bytestream_start;
2188
score += (s->lambda2*(p_len*8
2189
+ (pc.outstanding_count - s->c.outstanding_count)*8
2190
+ (-av_log2(pc.range) + av_log2(s->c.range))
2191
))>>FF_LAMBDA_SHIFT;
2193
block_s= block_w*block_w;
2194
sum = pix_sum(¤t_mb[0][0], stride, block_w);
2195
l= (sum + block_s/2)/block_s;
2196
iscore = pix_norm1(¤t_mb[0][0], stride, block_w) - 2*l*sum + l*l*block_s;
2198
block_s= block_w*block_w>>2;
2199
sum = pix_sum(¤t_mb[1][0], uvstride, block_w>>1);
2200
cb= (sum + block_s/2)/block_s;
2201
// iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
2202
sum = pix_sum(¤t_mb[2][0], uvstride, block_w>>1);
2203
cr= (sum + block_s/2)/block_s;
2204
// iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
2207
ic.bytestream_start=
2208
ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
2209
memcpy(i_state, s->block_state, sizeof(s->block_state));
2210
if(level!=s->block_max_depth)
2211
put_rac(&ic, &i_state[4 + s_context], 1);
2212
put_rac(&ic, &i_state[1 + left->type + top->type], 1);
2213
put_symbol(&ic, &i_state[32], l-pl , 1);
2214
put_symbol(&ic, &i_state[64], cb-pcb, 1);
2215
put_symbol(&ic, &i_state[96], cr-pcr, 1);
2216
i_len= ic.bytestream - ic.bytestream_start;
2217
iscore += (s->lambda2*(i_len*8
2218
+ (ic.outstanding_count - s->c.outstanding_count)*8
2219
+ (-av_log2(ic.range) + av_log2(s->c.range))
2220
))>>FF_LAMBDA_SHIFT;
2222
// assert(score==256*256*256*64-1);
2223
assert(iscore < 255*255*256 + s->lambda2*10);
2224
assert(iscore >= 0);
2225
assert(l>=0 && l<=255);
2226
assert(pl>=0 && pl<=255);
2229
int varc= iscore >> 8;
2230
int vard= score >> 8;
2231
if (vard <= 64 || vard < varc)
2232
c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
2234
c->scene_change_score+= s->m.qscale;
2237
if(level!=s->block_max_depth){
2238
put_rac(&s->c, &s->block_state[4 + s_context], 0);
2239
score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
2240
score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
2241
score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
2242
score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
2243
score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
2245
if(score2 < score && score2 < iscore)
2250
memcpy(pbbak, i_buffer, i_len);
2252
s->c.bytestream_start= pbbak_start;
2253
s->c.bytestream= pbbak + i_len;
2254
set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, BLOCK_INTRA);
2255
memcpy(s->block_state, i_state, sizeof(s->block_state));
2258
memcpy(pbbak, p_buffer, p_len);
2260
s->c.bytestream_start= pbbak_start;
2261
s->c.bytestream= pbbak + p_len;
2262
set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, 0);
2263
memcpy(s->block_state, p_state, sizeof(s->block_state));
2269
static void decode_q_branch(SnowContext *s, int level, int x, int y){
2270
const int w= s->b_width << s->block_max_depth;
2271
const int rem_depth= s->block_max_depth - level;
2272
const int index= (x + y*w) << rem_depth;
2273
static BlockNode null_block= { //FIXME add border maybe
2274
.color= {128,128,128},
2280
int trx= (x+1)<<rem_depth;
2281
BlockNode *left = x ? &s->block[index-1] : &null_block;
2282
BlockNode *top = y ? &s->block[index-w] : &null_block;
2283
BlockNode *tl = y && x ? &s->block[index-w-1] : left;
2284
BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2285
int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2288
set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, BLOCK_INTRA);
2292
if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
2294
int l = left->color[0];
2295
int cb= left->color[1];
2296
int cr= left->color[2];
2297
int mx= mid_pred(left->mx, top->mx, tr->mx);
2298
int my= mid_pred(left->my, top->my, tr->my);
2299
int mx_context= av_log2(2*ABS(left->mx - top->mx)) + 0*av_log2(2*ABS(tr->mx - top->mx));
2300
int my_context= av_log2(2*ABS(left->my - top->my)) + 0*av_log2(2*ABS(tr->my - top->my));
2302
type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
2305
l += get_symbol(&s->c, &s->block_state[32], 1);
2306
cb+= get_symbol(&s->c, &s->block_state[64], 1);
2307
cr+= get_symbol(&s->c, &s->block_state[96], 1);
2309
mx+= get_symbol(&s->c, &s->block_state[128 + 32*mx_context], 1);
2310
my+= get_symbol(&s->c, &s->block_state[128 + 32*my_context], 1);
2312
set_blocks(s, level, x, y, l, cb, cr, mx, my, type);
2314
decode_q_branch(s, level+1, 2*x+0, 2*y+0);
2315
decode_q_branch(s, level+1, 2*x+1, 2*y+0);
2316
decode_q_branch(s, level+1, 2*x+0, 2*y+1);
2317
decode_q_branch(s, level+1, 2*x+1, 2*y+1);
2321
#ifdef CONFIG_ENCODERS
2322
static void encode_blocks(SnowContext *s){
2328
if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
2329
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2333
encode_q_branch(s, 0, x, y);
2339
static void decode_blocks(SnowContext *s){
2346
decode_q_branch(s, 0, x, y);
2351
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){
2354
for(y=0; y < b_h+5; y++){
2355
for(x=0; x < b_w; x++){
2362
// int am= 9*(a1+a2) - (a0+a3);
2363
int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2364
// int am= 18*(a2+a3) - 2*(a1+a4);
2365
// int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2366
// int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2368
// if(b_w==16) am= 8*(a1+a2);
2370
if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8;
2371
else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2373
/* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
2374
if(am&(~255)) am= ~(am>>31);
2378
/* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
2379
else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
2380
else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
2381
else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2386
tmp -= (b_h+5)*stride;
2388
for(y=0; y < b_h; y++){
2389
for(x=0; x < b_w; x++){
2390
int a0= tmp[x + 0*stride];
2391
int a1= tmp[x + 1*stride];
2392
int a2= tmp[x + 2*stride];
2393
int a3= tmp[x + 3*stride];
2394
int a4= tmp[x + 4*stride];
2395
int a5= tmp[x + 5*stride];
2396
int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2397
// int am= 18*(a2+a3) - 2*(a1+a4);
2398
/* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2399
int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
2401
// if(b_w==16) am= 8*(a1+a2);
2403
if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8;
2404
else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
2406
if(am&(~255)) am= ~(am>>31);
2409
/* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
2410
else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
2411
else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
2412
else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
2417
STOP_TIMER("mc_block")
2420
#define mca(dx,dy,b_w)\
2421
static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
2422
uint8_t tmp[stride*(b_w+5)];\
2424
mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
2436
static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){
2439
const int color= block->color[plane_index];
2440
for(y=0; y < b_h; y++){
2441
for(x=0; x < b_w; x++){
2442
dst[x + y*stride]= color;
2446
const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
2447
int mx= block->mx*scale;
2448
int my= block->my*scale;
2449
const int dx= mx&15;
2450
const int dy= my&15;
2453
src += sx + sy*stride;
2454
if( (unsigned)sx >= w - b_w - 4
2455
|| (unsigned)sy >= h - b_h - 4){
2456
ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
2459
if((dx&3) || (dy&3) || b_w!=b_h || (b_w!=4 && b_w!=8 && b_w!=16))
2460
mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
2462
s->dsp.put_h264_qpel_pixels_tab[2-(b_w>>3)][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
2466
static always_inline int same_block(BlockNode *a, BlockNode *b){
2467
return !((a->mx - b->mx) | (a->my - b->my) | a->type | b->type);
2470
//FIXME name clenup (b_w, block_w, b_width stuff)
2471
static always_inline void add_yblock_buffered(SnowContext *s, slice_buffer * sb, DWTELEM *old_dst, uint8_t *dst8, uint8_t *src, uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int plane_index){
2472
DWTELEM * dst = NULL;
2473
const int b_width = s->b_width << s->block_max_depth;
2474
const int b_height= s->b_height << s->block_max_depth;
2475
const int b_stride= b_width;
2476
BlockNode *lt= &s->block[b_x + b_y*b_stride];
2477
BlockNode *rt= lt+1;
2478
BlockNode *lb= lt+b_stride;
2479
BlockNode *rb= lb+1;
2481
int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2482
uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2489
}else if(b_x + 1 >= b_width){
2496
}else if(b_y + 1 >= b_height){
2501
if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2505
}else if(src_x + b_w > w){
2509
obmc -= src_y*obmc_stride;
2512
}else if(src_y + b_h> h){
2516
if(b_w<=0 || b_h<=0) return;
2518
assert(src_stride > 2*MB_SIZE + 5);
2519
// old_dst += src_x + src_y*dst_stride;
2520
dst8+= src_x + src_y*src_stride;
2521
// src += src_x + src_y*src_stride;
2523
ptmp= tmp + 3*tmp_step;
2526
pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2528
if(same_block(lt, rt)){
2533
pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2536
if(same_block(lt, lb)){
2538
}else if(same_block(rt, lb)){
2543
pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2546
if(same_block(lt, rb) ){
2548
}else if(same_block(rt, rb)){
2550
}else if(same_block(lb, rb)){
2554
pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2557
for(y=0; y<b_h; y++){
2558
for(x=0; x<b_w; x++){
2559
int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2560
if(add) dst[x + y*dst_stride] += v;
2561
else dst[x + y*dst_stride] -= v;
2564
for(y=0; y<b_h; y++){
2565
uint8_t *obmc2= obmc + (obmc_stride>>1);
2566
for(x=0; x<b_w; x++){
2567
int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2568
if(add) dst[x + y*dst_stride] += v;
2569
else dst[x + y*dst_stride] -= v;
2572
for(y=0; y<b_h; y++){
2573
uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2574
for(x=0; x<b_w; x++){
2575
int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2576
if(add) dst[x + y*dst_stride] += v;
2577
else dst[x + y*dst_stride] -= v;
2580
for(y=0; y<b_h; y++){
2581
uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2582
uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2583
for(x=0; x<b_w; x++){
2584
int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2585
if(add) dst[x + y*dst_stride] += v;
2586
else dst[x + y*dst_stride] -= v;
2594
for(y=0; y<b_h; y++){
2595
//FIXME ugly missue of obmc_stride
2596
uint8_t *obmc1= obmc + y*obmc_stride;
2597
uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2598
uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2599
uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2600
dst = slice_buffer_get_line(sb, src_y + y);
2601
for(x=0; x<b_w; x++){
2602
int v= obmc1[x] * block[3][x + y*src_stride]
2603
+obmc2[x] * block[2][x + y*src_stride]
2604
+obmc3[x] * block[1][x + y*src_stride]
2605
+obmc4[x] * block[0][x + y*src_stride];
2607
v <<= 8 - LOG2_OBMC_MAX;
2609
v += 1<<(7 - FRAC_BITS);
2610
v >>= 8 - FRAC_BITS;
2613
// v += old_dst[x + y*dst_stride];
2614
v += dst[x + src_x];
2615
v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2616
if(v&(~255)) v= ~(v>>31);
2617
dst8[x + y*src_stride] = v;
2619
// old_dst[x + y*dst_stride] -= v;
2620
dst[x + src_x] -= v;
2624
STOP_TIMER("Inner add y block")
2629
//FIXME name clenup (b_w, block_w, b_width stuff)
2630
static always_inline void add_yblock(SnowContext *s, DWTELEM *dst, uint8_t *dst8, uint8_t *src, uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int plane_index){
2631
const int b_width = s->b_width << s->block_max_depth;
2632
const int b_height= s->b_height << s->block_max_depth;
2633
const int b_stride= b_width;
2634
BlockNode *lt= &s->block[b_x + b_y*b_stride];
2635
BlockNode *rt= lt+1;
2636
BlockNode *lb= lt+b_stride;
2637
BlockNode *rb= lb+1;
2639
int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
2640
uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
2647
}else if(b_x + 1 >= b_width){
2654
}else if(b_y + 1 >= b_height){
2659
if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
2663
}else if(src_x + b_w > w){
2667
obmc -= src_y*obmc_stride;
2670
}else if(src_y + b_h> h){
2674
if(b_w<=0 || b_h<=0) return;
2676
assert(src_stride > 2*MB_SIZE + 5);
2677
dst += src_x + src_y*dst_stride;
2678
dst8+= src_x + src_y*src_stride;
2679
// src += src_x + src_y*src_stride;
2681
ptmp= tmp + 3*tmp_step;
2684
pred_block(s, block[0], src, tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
2686
if(same_block(lt, rt)){
2691
pred_block(s, block[1], src, tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
2694
if(same_block(lt, lb)){
2696
}else if(same_block(rt, lb)){
2701
pred_block(s, block[2], src, tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
2704
if(same_block(lt, rb) ){
2706
}else if(same_block(rt, rb)){
2708
}else if(same_block(lb, rb)){
2712
pred_block(s, block[3], src, tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
2715
for(y=0; y<b_h; y++){
2716
for(x=0; x<b_w; x++){
2717
int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
2718
if(add) dst[x + y*dst_stride] += v;
2719
else dst[x + y*dst_stride] -= v;
2722
for(y=0; y<b_h; y++){
2723
uint8_t *obmc2= obmc + (obmc_stride>>1);
2724
for(x=0; x<b_w; x++){
2725
int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
2726
if(add) dst[x + y*dst_stride] += v;
2727
else dst[x + y*dst_stride] -= v;
2730
for(y=0; y<b_h; y++){
2731
uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2732
for(x=0; x<b_w; x++){
2733
int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
2734
if(add) dst[x + y*dst_stride] += v;
2735
else dst[x + y*dst_stride] -= v;
2738
for(y=0; y<b_h; y++){
2739
uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
2740
uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2741
for(x=0; x<b_w; x++){
2742
int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
2743
if(add) dst[x + y*dst_stride] += v;
2744
else dst[x + y*dst_stride] -= v;
2748
for(y=0; y<b_h; y++){
2749
//FIXME ugly missue of obmc_stride
2750
uint8_t *obmc1= obmc + y*obmc_stride;
2751
uint8_t *obmc2= obmc1+ (obmc_stride>>1);
2752
uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
2753
uint8_t *obmc4= obmc3+ (obmc_stride>>1);
2754
for(x=0; x<b_w; x++){
2755
int v= obmc1[x] * block[3][x + y*src_stride]
2756
+obmc2[x] * block[2][x + y*src_stride]
2757
+obmc3[x] * block[1][x + y*src_stride]
2758
+obmc4[x] * block[0][x + y*src_stride];
2760
v <<= 8 - LOG2_OBMC_MAX;
2762
v += 1<<(7 - FRAC_BITS);
2763
v >>= 8 - FRAC_BITS;
2766
v += dst[x + y*dst_stride];
2767
v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
2768
if(v&(~255)) v= ~(v>>31);
2769
dst8[x + y*src_stride] = v;
2771
dst[x + y*dst_stride] -= v;
2778
static always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){
2779
Plane *p= &s->plane[plane_index];
2780
const int mb_w= s->b_width << s->block_max_depth;
2781
const int mb_h= s->b_height << s->block_max_depth;
2783
int block_size = MB_SIZE >> s->block_max_depth;
2784
int block_w = plane_index ? block_size/2 : block_size;
2785
const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2786
int obmc_stride= plane_index ? block_size : 2*block_size;
2787
int ref_stride= s->current_picture.linesize[plane_index];
2788
uint8_t *ref = s->last_picture.data[plane_index];
2789
uint8_t *dst8= s->current_picture.data[plane_index];
2794
if(s->keyframe || (s->avctx->debug&512)){
2799
for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2801
// DWTELEM * line = slice_buffer_get_line(sb, y);
2802
DWTELEM * line = sb->line[y];
2805
// int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2806
int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2808
if(v&(~255)) v= ~(v>>31);
2809
dst8[x + y*ref_stride]= v;
2813
for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
2815
// DWTELEM * line = slice_buffer_get_line(sb, y);
2816
DWTELEM * line = sb->line[y];
2819
line[x] -= 128 << FRAC_BITS;
2820
// buf[x + y*w]-= 128<<FRAC_BITS;
2828
for(mb_x=0; mb_x<=mb_w; mb_x++){
2831
add_yblock_buffered(s, sb, old_buffer, dst8, ref, obmc,
2832
block_w*mb_x - block_w/2,
2833
block_w*mb_y - block_w/2,
2836
w, ref_stride, obmc_stride,
2840
STOP_TIMER("add_yblock")
2843
STOP_TIMER("predict_slice")
2846
static always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){
2847
Plane *p= &s->plane[plane_index];
2848
const int mb_w= s->b_width << s->block_max_depth;
2849
const int mb_h= s->b_height << s->block_max_depth;
2851
int block_size = MB_SIZE >> s->block_max_depth;
2852
int block_w = plane_index ? block_size/2 : block_size;
2853
const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
2854
int obmc_stride= plane_index ? block_size : 2*block_size;
2855
int ref_stride= s->current_picture.linesize[plane_index];
2856
uint8_t *ref = s->last_picture.data[plane_index];
2857
uint8_t *dst8= s->current_picture.data[plane_index];
2862
if(s->keyframe || (s->avctx->debug&512)){
2867
for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2869
int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
2871
if(v&(~255)) v= ~(v>>31);
2872
dst8[x + y*ref_stride]= v;
2876
for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
2878
buf[x + y*w]-= 128<<FRAC_BITS;
2886
for(mb_x=0; mb_x<=mb_w; mb_x++){
2889
add_yblock(s, buf, dst8, ref, obmc,
2890
block_w*mb_x - block_w/2,
2891
block_w*mb_y - block_w/2,
2894
w, ref_stride, obmc_stride,
2898
STOP_TIMER("add_yblock")
2901
STOP_TIMER("predict_slice")
2904
static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
2905
const int mb_h= s->b_height << s->block_max_depth;
2907
for(mb_y=0; mb_y<=mb_h; mb_y++)
2908
predict_slice(s, buf, plane_index, add, mb_y);
2911
static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
2912
const int level= b->level;
2913
const int w= b->width;
2914
const int h= b->height;
2915
const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
2916
const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
2917
int x,y, thres1, thres2;
2920
if(s->qlog == LOSSLESS_QLOG) return;
2922
bias= bias ? 0 : (3*qmul)>>3;
2923
thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
2929
int i= src[x + y*stride];
2931
if((unsigned)(i+thres1) > thres2){
2934
i/= qmul; //FIXME optimize
2935
src[x + y*stride]= i;
2939
i/= qmul; //FIXME optimize
2940
src[x + y*stride]= -i;
2943
src[x + y*stride]= 0;
2949
int i= src[x + y*stride];
2951
if((unsigned)(i+thres1) > thres2){
2954
i= (i + bias) / qmul; //FIXME optimize
2955
src[x + y*stride]= i;
2959
i= (i + bias) / qmul; //FIXME optimize
2960
src[x + y*stride]= -i;
2963
src[x + y*stride]= 0;
2967
if(level+1 == s->spatial_decomposition_count){
2968
// STOP_TIMER("quantize")
2972
static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
2973
const int w= b->width;
2974
const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
2975
const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
2976
const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
2980
if(s->qlog == LOSSLESS_QLOG) return;
2982
for(y=start_y; y<end_y; y++){
2983
// DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
2984
DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
2988
line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
2990
line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
2994
if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
2995
STOP_TIMER("dquant")
2999
static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
3000
const int w= b->width;
3001
const int h= b->height;
3002
const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
3003
const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
3004
const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
3008
if(s->qlog == LOSSLESS_QLOG) return;
3012
int i= src[x + y*stride];
3014
src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
3016
src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
3020
if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
3021
STOP_TIMER("dquant")
3025
static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3026
const int w= b->width;
3027
const int h= b->height;
3030
for(y=h-1; y>=0; y--){
3031
for(x=w-1; x>=0; x--){
3032
int i= x + y*stride;
3036
if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3037
else src[i] -= src[i - 1];
3039
if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3040
else src[i] -= src[i - 1];
3043
if(y) src[i] -= src[i - stride];
3049
static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
3050
const int w= b->width;
3059
line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3061
for(y=start_y; y<end_y; y++){
3063
// line = slice_buffer_get_line_from_address(sb, src + (y * stride));
3064
line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
3068
if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
3069
else line[x] += line[x - 1];
3071
if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
3072
else line[x] += line[x - 1];
3075
if(y) line[x] += prev[x];
3080
// STOP_TIMER("correlate")
3083
static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
3084
const int w= b->width;
3085
const int h= b->height;
3090
int i= x + y*stride;
3094
if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
3095
else src[i] += src[i - 1];
3097
if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
3098
else src[i] += src[i - 1];
3101
if(y) src[i] += src[i - stride];
3107
static void encode_header(SnowContext *s){
3108
int plane_index, level, orientation;
3111
memset(kstate, MID_STATE, sizeof(kstate));
3113
put_rac(&s->c, kstate, s->keyframe);
3114
if(s->keyframe || s->always_reset)
3117
put_symbol(&s->c, s->header_state, s->version, 0);
3118
put_rac(&s->c, s->header_state, s->always_reset);
3119
put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
3120
put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
3121
put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
3122
put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
3123
put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
3124
put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
3125
put_rac(&s->c, s->header_state, s->spatial_scalability);
3126
// put_rac(&s->c, s->header_state, s->rate_scalability);
3128
for(plane_index=0; plane_index<2; plane_index++){
3129
for(level=0; level<s->spatial_decomposition_count; level++){
3130
for(orientation=level ? 1:0; orientation<4; orientation++){
3131
if(orientation==2) continue;
3132
put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
3137
put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
3138
put_symbol(&s->c, s->header_state, s->qlog, 1);
3139
put_symbol(&s->c, s->header_state, s->mv_scale, 0);
3140
put_symbol(&s->c, s->header_state, s->qbias, 1);
3141
put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
3144
static int decode_header(SnowContext *s){
3145
int plane_index, level, orientation;
3148
memset(kstate, MID_STATE, sizeof(kstate));
3150
s->keyframe= get_rac(&s->c, kstate);
3151
if(s->keyframe || s->always_reset)
3154
s->version= get_symbol(&s->c, s->header_state, 0);
3156
av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
3159
s->always_reset= get_rac(&s->c, s->header_state);
3160
s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3161
s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3162
s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
3163
s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
3164
s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
3165
s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
3166
s->spatial_scalability= get_rac(&s->c, s->header_state);
3167
// s->rate_scalability= get_rac(&s->c, s->header_state);
3169
for(plane_index=0; plane_index<3; plane_index++){
3170
for(level=0; level<s->spatial_decomposition_count; level++){
3171
for(orientation=level ? 1:0; orientation<4; orientation++){
3173
if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
3174
else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
3175
else q= get_symbol(&s->c, s->header_state, 1);
3176
s->plane[plane_index].band[level][orientation].qlog= q;
3182
s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
3183
if(s->spatial_decomposition_type > 2){
3184
av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
3188
s->qlog= get_symbol(&s->c, s->header_state, 1);
3189
s->mv_scale= get_symbol(&s->c, s->header_state, 0);
3190
s->qbias= get_symbol(&s->c, s->header_state, 1);
3191
s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
3196
static void init_qexp(){
3200
for(i=0; i<QROOT; i++){
3202
v *= pow(2, 1.0 / QROOT);
3206
static int common_init(AVCodecContext *avctx){
3207
SnowContext *s = avctx->priv_data;
3209
int level, orientation, plane_index, dec;
3213
dsputil_init(&s->dsp, avctx);
3216
s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
3217
s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
3218
s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
3219
s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
3220
s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
3221
s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
3240
#define mcfh(dx,dy)\
3241
s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
3242
s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
3243
mc_block_hpel ## dx ## dy ## 16;\
3244
s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
3245
s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
3246
mc_block_hpel ## dx ## dy ## 8;
3256
dec= s->spatial_decomposition_count= 5;
3257
s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
3259
s->chroma_h_shift= 1; //FIXME XXX
3260
s->chroma_v_shift= 1;
3262
// dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
3264
width= s->avctx->width;
3265
height= s->avctx->height;
3267
s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
3269
s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
3270
s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
3272
for(plane_index=0; plane_index<3; plane_index++){
3273
int w= s->avctx->width;
3274
int h= s->avctx->height;
3277
w>>= s->chroma_h_shift;
3278
h>>= s->chroma_v_shift;
3280
s->plane[plane_index].width = w;
3281
s->plane[plane_index].height= h;
3282
//av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
3283
for(level=s->spatial_decomposition_count-1; level>=0; level--){
3284
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3285
SubBand *b= &s->plane[plane_index].band[level][orientation];
3287
b->buf= s->spatial_dwt_buffer;
3289
b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
3290
b->width = (w + !(orientation&1))>>1;
3291
b->height= (h + !(orientation>1))>>1;
3293
b->stride_line = 1 << (s->spatial_decomposition_count - level);
3294
b->buf_x_offset = 0;
3295
b->buf_y_offset = 0;
3299
b->buf_x_offset = (w+1)>>1;
3302
b->buf += b->stride>>1;
3303
b->buf_y_offset = b->stride_line >> 1;
3307
b->parent= &s->plane[plane_index].band[level-1][orientation];
3308
b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff));
3317
width= s->width= avctx->width;
3318
height= s->height= avctx->height;
3320
assert(width && height);
3322
s->avctx->get_buffer(s->avctx, &s->mconly_picture);
3328
static void calculate_vissual_weight(SnowContext *s, Plane *p){
3329
int width = p->width;
3330
int height= p->height;
3331
int level, orientation, x, y;
3333
for(level=0; level<s->spatial_decomposition_count; level++){
3334
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3335
SubBand *b= &p->band[level][orientation];
3336
DWTELEM *buf= b->buf;
3339
memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
3340
buf[b->width/2 + b->height/2*b->stride]= 256*256;
3341
ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3342
for(y=0; y<height; y++){
3343
for(x=0; x<width; x++){
3344
int64_t d= s->spatial_dwt_buffer[x + y*width];
3349
b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
3350
// av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
3355
#ifdef CONFIG_ENCODERS
3356
static int encode_init(AVCodecContext *avctx)
3358
SnowContext *s = avctx->priv_data;
3361
if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
3362
av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n"
3363
"use vstrict=-2 / -strict -2 to use it anyway\n");
3373
s->m.flags = avctx->flags;
3374
s->m.bit_rate= avctx->bit_rate;
3376
s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
3377
s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3378
s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
3379
h263_encode_init(&s->m); //mv_penalty
3381
if(avctx->flags&CODEC_FLAG_PASS1){
3382
if(!avctx->stats_out)
3383
avctx->stats_out = av_mallocz(256);
3385
if(avctx->flags&CODEC_FLAG_PASS2){
3386
if(ff_rate_control_init(&s->m) < 0)
3390
for(plane_index=0; plane_index<3; plane_index++){
3391
calculate_vissual_weight(s, &s->plane[plane_index]);
3395
avctx->coded_frame= &s->current_picture;
3396
switch(avctx->pix_fmt){
3397
// case PIX_FMT_YUV444P:
3398
// case PIX_FMT_YUV422P:
3399
case PIX_FMT_YUV420P:
3401
// case PIX_FMT_YUV411P:
3402
// case PIX_FMT_YUV410P:
3403
s->colorspace_type= 0;
3405
/* case PIX_FMT_RGBA32:
3409
av_log(avctx, AV_LOG_ERROR, "format not supported\n");
3412
// avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
3413
s->chroma_h_shift= 1;
3414
s->chroma_v_shift= 1;
3419
static int frame_start(SnowContext *s){
3421
int w= s->avctx->width; //FIXME round up to x16 ?
3422
int h= s->avctx->height;
3424
if(s->current_picture.data[0]){
3425
draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
3426
draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
3427
draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
3430
tmp= s->last_picture;
3431
s->last_picture= s->current_picture;
3432
s->current_picture= tmp;
3434
s->current_picture.reference= 1;
3435
if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
3436
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
3443
#ifdef CONFIG_ENCODERS
3444
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
3445
SnowContext *s = avctx->priv_data;
3446
RangeCoder * const c= &s->c;
3447
AVFrame *pict = data;
3448
const int width= s->avctx->width;
3449
const int height= s->avctx->height;
3450
int level, orientation, plane_index;
3452
ff_init_range_encoder(c, buf, buf_size);
3453
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3455
s->input_picture = *pict;
3457
if(avctx->flags&CODEC_FLAG_PASS2){
3459
pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
3460
s->keyframe= pict->pict_type==FF_I_TYPE;
3461
s->m.picture_number= avctx->frame_number;
3462
pict->quality= ff_rate_estimate_qscale(&s->m);
3464
s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
3465
pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
3469
s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
3471
s->qlog += 61*QROOT/8;
3473
s->qlog= LOSSLESS_QLOG;
3477
s->current_picture.key_frame= s->keyframe;
3479
s->m.current_picture_ptr= &s->m.current_picture;
3480
if(pict->pict_type == P_TYPE){
3481
int block_width = (width +15)>>4;
3482
int block_height= (height+15)>>4;
3483
int stride= s->current_picture.linesize[0];
3485
assert(s->current_picture.data[0]);
3486
assert(s->last_picture.data[0]);
3488
s->m.avctx= s->avctx;
3489
s->m.current_picture.data[0]= s->current_picture.data[0];
3490
s->m. last_picture.data[0]= s-> last_picture.data[0];
3491
s->m. new_picture.data[0]= s-> input_picture.data[0];
3492
s->m. last_picture_ptr= &s->m. last_picture;
3494
s->m. last_picture.linesize[0]=
3495
s->m. new_picture.linesize[0]=
3496
s->m.current_picture.linesize[0]= stride;
3497
s->m.uvlinesize= s->current_picture.linesize[1];
3499
s->m.height= height;
3500
s->m.mb_width = block_width;
3501
s->m.mb_height= block_height;
3502
s->m.mb_stride= s->m.mb_width+1;
3503
s->m.b8_stride= 2*s->m.mb_width+1;
3505
s->m.pict_type= pict->pict_type;
3506
s->m.me_method= s->avctx->me_method;
3507
s->m.me.scene_change_score=0;
3508
s->m.flags= s->avctx->flags;
3509
s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
3510
s->m.out_format= FMT_H263;
3511
s->m.unrestricted_mv= 1;
3513
s->lambda = s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
3514
s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
3515
s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
3517
s->m.dsp= s->dsp; //move
3523
s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
3526
s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start);
3528
s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits;
3530
for(plane_index=0; plane_index<3; plane_index++){
3531
Plane *p= &s->plane[plane_index];
3535
// int bits= put_bits_count(&s->c.pb);
3538
if(pict->data[plane_index]) //FIXME gray hack
3541
s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
3544
predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
3547
&& pict->pict_type == P_TYPE
3548
&& s->m.me.scene_change_score > s->avctx->scenechange_threshold){
3549
ff_init_range_encoder(c, buf, buf_size);
3550
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3551
pict->pict_type= FF_I_TYPE;
3557
if(s->qlog == LOSSLESS_QLOG){
3560
s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS;
3565
ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3567
for(level=0; level<s->spatial_decomposition_count; level++){
3568
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3569
SubBand *b= &p->band[level][orientation];
3571
quantize(s, b, b->buf, b->stride, s->qbias);
3573
decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
3574
encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
3575
assert(b->parent==NULL || b->parent->stride == b->stride*2);
3577
correlate(s, b, b->buf, b->stride, 1, 0);
3580
// av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
3582
for(level=0; level<s->spatial_decomposition_count; level++){
3583
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3584
SubBand *b= &p->band[level][orientation];
3586
dequantize(s, b, b->buf, b->stride);
3590
ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
3591
if(s->qlog == LOSSLESS_QLOG){
3594
s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
3599
predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3600
STOP_TIMER("pred-conv")}
3601
if(s->avctx->flags&CODEC_FLAG_PSNR){
3604
if(pict->data[plane_index]) //FIXME gray hack
3607
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];
3611
s->avctx->error[plane_index] += error;
3612
s->current_picture.error[plane_index] = error;
3616
if(s->last_picture.data[0])
3617
avctx->release_buffer(avctx, &s->last_picture);
3619
s->current_picture.coded_picture_number = avctx->frame_number;
3620
s->current_picture.pict_type = pict->pict_type;
3621
s->current_picture.quality = pict->quality;
3622
if(avctx->flags&CODEC_FLAG_PASS1){
3623
s->m.p_tex_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits - s->m.mv_bits;
3624
s->m.current_picture.display_picture_number =
3625
s->m.current_picture.coded_picture_number = avctx->frame_number;
3626
s->m.pict_type = pict->pict_type;
3627
s->m.current_picture.quality = pict->quality;
3628
ff_write_pass1_stats(&s->m);
3630
if(avctx->flags&CODEC_FLAG_PASS2){
3631
s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
3636
return ff_rac_terminate(c);
3640
static void common_end(SnowContext *s){
3641
int plane_index, level, orientation;
3643
av_freep(&s->spatial_dwt_buffer);
3645
av_freep(&s->m.me.scratchpad);
3646
av_freep(&s->m.me.map);
3647
av_freep(&s->m.me.score_map);
3649
av_freep(&s->block);
3651
for(plane_index=0; plane_index<3; plane_index++){
3652
for(level=s->spatial_decomposition_count-1; level>=0; level--){
3653
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3654
SubBand *b= &s->plane[plane_index].band[level][orientation];
3656
av_freep(&b->x_coeff);
3662
#ifdef CONFIG_ENCODERS
3663
static int encode_end(AVCodecContext *avctx)
3665
SnowContext *s = avctx->priv_data;
3668
av_free(avctx->stats_out);
3674
static int decode_init(AVCodecContext *avctx)
3676
SnowContext *s = avctx->priv_data;
3679
avctx->pix_fmt= PIX_FMT_YUV420P;
3683
block_size = MB_SIZE >> s->block_max_depth;
3684
slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 2)) + 1, s->plane[0].width, s->spatial_dwt_buffer);
3689
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
3690
SnowContext *s = avctx->priv_data;
3691
RangeCoder * const c= &s->c;
3693
AVFrame *picture = data;
3694
int level, orientation, plane_index;
3696
ff_init_range_decoder(c, buf, buf_size);
3697
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
3699
s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
3701
if(!s->block) alloc_blocks(s);
3704
//keyframe flag dupliaction mess FIXME
3705
if(avctx->debug&FF_DEBUG_PICT_INFO)
3706
av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
3710
for(plane_index=0; plane_index<3; plane_index++){
3711
Plane *p= &s->plane[plane_index];
3715
int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
3717
if(s->avctx->debug&2048){
3718
memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
3719
predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
3723
int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
3724
s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
3730
for(level=0; level<s->spatial_decomposition_count; level++){
3731
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3732
SubBand *b= &p->band[level][orientation];
3733
unpack_coeffs(s, b, b->parent, orientation);
3736
STOP_TIMER("unpack coeffs");
3740
const int mb_h= s->b_height << s->block_max_depth;
3741
const int block_size = MB_SIZE >> s->block_max_depth;
3742
const int block_w = plane_index ? block_size/2 : block_size;
3744
dwt_compose_t cs[MAX_DECOMPOSITIONS];
3749
ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count);
3750
for(mb_y=0; mb_y<=mb_h; mb_y++){
3752
int slice_starty = block_w*mb_y;
3753
int slice_h = block_w*(mb_y+1);
3754
if (!(s->keyframe || s->avctx->debug&512)){
3755
slice_starty = FFMAX(0, slice_starty - (block_w >> 1));
3756
slice_h -= (block_w >> 1);
3761
for(level=0; level<s->spatial_decomposition_count; level++){
3762
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3763
SubBand *b= &p->band[level][orientation];
3766
int our_mb_start = mb_y;
3767
int our_mb_end = (mb_y + 1);
3768
start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2: 0);
3769
end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2);
3770
if (!(s->keyframe || s->avctx->debug&512)){
3771
start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level)));
3772
end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level)));
3774
start_y = FFMIN(b->height, start_y);
3775
end_y = FFMIN(b->height, end_y);
3777
if (start_y != end_y){
3778
if (orientation == 0){
3779
SubBand * correlate_band = &p->band[0][0];
3780
int correlate_end_y = FFMIN(b->height, end_y + 1);
3781
int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
3782
decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
3783
correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
3784
dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y);
3787
decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
3791
STOP_TIMER("decode_subband_slice");
3795
for(; yd<slice_h; yd+=4){
3796
ff_spatial_idwt_buffered_slice(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd);
3798
STOP_TIMER("idwt slice");}
3801
if(s->qlog == LOSSLESS_QLOG){
3802
for(; yq<slice_h && yq<h; yq++){
3803
DWTELEM * line = slice_buffer_get_line(&s->sb, yq);
3805
line[x] <<= FRAC_BITS;
3810
predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y);
3812
y = FFMIN(p->height, slice_starty);
3813
end_y = FFMIN(p->height, slice_h);
3815
slice_buffer_release(&s->sb, y++);
3818
slice_buffer_flush(&s->sb);
3820
STOP_TIMER("idwt + predict_slices")}
3825
if(s->last_picture.data[0])
3826
avctx->release_buffer(avctx, &s->last_picture);
3828
if(!(s->avctx->debug&2048))
3829
*picture= s->current_picture;
3831
*picture= s->mconly_picture;
3833
*data_size = sizeof(AVFrame);
3835
bytes_read= c->bytestream - c->bytestream_start;
3836
if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
3841
static int decode_end(AVCodecContext *avctx)
3843
SnowContext *s = avctx->priv_data;
3845
slice_buffer_destroy(&s->sb);
3852
AVCodec snow_decoder = {
3856
sizeof(SnowContext),
3861
0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
3865
#ifdef CONFIG_ENCODERS
3866
AVCodec snow_encoder = {
3870
sizeof(SnowContext),
3886
int buffer[2][width*height];
3889
s.spatial_decomposition_count=6;
3890
s.spatial_decomposition_type=1;
3892
printf("testing 5/3 DWT\n");
3893
for(i=0; i<width*height; i++)
3894
buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3896
ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3897
ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3899
for(i=0; i<width*height; i++)
3900
if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3902
printf("testing 9/7 DWT\n");
3903
s.spatial_decomposition_type=0;
3904
for(i=0; i<width*height; i++)
3905
buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
3907
ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3908
ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3910
for(i=0; i<width*height; i++)
3911
if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
3913
printf("testing AC coder\n");
3914
memset(s.header_state, 0, sizeof(s.header_state));
3915
ff_init_range_encoder(&s.c, buffer[0], 256*256);
3916
ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3918
for(i=-256; i<256; i++){
3920
put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
3921
STOP_TIMER("put_symbol")
3923
ff_rac_terminate(&s.c);
3925
memset(s.header_state, 0, sizeof(s.header_state));
3926
ff_init_range_decoder(&s.c, buffer[0], 256*256);
3927
ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
3929
for(i=-256; i<256; i++){
3932
j= get_symbol(&s.c, s.header_state, 1);
3933
STOP_TIMER("get_symbol")
3934
if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
3937
int level, orientation, x, y;
3938
int64_t errors[8][4];
3941
memset(errors, 0, sizeof(errors));
3942
s.spatial_decomposition_count=3;
3943
s.spatial_decomposition_type=0;
3944
for(level=0; level<s.spatial_decomposition_count; level++){
3945
for(orientation=level ? 1 : 0; orientation<4; orientation++){
3946
int w= width >> (s.spatial_decomposition_count-level);
3947
int h= height >> (s.spatial_decomposition_count-level);
3948
int stride= width << (s.spatial_decomposition_count-level);
3949
DWTELEM *buf= buffer[0];
3952
if(orientation&1) buf+=w;
3953
if(orientation>1) buf+=stride>>1;
3955
memset(buffer[0], 0, sizeof(int)*width*height);
3956
buf[w/2 + h/2*stride]= 256*256;
3957
ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
3958
for(y=0; y<height; y++){
3959
for(x=0; x<width; x++){
3960
int64_t d= buffer[0][x + y*width];
3962
if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
3964
if(ABS(height/2-y)<9 && level==2) printf("\n");
3966
error= (int)(sqrt(error)+0.5);
3967
errors[level][orientation]= error;
3968
if(g) g=ff_gcd(g, error);
3972
printf("static int const visual_weight[][4]={\n");
3973
for(level=0; level<s.spatial_decomposition_count; level++){
3975
for(orientation=0; orientation<4; orientation++){
3976
printf("%8lld,", errors[level][orientation]/g);
3984
int w= width >> (s.spatial_decomposition_count-level);
3985
int h= height >> (s.spatial_decomposition_count-level);
3986
int stride= width << (s.spatial_decomposition_count-level);
3987
DWTELEM *buf= buffer[0];
3993
memset(buffer[0], 0, sizeof(int)*width*height);
3995
for(y=0; y<height; y++){
3996
for(x=0; x<width; x++){
3997
int tab[4]={0,2,3,1};
3998
buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
4001
ff_spatial_dwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
4005
buf[x + y*stride ]=169;
4006
buf[x + y*stride-w]=64;
4009
ff_spatial_idwt(buffer[0], width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
4011
for(y=0; y<height; y++){
4012
for(x=0; x<width; x++){
4013
int64_t d= buffer[0][x + y*width];
4015
if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
4017
if(ABS(height/2-y)<9) printf("\n");