Statistics
| Branch: | Revision:

ffmpeg / libavcodec / snow.c @ 396a5e68

History | View | Annotate | Download (167 KB)

1 791e7b83 Michael Niedermayer
/*
2
 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3
 *
4 b78e7197 Diego Biurrun
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7 791e7b83 Michael Niedermayer
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9 b78e7197 Diego Biurrun
 * version 2.1 of the License, or (at your option) any later version.
10 791e7b83 Michael Niedermayer
 *
11 b78e7197 Diego Biurrun
 * FFmpeg is distributed in the hope that it will be useful,
12 791e7b83 Michael Niedermayer
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17 b78e7197 Diego Biurrun
 * License along with FFmpeg; if not, write to the Free Software
18 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 791e7b83 Michael Niedermayer
 */
20
21
#include "avcodec.h"
22
#include "common.h"
23
#include "dsputil.h"
24 059715a4 Robert Edele
#include "snow.h"
25 28869757 Michael Niedermayer
26
#include "rangecoder.h"
27 791e7b83 Michael Niedermayer
28
#include "mpegvideo.h"
29
30
#undef NDEBUG
31
#include <assert.h>
32
33
static const int8_t quant3[256]={
34
 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
35
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
36
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
37
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
43
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
44
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
45
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
50
};
51
static const int8_t quant3b[256]={
52
 0, 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, 1,
56
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
57
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
60
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
62
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
63
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
64
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
65
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
66
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
67
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
68
};
69 538a3841 Michael Niedermayer
static const int8_t quant3bA[256]={
70
 0, 0, 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,
74
 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
75
 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
76
 1,-1, 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
};
87 791e7b83 Michael Niedermayer
static const int8_t quant5[256]={
88
 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
89
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
90
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
93
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95
 2, 2, 2, 2, 2, 2, 2, 2, 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,-1,-1,-1,
104
};
105
static const int8_t quant7[256]={
106
 0, 1, 1, 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, 3, 3, 3, 3, 3, 3, 3, 3,
109
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
110
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
111
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
112
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
113
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
114
-3,-3,-3,-3,-3,-3,-3,-3,-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,-2,-2,-2,-2,-2,-2,-2,
120
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
121
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
122
};
123
static const int8_t quant9[256]={
124
 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
125
 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
126
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
127
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
128
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
129
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
130
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
131
 4, 4, 4, 4, 4, 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,-3,-3,-3,-3,
139
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
140
};
141
static const int8_t quant11[256]={
142
 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
145
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
146
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
147
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
148
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
149
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
150
-5,-5,-5,-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,-4,-4,
156
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
157
-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
158
};
159
static const int8_t quant13[256]={
160
 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
161
 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
162
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
163
 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
164
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
165
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
166
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
167
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
168
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
169
-6,-6,-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,-5,
173
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
174
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
175
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
176
};
177
178
#if 0 //64*cubic
179
static const uint8_t obmc32[1024]={
180
 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,
181
 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,
182
 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,
183
 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,
184
 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,
185
 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,
186
 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,
187
 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,
188
 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
189
 0, 1, 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,
190
 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
191
 0, 1, 3, 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,
192
 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,
193
 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,
194
 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,
195
 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,
196
 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,
197
 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,
198
 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,
199
 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,
200
 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,
201
 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,
202
 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,
203
 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,
204
 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,
205
 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,
206
 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,
207
 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,
208
 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,
209
 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,
210
 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,
211
 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,
212
//error:0.000022
213
};
214
static const uint8_t obmc16[256]={
215
 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
216
 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
217
 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
218
 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
219
 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
220
 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
221
 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
222
 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
223
 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
224
 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
225
 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
226
 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
227
 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
228
 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
229
 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
230
 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
231
//error:0.000033
232
};
233
#elif 1 // 64*linear
234
static const uint8_t obmc32[1024]={
235 561a18d3 Robert Edele
  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,
236
  0,  4,  4,  4,  8,  8,  8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12,  8,  8,  8,  4,  4,  4,  0,
237
  0,  4,  8,  8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12,  8,  8,  4,  0,
238
  0,  4,  8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12,  8,  4,  0,
239
  4,  8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12,  8,  4,
240
  4,  8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12,  8,  4,
241
  4,  8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16,  8,  4,
242
  4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12,  4,
243
  4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12,  4,
244
  4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16,  4,
245
  4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16,  4,
246
  4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16,  4,
247
  8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20,  8,
248
  8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20,  8,
249
  8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20,  8,
250
  8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24,  8,
251
  8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24,  8,
252
  8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20,  8,
253
  8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20,  8,
254
  8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20,  8,
255
  4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16,  4,
256
  4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16,  4,
257
  4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16,  4,
258
  4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12,  4,
259
  4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12,  4,
260
  4,  8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16,  8,  4,
261
  4,  8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12,  8,  4,
262
  4,  8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12,  8,  4,
263
  0,  4,  8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12,  8,  4,  0,
264
  0,  4,  8,  8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12,  8,  8,  4,  0,
265
  0,  4,  4,  4,  8,  8,  8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12,  8,  8,  8,  4,  4,  4,  0,
266
  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,
267 791e7b83 Michael Niedermayer
 //error:0.000020
268
};
269
static const uint8_t obmc16[256]={
270 561a18d3 Robert Edele
  0,  4,  4,  8,  8, 12, 12, 16, 16, 12, 12,  8,  8,  4,  4,  0,
271
  4,  8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16,  8,  4,
272
  4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16,  4,
273
  8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20,  8,
274
  8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28,  8,
275
 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
276
 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
277
 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
278
 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
279
 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
280
 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
281
  8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28,  8,
282
  8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20,  8,
283
  4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16,  4,
284
  4,  8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16,  8,  4,
285
  0,  4,  4,  8,  8, 12, 12, 16, 16, 12, 12,  8,  8,  4,  4,  0,
286 791e7b83 Michael Niedermayer
//error:0.000015
287
};
288
#else //64*cos
289
static const uint8_t obmc32[1024]={
290
 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,
291
 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,
292
 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,
293
 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,
294
 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,
295
 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,
296
 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,
297
 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,
298
 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
299
 0, 1, 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,
300
 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
301
 0, 1, 3, 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,
302
 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,
303
 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,
304
 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,
305
 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,
306
 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,
307
 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,
308
 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,
309
 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,
310
 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,
311
 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,
312
 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,
313
 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,
314
 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,
315
 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,
316
 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,
317
 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,
318
 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,
319
 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,
320
 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,
321
 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,
322
//error:0.000022
323
};
324
static const uint8_t obmc16[256]={
325
 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
326
 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
327
 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
328
 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
329
 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
330
 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
331
 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
332
 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
333
 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
334
 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
335
 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
336
 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
337
 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
338
 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
339
 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
340
 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
341
//error:0.000022
342
};
343
#endif
344
345 155ec6ed Michael Niedermayer
//linear *64
346
static const uint8_t obmc8[64]={
347 561a18d3 Robert Edele
  4, 12, 20, 28, 28, 20, 12,  4,
348
 12, 36, 60, 84, 84, 60, 36, 12,
349
 20, 60,100,140,140,100, 60, 20,
350
 28, 84,140,196,196,140, 84, 28,
351
 28, 84,140,196,196,140, 84, 28,
352
 20, 60,100,140,140,100, 60, 20,
353
 12, 36, 60, 84, 84, 60, 36, 12,
354
  4, 12, 20, 28, 28, 20, 12,  4,
355 155ec6ed Michael Niedermayer
//error:0.000000
356
};
357
358
//linear *64
359
static const uint8_t obmc4[16]={
360 561a18d3 Robert Edele
 16, 48, 48, 16,
361
 48,144,144, 48,
362
 48,144,144, 48,
363
 16, 48, 48, 16,
364 155ec6ed Michael Niedermayer
//error:0.000000
365
};
366
367
static const uint8_t *obmc_tab[4]={
368
    obmc32, obmc16, obmc8, obmc4
369
};
370
371 85fc0e75 Loren Merritt
static int scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES];
372
373 155ec6ed Michael Niedermayer
typedef struct BlockNode{
374
    int16_t mx;
375
    int16_t my;
376 8c36eaaa Loren Merritt
    uint8_t ref;
377 155ec6ed Michael Niedermayer
    uint8_t color[3];
378
    uint8_t type;
379
//#define TYPE_SPLIT    1
380
#define BLOCK_INTRA   1
381 51d6a3cf Michael Niedermayer
#define BLOCK_OPT     2
382 155ec6ed Michael Niedermayer
//#define TYPE_NOCOLOR  4
383
    uint8_t level; //FIXME merge into type?
384
}BlockNode;
385
386 51d6a3cf Michael Niedermayer
static const BlockNode null_block= { //FIXME add border maybe
387
    .color= {128,128,128},
388
    .mx= 0,
389
    .my= 0,
390 8c36eaaa Loren Merritt
    .ref= 0,
391 51d6a3cf Michael Niedermayer
    .type= 0,
392
    .level= 0,
393
};
394
395 155ec6ed Michael Niedermayer
#define LOG2_MB_SIZE 4
396
#define MB_SIZE (1<<LOG2_MB_SIZE)
397
398 a0d1931c Yartrebo
typedef struct x_and_coeff{
399
    int16_t x;
400 538a3841 Michael Niedermayer
    uint16_t coeff;
401 a0d1931c Yartrebo
} x_and_coeff;
402
403 791e7b83 Michael Niedermayer
typedef struct SubBand{
404
    int level;
405
    int stride;
406
    int width;
407
    int height;
408
    int qlog;                                   ///< log(qscale)/log[2^(1/6)]
409
    DWTELEM *buf;
410 a0d1931c Yartrebo
    int buf_x_offset;
411
    int buf_y_offset;
412
    int stride_line; ///< Stride measured in lines, not pixels.
413
    x_and_coeff * x_coeff;
414 791e7b83 Michael Niedermayer
    struct SubBand *parent;
415
    uint8_t state[/*7*2*/ 7 + 512][32];
416
}SubBand;
417
418
typedef struct Plane{
419
    int width;
420
    int height;
421
    SubBand band[MAX_DECOMPOSITIONS][4];
422
}Plane;
423
424
typedef struct SnowContext{
425
//    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)
426
427
    AVCodecContext *avctx;
428 28869757 Michael Niedermayer
    RangeCoder c;
429 791e7b83 Michael Niedermayer
    DSPContext dsp;
430 51d6a3cf Michael Niedermayer
    AVFrame new_picture;
431
    AVFrame input_picture;              ///< new_picture with the internal linesizes
432 791e7b83 Michael Niedermayer
    AVFrame current_picture;
433 8c36eaaa Loren Merritt
    AVFrame last_picture[MAX_REF_FRAMES];
434 791e7b83 Michael Niedermayer
    AVFrame mconly_picture;
435
//     uint8_t q_context[16];
436
    uint8_t header_state[32];
437 155ec6ed Michael Niedermayer
    uint8_t block_state[128 + 32*128];
438 791e7b83 Michael Niedermayer
    int keyframe;
439 19aa028d Michael Niedermayer
    int always_reset;
440 791e7b83 Michael Niedermayer
    int version;
441
    int spatial_decomposition_type;
442 396a5e68 Michael Niedermayer
    int last_spatial_decomposition_type;
443 791e7b83 Michael Niedermayer
    int temporal_decomposition_type;
444
    int spatial_decomposition_count;
445
    int temporal_decomposition_count;
446 8c36eaaa Loren Merritt
    int max_ref_frames;
447
    int ref_frames;
448
    int16_t (*ref_mvs[MAX_REF_FRAMES])[2];
449
    uint32_t *ref_scores[MAX_REF_FRAMES];
450 791e7b83 Michael Niedermayer
    DWTELEM *spatial_dwt_buffer;
451
    int colorspace_type;
452
    int chroma_h_shift;
453
    int chroma_v_shift;
454
    int spatial_scalability;
455
    int qlog;
456 396a5e68 Michael Niedermayer
    int last_qlog;
457 155ec6ed Michael Niedermayer
    int lambda;
458
    int lambda2;
459 4e64bead Loren Merritt
    int pass1_rc;
460 791e7b83 Michael Niedermayer
    int mv_scale;
461 396a5e68 Michael Niedermayer
    int last_mv_scale;
462 791e7b83 Michael Niedermayer
    int qbias;
463 396a5e68 Michael Niedermayer
    int last_qbias;
464 791e7b83 Michael Niedermayer
#define QBIAS_SHIFT 3
465 155ec6ed Michael Niedermayer
    int b_width;
466
    int b_height;
467
    int block_max_depth;
468 396a5e68 Michael Niedermayer
    int last_block_max_depth;
469 791e7b83 Michael Niedermayer
    Plane plane[MAX_PLANES];
470 155ec6ed Michael Niedermayer
    BlockNode *block;
471 51d6a3cf Michael Niedermayer
#define ME_CACHE_SIZE 1024
472
    int me_cache[ME_CACHE_SIZE];
473
    int me_cache_generation;
474 a0d1931c Yartrebo
    slice_buffer sb;
475 155ec6ed Michael Niedermayer
476 791e7b83 Michael Niedermayer
    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)
477
}SnowContext;
478
479 f9e6ebf7 Loren Merritt
typedef struct {
480
    DWTELEM *b0;
481
    DWTELEM *b1;
482
    DWTELEM *b2;
483
    DWTELEM *b3;
484
    int y;
485
} dwt_compose_t;
486
487 a0d1931c Yartrebo
#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)))
488
//#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
489
490 51d6a3cf Michael Niedermayer
static void iterative_me(SnowContext *s);
491
492 a0d1931c Yartrebo
static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
493
{
494
    int i;
495 115329f1 Diego Biurrun
496 a0d1931c Yartrebo
    buf->base_buffer = base_buffer;
497
    buf->line_count = line_count;
498
    buf->line_width = line_width;
499
    buf->data_count = max_allocated_lines;
500
    buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
501
    buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
502 115329f1 Diego Biurrun
503 a0d1931c Yartrebo
    for (i = 0; i < max_allocated_lines; i++)
504
    {
505
      buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
506
    }
507 115329f1 Diego Biurrun
508 a0d1931c Yartrebo
    buf->data_stack_top = max_allocated_lines - 1;
509
}
510
511
static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
512
{
513
    int offset;
514
    DWTELEM * buffer;
515 115329f1 Diego Biurrun
516
//  av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
517
518 a0d1931c Yartrebo
    assert(buf->data_stack_top >= 0);
519
//  assert(!buf->line[line]);
520
    if (buf->line[line])
521
        return buf->line[line];
522 115329f1 Diego Biurrun
523 a0d1931c Yartrebo
    offset = buf->line_width * line;
524
    buffer = buf->data_stack[buf->data_stack_top];
525
    buf->data_stack_top--;
526
    buf->line[line] = buffer;
527 115329f1 Diego Biurrun
528 a0d1931c Yartrebo
//  av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
529 115329f1 Diego Biurrun
530 a0d1931c Yartrebo
    return buffer;
531
}
532
533
static void slice_buffer_release(slice_buffer * buf, int line)
534
{
535
    int offset;
536
    DWTELEM * buffer;
537
538
    assert(line >= 0 && line < buf->line_count);
539
    assert(buf->line[line]);
540
541
    offset = buf->line_width * line;
542
    buffer = buf->line[line];
543
    buf->data_stack_top++;
544
    buf->data_stack[buf->data_stack_top] = buffer;
545
    buf->line[line] = NULL;
546 115329f1 Diego Biurrun
547 a0d1931c Yartrebo
//  av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
548
}
549
550
static void slice_buffer_flush(slice_buffer * buf)
551
{
552
    int i;
553
    for (i = 0; i < buf->line_count; i++)
554
    {
555
        if (buf->line[i])
556
        {
557
//      av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
558
            slice_buffer_release(buf, i);
559
        }
560
    }
561
}
562
563
static void slice_buffer_destroy(slice_buffer * buf)
564
{
565
    int i;
566
    slice_buffer_flush(buf);
567 115329f1 Diego Biurrun
568 a0d1931c Yartrebo
    for (i = buf->data_count - 1; i >= 0; i--)
569
    {
570
        assert(buf->data_stack[i]);
571 e7c8206e Michael Niedermayer
        av_freep(&buf->data_stack[i]);
572 a0d1931c Yartrebo
    }
573
    assert(buf->data_stack);
574 e7c8206e Michael Niedermayer
    av_freep(&buf->data_stack);
575 a0d1931c Yartrebo
    assert(buf->line);
576 e7c8206e Michael Niedermayer
    av_freep(&buf->line);
577 a0d1931c Yartrebo
}
578
579 bb270c08 Diego Biurrun
#ifdef __sgi
580 2554db9b Michael Niedermayer
// Avoid a name clash on SGI IRIX
581 bb270c08 Diego Biurrun
#undef qexp
582 2554db9b Michael Niedermayer
#endif
583 034aff03 Michael Niedermayer
#define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
584 c97de57c Michael Niedermayer
static uint8_t qexp[QROOT];
585 791e7b83 Michael Niedermayer
586
static inline int mirror(int v, int m){
587 13705b69 Michael Niedermayer
    while((unsigned)v > (unsigned)m){
588
        v=-v;
589
        if(v<0) v+= 2*m;
590
    }
591
    return v;
592 791e7b83 Michael Niedermayer
}
593
594 28869757 Michael Niedermayer
static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
595 791e7b83 Michael Niedermayer
    int i;
596
597
    if(v){
598 c26abfa5 Diego Biurrun
        const int a= FFABS(v);
599 791e7b83 Michael Niedermayer
        const int e= av_log2(a);
600
#if 1
601 115329f1 Diego Biurrun
        const int el= FFMIN(e, 10);
602 28869757 Michael Niedermayer
        put_rac(c, state+0, 0);
603 791e7b83 Michael Niedermayer
604
        for(i=0; i<el; i++){
605 28869757 Michael Niedermayer
            put_rac(c, state+1+i, 1);  //1..10
606 791e7b83 Michael Niedermayer
        }
607
        for(; i<e; i++){
608 28869757 Michael Niedermayer
            put_rac(c, state+1+9, 1);  //1..10
609 791e7b83 Michael Niedermayer
        }
610 28869757 Michael Niedermayer
        put_rac(c, state+1+FFMIN(i,9), 0);
611 791e7b83 Michael Niedermayer
612
        for(i=e-1; i>=el; i--){
613 28869757 Michael Niedermayer
            put_rac(c, state+22+9, (a>>i)&1); //22..31
614 791e7b83 Michael Niedermayer
        }
615
        for(; i>=0; i--){
616 28869757 Michael Niedermayer
            put_rac(c, state+22+i, (a>>i)&1); //22..31
617 791e7b83 Michael Niedermayer
        }
618
619
        if(is_signed)
620 28869757 Michael Niedermayer
            put_rac(c, state+11 + el, v < 0); //11..21
621 791e7b83 Michael Niedermayer
#else
622 115329f1 Diego Biurrun
623 28869757 Michael Niedermayer
        put_rac(c, state+0, 0);
624 791e7b83 Michael Niedermayer
        if(e<=9){
625
            for(i=0; i<e; i++){
626 28869757 Michael Niedermayer
                put_rac(c, state+1+i, 1);  //1..10
627 791e7b83 Michael Niedermayer
            }
628 28869757 Michael Niedermayer
            put_rac(c, state+1+i, 0);
629 791e7b83 Michael Niedermayer
630
            for(i=e-1; i>=0; i--){
631 28869757 Michael Niedermayer
                put_rac(c, state+22+i, (a>>i)&1); //22..31
632 791e7b83 Michael Niedermayer
            }
633
634
            if(is_signed)
635 28869757 Michael Niedermayer
                put_rac(c, state+11 + e, v < 0); //11..21
636 791e7b83 Michael Niedermayer
        }else{
637
            for(i=0; i<e; i++){
638 28869757 Michael Niedermayer
                put_rac(c, state+1+FFMIN(i,9), 1);  //1..10
639 791e7b83 Michael Niedermayer
            }
640 28869757 Michael Niedermayer
            put_rac(c, state+1+FFMIN(i,9), 0);
641 791e7b83 Michael Niedermayer
642
            for(i=e-1; i>=0; i--){
643 28869757 Michael Niedermayer
                put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
644 791e7b83 Michael Niedermayer
            }
645
646
            if(is_signed)
647 28869757 Michael Niedermayer
                put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
648 791e7b83 Michael Niedermayer
        }
649
#endif
650
    }else{
651 28869757 Michael Niedermayer
        put_rac(c, state+0, 1);
652 791e7b83 Michael Niedermayer
    }
653
}
654
655 28869757 Michael Niedermayer
static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
656
    if(get_rac(c, state+0))
657 791e7b83 Michael Niedermayer
        return 0;
658
    else{
659 7c2425d2 Loren Merritt
        int i, e, a;
660
        e= 0;
661 28869757 Michael Niedermayer
        while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
662 7c2425d2 Loren Merritt
            e++;
663 791e7b83 Michael Niedermayer
        }
664 7c2425d2 Loren Merritt
665 791e7b83 Michael Niedermayer
        a= 1;
666 7c2425d2 Loren Merritt
        for(i=e-1; i>=0; i--){
667 28869757 Michael Niedermayer
            a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
668 791e7b83 Michael Niedermayer
        }
669
670 28869757 Michael Niedermayer
        if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
671 791e7b83 Michael Niedermayer
            return -a;
672
        else
673
            return a;
674
    }
675
}
676
677 28869757 Michael Niedermayer
static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
678 4f4e9633 Michael Niedermayer
    int i;
679 0635cbfc Michael Niedermayer
    int r= log2>=0 ? 1<<log2 : 1;
680 4f4e9633 Michael Niedermayer
681
    assert(v>=0);
682 0635cbfc Michael Niedermayer
    assert(log2>=-4);
683
684
    while(v >= r){
685 28869757 Michael Niedermayer
        put_rac(c, state+4+log2, 1);
686 0635cbfc Michael Niedermayer
        v -= r;
687 4f4e9633 Michael Niedermayer
        log2++;
688 0635cbfc Michael Niedermayer
        if(log2>0) r+=r;
689 4f4e9633 Michael Niedermayer
    }
690 28869757 Michael Niedermayer
    put_rac(c, state+4+log2, 0);
691 115329f1 Diego Biurrun
692 4f4e9633 Michael Niedermayer
    for(i=log2-1; i>=0; i--){
693 28869757 Michael Niedermayer
        put_rac(c, state+31-i, (v>>i)&1);
694 4f4e9633 Michael Niedermayer
    }
695
}
696
697 28869757 Michael Niedermayer
static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
698 4f4e9633 Michael Niedermayer
    int i;
699 0635cbfc Michael Niedermayer
    int r= log2>=0 ? 1<<log2 : 1;
700 4f4e9633 Michael Niedermayer
    int v=0;
701
702 0635cbfc Michael Niedermayer
    assert(log2>=-4);
703
704 28869757 Michael Niedermayer
    while(get_rac(c, state+4+log2)){
705 0635cbfc Michael Niedermayer
        v+= r;
706 4f4e9633 Michael Niedermayer
        log2++;
707 0635cbfc Michael Niedermayer
        if(log2>0) r+=r;
708 4f4e9633 Michael Niedermayer
    }
709 115329f1 Diego Biurrun
710 4f4e9633 Michael Niedermayer
    for(i=log2-1; i>=0; i--){
711 28869757 Michael Niedermayer
        v+= get_rac(c, state+31-i)<<i;
712 4f4e9633 Michael Niedermayer
    }
713
714
    return v;
715
}
716
717 849f1035 Måns Rullgård
static av_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){
718 791e7b83 Michael Niedermayer
    const int mirror_left= !highpass;
719
    const int mirror_right= (width&1) ^ highpass;
720
    const int w= (width>>1) - 1 + (highpass & width);
721
    int i;
722
723
#define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
724
    if(mirror_left){
725
        dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
726
        dst += dst_step;
727
        src += src_step;
728
    }
729 115329f1 Diego Biurrun
730 791e7b83 Michael Niedermayer
    for(i=0; i<w; i++){
731
        dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
732
    }
733 115329f1 Diego Biurrun
734 791e7b83 Michael Niedermayer
    if(mirror_right){
735
        dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
736
    }
737
}
738
739 059715a4 Robert Edele
#ifndef lift5
740 849f1035 Måns Rullgård
static av_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){
741 791e7b83 Michael Niedermayer
    const int mirror_left= !highpass;
742
    const int mirror_right= (width&1) ^ highpass;
743
    const int w= (width>>1) - 1 + (highpass & width);
744
    int i;
745
746
    if(mirror_left){
747
        int r= 3*2*ref[0];
748
        r += r>>4;
749
        r += r>>8;
750
        dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
751
        dst += dst_step;
752
        src += src_step;
753
    }
754 115329f1 Diego Biurrun
755 791e7b83 Michael Niedermayer
    for(i=0; i<w; i++){
756
        int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
757
        r += r>>4;
758
        r += r>>8;
759
        dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
760
    }
761 115329f1 Diego Biurrun
762 791e7b83 Michael Niedermayer
    if(mirror_right){
763
        int r= 3*2*ref[w*ref_step];
764
        r += r>>4;
765
        r += r>>8;
766
        dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
767
    }
768
}
769 059715a4 Robert Edele
#endif
770 791e7b83 Michael Niedermayer
771 059715a4 Robert Edele
#ifndef liftS
772 849f1035 Måns Rullgård
static av_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){
773 f5a71928 Michael Niedermayer
    const int mirror_left= !highpass;
774
    const int mirror_right= (width&1) ^ highpass;
775
    const int w= (width>>1) - 1 + (highpass & width);
776
    int i;
777
778
    assert(shift == 4);
779
#define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
780
    if(mirror_left){
781
        dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
782
        dst += dst_step;
783
        src += src_step;
784
    }
785 115329f1 Diego Biurrun
786 f5a71928 Michael Niedermayer
    for(i=0; i<w; i++){
787
        dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
788
    }
789 115329f1 Diego Biurrun
790 f5a71928 Michael Niedermayer
    if(mirror_right){
791
        dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
792
    }
793
}
794 059715a4 Robert Edele
#endif
795 f5a71928 Michael Niedermayer
796 791e7b83 Michael Niedermayer
797 aa25a462 D Richard Felker III
static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
798 791e7b83 Michael Niedermayer
    int x, i;
799 115329f1 Diego Biurrun
800 791e7b83 Michael Niedermayer
    for(x=start; x<width; x+=2){
801
        int64_t sum=0;
802
803
        for(i=0; i<n; i++){
804
            int x2= x + 2*i - n + 1;
805
            if     (x2<     0) x2= -x2;
806
            else if(x2>=width) x2= 2*width-x2-2;
807
            sum += coeffs[i]*(int64_t)dst[x2];
808
        }
809
        if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
810
        else        dst[x] += (sum + (1<<shift)/2)>>shift;
811
    }
812
}
813
814 aa25a462 D Richard Felker III
static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
815 791e7b83 Michael Niedermayer
    int x, y, i;
816
    for(y=start; y<height; y+=2){
817
        for(x=0; x<width; x++){
818
            int64_t sum=0;
819 115329f1 Diego Biurrun
820 791e7b83 Michael Niedermayer
            for(i=0; i<n; i++){
821
                int y2= y + 2*i - n + 1;
822
                if     (y2<      0) y2= -y2;
823
                else if(y2>=height) y2= 2*height-y2-2;
824
                sum += coeffs[i]*(int64_t)dst[x + y2*stride];
825
            }
826
            if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
827
            else        dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
828
        }
829
    }
830
}
831
832
#define SCALEX 1
833
#define LX0 0
834
#define LX1 1
835
836 de890c9b Michael Niedermayer
#if 0 // more accurate 9/7
837 791e7b83 Michael Niedermayer
#define N1 2
838
#define SHIFT1 14
839
#define COEFFS1 (int[]){-25987,-25987}
840
#define N2 2
841
#define SHIFT2 19
842
#define COEFFS2 (int[]){-27777,-27777}
843
#define N3 2
844
#define SHIFT3 15
845
#define COEFFS3 (int[]){28931,28931}
846
#define N4 2
847
#define SHIFT4 15
848
#define COEFFS4 (int[]){14533,14533}
849
#elif 1 // 13/7 CRF
850
#define N1 4
851
#define SHIFT1 4
852
#define COEFFS1 (int[]){1,-9,-9,1}
853 de890c9b Michael Niedermayer
#define N2 4
854 791e7b83 Michael Niedermayer
#define SHIFT2 4
855
#define COEFFS2 (int[]){-1,5,5,-1}
856
#define N3 0
857
#define SHIFT3 1
858
#define COEFFS3 NULL
859
#define N4 0
860
#define SHIFT4 1
861
#define COEFFS4 NULL
862
#elif 1 // 3/5
863
#define LX0 1
864
#define LX1 0
865
#define SCALEX 0.5
866
#define N1 2
867
#define SHIFT1 1
868
#define COEFFS1 (int[]){1,1}
869
#define N2 2
870
#define SHIFT2 2
871
#define COEFFS2 (int[]){-1,-1}
872
#define N3 0
873
#define SHIFT3 0
874
#define COEFFS3 NULL
875
#define N4 0
876
#define SHIFT4 0
877
#define COEFFS4 NULL
878 115329f1 Diego Biurrun
#elif 1 // 11/5
879 791e7b83 Michael Niedermayer
#define N1 0
880
#define SHIFT1 1
881
#define COEFFS1 NULL
882
#define N2 2
883
#define SHIFT2 2
884
#define COEFFS2 (int[]){-1,-1}
885
#define N3 2
886
#define SHIFT3 0
887
#define COEFFS3 (int[]){-1,-1}
888
#define N4 4
889
#define SHIFT4 7
890
#define COEFFS4 (int[]){-5,29,29,-5}
891
#define SCALEX 4
892
#elif 1 // 9/7 CDF
893
#define N1 2
894
#define SHIFT1 7
895
#define COEFFS1 (int[]){-203,-203}
896
#define N2 2
897
#define SHIFT2 12
898
#define COEFFS2 (int[]){-217,-217}
899
#define N3 2
900
#define SHIFT3 7
901
#define COEFFS3 (int[]){113,113}
902
#define N4 2
903
#define SHIFT4 9
904
#define COEFFS4 (int[]){227,227}
905
#define SCALEX 1
906
#elif 1 // 7/5 CDF
907
#define N1 0
908
#define SHIFT1 1
909
#define COEFFS1 NULL
910
#define N2 2
911
#define SHIFT2 2
912
#define COEFFS2 (int[]){-1,-1}
913
#define N3 2
914
#define SHIFT3 0
915
#define COEFFS3 (int[]){-1,-1}
916
#define N4 2
917
#define SHIFT4 4
918
#define COEFFS4 (int[]){3,3}
919
#elif 1 // 9/7 MN
920
#define N1 4
921
#define SHIFT1 4
922
#define COEFFS1 (int[]){1,-9,-9,1}
923
#define N2 2
924
#define SHIFT2 2
925
#define COEFFS2 (int[]){1,1}
926
#define N3 0
927
#define SHIFT3 1
928
#define COEFFS3 NULL
929
#define N4 0
930
#define SHIFT4 1
931
#define COEFFS4 NULL
932
#else // 13/7 CRF
933
#define N1 4
934
#define SHIFT1 4
935
#define COEFFS1 (int[]){1,-9,-9,1}
936
#define N2 4
937
#define SHIFT2 4
938
#define COEFFS2 (int[]){-1,5,5,-1}
939
#define N3 0
940
#define SHIFT3 1
941
#define COEFFS3 NULL
942
#define N4 0
943
#define SHIFT4 1
944
#define COEFFS4 NULL
945
#endif
946 aa25a462 D Richard Felker III
static void horizontal_decomposeX(DWTELEM *b, int width){
947
    DWTELEM temp[width];
948 791e7b83 Michael Niedermayer
    const int width2= width>>1;
949
    const int w2= (width+1)>>1;
950 62ab0b78 Aurelien Jacobs
    int x;
951 791e7b83 Michael Niedermayer
952
    inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
953
    inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
954
    inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
955
    inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
956 115329f1 Diego Biurrun
957 791e7b83 Michael Niedermayer
    for(x=0; x<width2; x++){
958
        temp[x   ]= b[2*x    ];
959
        temp[x+w2]= b[2*x + 1];
960
    }
961
    if(width&1)
962
        temp[x   ]= b[2*x    ];
963
    memcpy(b, temp, width*sizeof(int));
964
}
965
966 aa25a462 D Richard Felker III
static void horizontal_composeX(DWTELEM *b, int width){
967
    DWTELEM temp[width];
968 791e7b83 Michael Niedermayer
    const int width2= width>>1;
969 62ab0b78 Aurelien Jacobs
    int x;
970 791e7b83 Michael Niedermayer
    const int w2= (width+1)>>1;
971
972
    memcpy(temp, b, width*sizeof(int));
973
    for(x=0; x<width2; x++){
974
        b[2*x    ]= temp[x   ];
975
        b[2*x + 1]= temp[x+w2];
976
    }
977
    if(width&1)
978
        b[2*x    ]= temp[x   ];
979
980
    inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
981
    inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
982
    inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
983
    inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
984
}
985
986 aa25a462 D Richard Felker III
static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
987 791e7b83 Michael Niedermayer
    int x, y;
988 115329f1 Diego Biurrun
989 791e7b83 Michael Niedermayer
    for(y=0; y<height; y++){
990
        for(x=0; x<width; x++){
991
            buffer[y*stride + x] *= SCALEX;
992
        }
993
    }
994
995
    for(y=0; y<height; y++){
996
        horizontal_decomposeX(buffer + y*stride, width);
997
    }
998 115329f1 Diego Biurrun
999 791e7b83 Michael Niedermayer
    inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
1000
    inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
1001
    inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
1002 115329f1 Diego Biurrun
    inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
1003 791e7b83 Michael Niedermayer
}
1004
1005 aa25a462 D Richard Felker III
static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
1006 791e7b83 Michael Niedermayer
    int x, y;
1007 115329f1 Diego Biurrun
1008 791e7b83 Michael Niedermayer
    inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
1009
    inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
1010
    inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
1011
    inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
1012
1013
    for(y=0; y<height; y++){
1014
        horizontal_composeX(buffer + y*stride, width);
1015
    }
1016
1017
    for(y=0; y<height; y++){
1018
        for(x=0; x<width; x++){
1019
            buffer[y*stride + x] /= SCALEX;
1020
        }
1021
    }
1022
}
1023
1024 aa25a462 D Richard Felker III
static void horizontal_decompose53i(DWTELEM *b, int width){
1025
    DWTELEM temp[width];
1026 791e7b83 Michael Niedermayer
    const int width2= width>>1;
1027 62ab0b78 Aurelien Jacobs
    int x;
1028 791e7b83 Michael Niedermayer
    const int w2= (width+1)>>1;
1029
1030
    for(x=0; x<width2; x++){
1031
        temp[x   ]= b[2*x    ];
1032
        temp[x+w2]= b[2*x + 1];
1033
    }
1034
    if(width&1)
1035
        temp[x   ]= b[2*x    ];
1036
#if 0
1037 62ab0b78 Aurelien Jacobs
    {
1038
    int A1,A2,A3,A4;
1039 791e7b83 Michael Niedermayer
    A2= temp[1       ];
1040
    A4= temp[0       ];
1041
    A1= temp[0+width2];
1042
    A1 -= (A2 + A4)>>1;
1043
    A4 += (A1 + 1)>>1;
1044
    b[0+width2] = A1;
1045
    b[0       ] = A4;
1046
    for(x=1; x+1<width2; x+=2){
1047
        A3= temp[x+width2];
1048
        A4= temp[x+1     ];
1049
        A3 -= (A2 + A4)>>1;
1050
        A2 += (A1 + A3 + 2)>>2;
1051
        b[x+width2] = A3;
1052
        b[x       ] = A2;
1053

1054
        A1= temp[x+1+width2];
1055
        A2= temp[x+2       ];
1056
        A1 -= (A2 + A4)>>1;
1057
        A4 += (A1 + A3 + 2)>>2;
1058
        b[x+1+width2] = A1;
1059
        b[x+1       ] = A4;
1060
    }
1061
    A3= temp[width-1];
1062
    A3 -= A2;
1063
    A2 += (A1 + A3 + 2)>>2;
1064
    b[width -1] = A3;
1065
    b[width2-1] = A2;
1066 62ab0b78 Aurelien Jacobs
    }
1067 115329f1 Diego Biurrun
#else
1068 791e7b83 Michael Niedermayer
    lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1069
    lift(b   , temp   , b+w2, 1, 1, 1, width,  1, 2, 2, 0, 0);
1070
#endif
1071
}
1072
1073 aa25a462 D Richard Felker III
static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1074 791e7b83 Michael Niedermayer
    int i;
1075 115329f1 Diego Biurrun
1076 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1077
        b1[i] -= (b0[i] + b2[i])>>1;
1078
    }
1079
}
1080
1081 aa25a462 D Richard Felker III
static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1082 791e7b83 Michael Niedermayer
    int i;
1083 115329f1 Diego Biurrun
1084 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1085
        b1[i] += (b0[i] + b2[i] + 2)>>2;
1086
    }
1087
}
1088
1089 aa25a462 D Richard Felker III
static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
1090 39c61bbb Michael Niedermayer
    int y;
1091 791e7b83 Michael Niedermayer
    DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1092
    DWTELEM *b1= buffer + mirror(-2  , height-1)*stride;
1093 115329f1 Diego Biurrun
1094 791e7b83 Michael Niedermayer
    for(y=-2; y<height; y+=2){
1095
        DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1096
        DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1097
1098
{START_TIMER
1099 13705b69 Michael Niedermayer
        if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);
1100
        if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);
1101 791e7b83 Michael Niedermayer
STOP_TIMER("horizontal_decompose53i")}
1102 115329f1 Diego Biurrun
1103 791e7b83 Michael Niedermayer
{START_TIMER
1104 13705b69 Michael Niedermayer
        if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);
1105
        if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);
1106 791e7b83 Michael Niedermayer
STOP_TIMER("vertical_decompose53i*")}
1107 115329f1 Diego Biurrun
1108 791e7b83 Michael Niedermayer
        b0=b2;
1109
        b1=b3;
1110
    }
1111
}
1112
1113 aa25a462 D Richard Felker III
static void horizontal_decompose97i(DWTELEM *b, int width){
1114
    DWTELEM temp[width];
1115 791e7b83 Michael Niedermayer
    const int w2= (width+1)>>1;
1116
1117
    lift (temp+w2, b    +1, b      , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1118 f5a71928 Michael Niedermayer
    liftS(temp   , b      , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1119 791e7b83 Michael Niedermayer
    lift5(b   +w2, temp+w2, temp   , 1, 1, 1, width,  W_CM, W_CO, W_CS, 1, 0);
1120
    lift (b      , temp   , b   +w2, 1, 1, 1, width,  W_DM, W_DO, W_DS, 0, 0);
1121
}
1122
1123
1124 aa25a462 D Richard Felker III
static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1125 791e7b83 Michael Niedermayer
    int i;
1126 115329f1 Diego Biurrun
1127 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1128
        b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1129
    }
1130
}
1131
1132 aa25a462 D Richard Felker III
static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1133 791e7b83 Michael Niedermayer
    int i;
1134 115329f1 Diego Biurrun
1135 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1136
#ifdef lift5
1137
        b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1138
#else
1139
        int r= 3*(b0[i] + b2[i]);
1140
        r+= r>>4;
1141
        r+= r>>8;
1142
        b1[i] += (r+W_CO)>>W_CS;
1143
#endif
1144
    }
1145
}
1146
1147 aa25a462 D Richard Felker III
static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1148 791e7b83 Michael Niedermayer
    int i;
1149 115329f1 Diego Biurrun
1150 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1151 f5a71928 Michael Niedermayer
#ifdef liftS
1152 791e7b83 Michael Niedermayer
        b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1153 f5a71928 Michael Niedermayer
#else
1154
        b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
1155
#endif
1156 791e7b83 Michael Niedermayer
    }
1157
}
1158
1159 aa25a462 D Richard Felker III
static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1160 791e7b83 Michael Niedermayer
    int i;
1161 115329f1 Diego Biurrun
1162 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1163
        b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1164
    }
1165
}
1166
1167 aa25a462 D Richard Felker III
static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
1168 39c61bbb Michael Niedermayer
    int y;
1169 791e7b83 Michael Niedermayer
    DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1170
    DWTELEM *b1= buffer + mirror(-4  , height-1)*stride;
1171
    DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1172
    DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1173 115329f1 Diego Biurrun
1174 791e7b83 Michael Niedermayer
    for(y=-4; y<height; y+=2){
1175
        DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1176
        DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1177
1178
{START_TIMER
1179 13705b69 Michael Niedermayer
        if(y+3<(unsigned)height) horizontal_decompose97i(b4, width);
1180
        if(y+4<(unsigned)height) horizontal_decompose97i(b5, width);
1181 791e7b83 Michael Niedermayer
if(width>400){
1182
STOP_TIMER("horizontal_decompose97i")
1183
}}
1184 115329f1 Diego Biurrun
1185 791e7b83 Michael Niedermayer
{START_TIMER
1186 13705b69 Michael Niedermayer
        if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width);
1187
        if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width);
1188
        if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width);
1189
        if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width);
1190 791e7b83 Michael Niedermayer
1191
if(width>400){
1192
STOP_TIMER("vertical_decompose97i")
1193
}}
1194 115329f1 Diego Biurrun
1195 791e7b83 Michael Niedermayer
        b0=b2;
1196
        b1=b3;
1197
        b2=b4;
1198
        b3=b5;
1199
    }
1200
}
1201
1202 aa25a462 D Richard Felker III
void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1203 791e7b83 Michael Niedermayer
    int level;
1204 115329f1 Diego Biurrun
1205 46c281e8 Michael Niedermayer
    for(level=0; level<decomposition_count; level++){
1206
        switch(type){
1207 d4b287ed Loren Merritt
        case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1208
        case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1209
        case DWT_X: spatial_decomposeX  (buffer, width>>level, height>>level, stride<<level); break;
1210 791e7b83 Michael Niedermayer
        }
1211
    }
1212
}
1213
1214 aa25a462 D Richard Felker III
static void horizontal_compose53i(DWTELEM *b, int width){
1215
    DWTELEM temp[width];
1216 791e7b83 Michael Niedermayer
    const int width2= width>>1;
1217
    const int w2= (width+1)>>1;
1218 62ab0b78 Aurelien Jacobs
    int x;
1219 791e7b83 Michael Niedermayer
1220
#if 0
1221 62ab0b78 Aurelien Jacobs
    int A1,A2,A3,A4;
1222 791e7b83 Michael Niedermayer
    A2= temp[1       ];
1223
    A4= temp[0       ];
1224
    A1= temp[0+width2];
1225
    A1 -= (A2 + A4)>>1;
1226
    A4 += (A1 + 1)>>1;
1227
    b[0+width2] = A1;
1228
    b[0       ] = A4;
1229
    for(x=1; x+1<width2; x+=2){
1230
        A3= temp[x+width2];
1231
        A4= temp[x+1     ];
1232
        A3 -= (A2 + A4)>>1;
1233
        A2 += (A1 + A3 + 2)>>2;
1234
        b[x+width2] = A3;
1235
        b[x       ] = A2;
1236

1237
        A1= temp[x+1+width2];
1238
        A2= temp[x+2       ];
1239
        A1 -= (A2 + A4)>>1;
1240
        A4 += (A1 + A3 + 2)>>2;
1241
        b[x+1+width2] = A1;
1242
        b[x+1       ] = A4;
1243
    }
1244
    A3= temp[width-1];
1245
    A3 -= A2;
1246
    A2 += (A1 + A3 + 2)>>2;
1247
    b[width -1] = A3;
1248
    b[width2-1] = A2;
1249 115329f1 Diego Biurrun
#else
1250 791e7b83 Michael Niedermayer
    lift(temp   , b   , b+w2, 1, 1, 1, width,  1, 2, 2, 0, 1);
1251
    lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1252
#endif
1253
    for(x=0; x<width2; x++){
1254
        b[2*x    ]= temp[x   ];
1255
        b[2*x + 1]= temp[x+w2];
1256
    }
1257
    if(width&1)
1258
        b[2*x    ]= temp[x   ];
1259
}
1260
1261 aa25a462 D Richard Felker III
static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1262 791e7b83 Michael Niedermayer
    int i;
1263 115329f1 Diego Biurrun
1264 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1265
        b1[i] += (b0[i] + b2[i])>>1;
1266
    }
1267
}
1268
1269 aa25a462 D Richard Felker III
static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1270 791e7b83 Michael Niedermayer
    int i;
1271 115329f1 Diego Biurrun
1272 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1273
        b1[i] -= (b0[i] + b2[i] + 2)>>2;
1274
    }
1275
}
1276
1277 a0d1931c Yartrebo
static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1278
    cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
1279
    cs->b1 = slice_buffer_get_line(sb, mirror(-1  , height-1) * stride_line);
1280
    cs->y = -1;
1281
}
1282
1283 f9e6ebf7 Loren Merritt
static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1284
    cs->b0 = buffer + mirror(-1-1, height-1)*stride;
1285
    cs->b1 = buffer + mirror(-1  , height-1)*stride;
1286
    cs->y = -1;
1287
}
1288
1289 a0d1931c Yartrebo
static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1290
    int y= cs->y;
1291 115329f1 Diego Biurrun
1292 a0d1931c Yartrebo
    DWTELEM *b0= cs->b0;
1293
    DWTELEM *b1= cs->b1;
1294 3b6ab26c Michael Niedermayer
    DWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line);
1295
    DWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line);
1296 a0d1931c Yartrebo
1297
{START_TIMER
1298 13705b69 Michael Niedermayer
        if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1299
        if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1300 a0d1931c Yartrebo
STOP_TIMER("vertical_compose53i*")}
1301
1302
{START_TIMER
1303 13705b69 Michael Niedermayer
        if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1304
        if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1305 a0d1931c Yartrebo
STOP_TIMER("horizontal_compose53i")}
1306
1307
    cs->b0 = b2;
1308
    cs->b1 = b3;
1309
    cs->y += 2;
1310
}
1311
1312 f9e6ebf7 Loren Merritt
static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1313
    int y= cs->y;
1314
    DWTELEM *b0= cs->b0;
1315
    DWTELEM *b1= cs->b1;
1316
    DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1317
    DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1318 791e7b83 Michael Niedermayer
1319
{START_TIMER
1320 13705b69 Michael Niedermayer
        if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
1321
        if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
1322 791e7b83 Michael Niedermayer
STOP_TIMER("vertical_compose53i*")}
1323
1324
{START_TIMER
1325 13705b69 Michael Niedermayer
        if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
1326
        if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
1327 791e7b83 Michael Niedermayer
STOP_TIMER("horizontal_compose53i")}
1328
1329 f9e6ebf7 Loren Merritt
    cs->b0 = b2;
1330
    cs->b1 = b3;
1331
    cs->y += 2;
1332
}
1333
1334
static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
1335
    dwt_compose_t cs;
1336
    spatial_compose53i_init(&cs, buffer, height, stride);
1337
    while(cs.y <= height)
1338
        spatial_compose53i_dy(&cs, buffer, width, height, stride);
1339 115329f1 Diego Biurrun
}
1340
1341 791e7b83 Michael Niedermayer
1342 059715a4 Robert Edele
void ff_snow_horizontal_compose97i(DWTELEM *b, int width){
1343 aa25a462 D Richard Felker III
    DWTELEM temp[width];
1344 791e7b83 Michael Niedermayer
    const int w2= (width+1)>>1;
1345
1346
    lift (temp   , b      , b   +w2, 1, 1, 1, width,  W_DM, W_DO, W_DS, 0, 1);
1347
    lift5(temp+w2, b   +w2, temp   , 1, 1, 1, width,  W_CM, W_CO, W_CS, 1, 1);
1348 f5a71928 Michael Niedermayer
    liftS(b      , temp   , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1349 791e7b83 Michael Niedermayer
    lift (b+1    , temp+w2, b      , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1350
}
1351
1352 aa25a462 D Richard Felker III
static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1353 791e7b83 Michael Niedermayer
    int i;
1354 115329f1 Diego Biurrun
1355 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1356
        b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1357
    }
1358
}
1359
1360 aa25a462 D Richard Felker III
static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1361 791e7b83 Michael Niedermayer
    int i;
1362 115329f1 Diego Biurrun
1363 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1364
#ifdef lift5
1365
        b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1366
#else
1367
        int r= 3*(b0[i] + b2[i]);
1368
        r+= r>>4;
1369
        r+= r>>8;
1370
        b1[i] -= (r+W_CO)>>W_CS;
1371
#endif
1372
    }
1373
}
1374
1375 aa25a462 D Richard Felker III
static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1376 791e7b83 Michael Niedermayer
    int i;
1377 115329f1 Diego Biurrun
1378 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1379 f5a71928 Michael Niedermayer
#ifdef liftS
1380 791e7b83 Michael Niedermayer
        b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1381 f5a71928 Michael Niedermayer
#else
1382
        b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
1383
#endif
1384 791e7b83 Michael Niedermayer
    }
1385
}
1386
1387 aa25a462 D Richard Felker III
static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
1388 791e7b83 Michael Niedermayer
    int i;
1389 115329f1 Diego Biurrun
1390 791e7b83 Michael Niedermayer
    for(i=0; i<width; i++){
1391
        b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1392
    }
1393
}
1394
1395 059715a4 Robert Edele
void ff_snow_vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
1396 565a45ac Michael Niedermayer
    int i;
1397 115329f1 Diego Biurrun
1398 565a45ac Michael Niedermayer
    for(i=0; i<width; i++){
1399 62ab0b78 Aurelien Jacobs
#ifndef lift5
1400 565a45ac Michael Niedermayer
        int r;
1401 62ab0b78 Aurelien Jacobs
#endif
1402 565a45ac Michael Niedermayer
        b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
1403
#ifdef lift5
1404
        b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
1405
#else
1406
        r= 3*(b2[i] + b4[i]);
1407
        r+= r>>4;
1408
        r+= r>>8;
1409
        b3[i] -= (r+W_CO)>>W_CS;
1410
#endif
1411 f5a71928 Michael Niedermayer
#ifdef liftS
1412 565a45ac Michael Niedermayer
        b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
1413 f5a71928 Michael Niedermayer
#else
1414
        b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
1415
#endif
1416 565a45ac Michael Niedermayer
        b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1417
    }
1418
}
1419
1420 a0d1931c Yartrebo
static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
1421
    cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
1422
    cs->b1 = slice_buffer_get_line(sb, mirror(-3  , height-1) * stride_line);
1423
    cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
1424
    cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
1425
    cs->y = -3;
1426
}
1427
1428 f9e6ebf7 Loren Merritt
static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
1429
    cs->b0 = buffer + mirror(-3-1, height-1)*stride;
1430
    cs->b1 = buffer + mirror(-3  , height-1)*stride;
1431
    cs->b2 = buffer + mirror(-3+1, height-1)*stride;
1432
    cs->b3 = buffer + mirror(-3+2, height-1)*stride;
1433
    cs->y = -3;
1434
}
1435 791e7b83 Michael Niedermayer
1436 059715a4 Robert Edele
static void spatial_compose97i_dy_buffered(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
1437 a0d1931c Yartrebo
    int y = cs->y;
1438 115329f1 Diego Biurrun
1439 a0d1931c Yartrebo
    DWTELEM *b0= cs->b0;
1440
    DWTELEM *b1= cs->b1;
1441
    DWTELEM *b2= cs->b2;
1442
    DWTELEM *b3= cs->b3;
1443 3b6ab26c Michael Niedermayer
    DWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line);
1444
    DWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line);
1445 115329f1 Diego Biurrun
1446 a0d1931c Yartrebo
{START_TIMER
1447 565a45ac Michael Niedermayer
    if(y>0 && y+4<height){
1448 059715a4 Robert Edele
        dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
1449 565a45ac Michael Niedermayer
    }else{
1450 13705b69 Michael Niedermayer
        if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1451
        if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1452
        if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1453
        if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1454 565a45ac Michael Niedermayer
    }
1455 a0d1931c Yartrebo
if(width>400){
1456
STOP_TIMER("vertical_compose97i")}}
1457
1458
{START_TIMER
1459 059715a4 Robert Edele
        if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width);
1460
        if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width);
1461 3b6ab26c Michael Niedermayer
if(width>400 && y+0<(unsigned)height){
1462 a0d1931c Yartrebo
STOP_TIMER("horizontal_compose97i")}}
1463
1464
    cs->b0=b2;
1465
    cs->b1=b3;
1466
    cs->b2=b4;
1467
    cs->b3=b5;
1468
    cs->y += 2;
1469
}
1470
1471 f9e6ebf7 Loren Merritt
static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
1472
    int y = cs->y;
1473
    DWTELEM *b0= cs->b0;
1474
    DWTELEM *b1= cs->b1;
1475
    DWTELEM *b2= cs->b2;
1476
    DWTELEM *b3= cs->b3;
1477
    DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1478
    DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1479 791e7b83 Michael Niedermayer
1480
{START_TIMER
1481 13705b69 Michael Niedermayer
        if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
1482
        if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
1483
        if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
1484
        if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
1485 791e7b83 Michael Niedermayer
if(width>400){
1486
STOP_TIMER("vertical_compose97i")}}
1487
1488
{START_TIMER
1489 059715a4 Robert Edele
        if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width);
1490
        if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width);
1491 791e7b83 Michael Niedermayer
if(width>400 && b0 <= b2){
1492
STOP_TIMER("horizontal_compose97i")}}
1493 f9e6ebf7 Loren Merritt
1494
    cs->b0=b2;
1495
    cs->b1=b3;
1496
    cs->b2=b4;
1497
    cs->b3=b5;
1498
    cs->y += 2;
1499
}
1500
1501
static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
1502
    dwt_compose_t cs;
1503
    spatial_compose97i_init(&cs, buffer, height, stride);
1504
    while(cs.y <= height)
1505
        spatial_compose97i_dy(&cs, buffer, width, height, stride);
1506
}
1507
1508 ceaf1909 Dieter
static 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){
1509 a0d1931c Yartrebo
    int level;
1510
    for(level=decomposition_count-1; level>=0; level--){
1511
        switch(type){
1512 d4b287ed Loren Merritt
        case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1513
        case DWT_53: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
1514 a0d1931c Yartrebo
        /* not slicified yet */
1515 d4b287ed Loren Merritt
        case DWT_X: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
1516 a0d1931c Yartrebo
          av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
1517
        }
1518
    }
1519
}
1520
1521 ceaf1909 Dieter
static void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1522 f9e6ebf7 Loren Merritt
    int level;
1523
    for(level=decomposition_count-1; level>=0; level--){
1524
        switch(type){
1525 d4b287ed Loren Merritt
        case DWT_97: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
1526
        case DWT_53: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
1527 f9e6ebf7 Loren Merritt
        /* not slicified yet */
1528 d4b287ed Loren Merritt
        case DWT_X: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
1529 f9e6ebf7 Loren Merritt
        }
1530 791e7b83 Michael Niedermayer
    }
1531
}
1532
1533 ceaf1909 Dieter
static void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
1534 f9e6ebf7 Loren Merritt
    const int support = type==1 ? 3 : 5;
1535 791e7b83 Michael Niedermayer
    int level;
1536 f9e6ebf7 Loren Merritt
    if(type==2) return;
1537 791e7b83 Michael Niedermayer
1538 46c281e8 Michael Niedermayer
    for(level=decomposition_count-1; level>=0; level--){
1539 f9e6ebf7 Loren Merritt
        while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1540
            switch(type){
1541 d4b287ed Loren Merritt
            case DWT_97: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1542 f9e6ebf7 Loren Merritt
                    break;
1543 d4b287ed Loren Merritt
            case DWT_53: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
1544 f9e6ebf7 Loren Merritt
                    break;
1545 d4b287ed Loren Merritt
            case DWT_X: break;
1546 f9e6ebf7 Loren Merritt
            }
1547 791e7b83 Michael Niedermayer
        }
1548
    }
1549
}
1550
1551 059715a4 Robert Edele
static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
1552 a0d1931c Yartrebo
    const int support = type==1 ? 3 : 5;
1553
    int level;
1554
    if(type==2) return;
1555
1556
    for(level=decomposition_count-1; level>=0; level--){
1557
        while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
1558
            switch(type){
1559 d4b287ed Loren Merritt
            case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1560 a0d1931c Yartrebo
                    break;
1561 d4b287ed Loren Merritt
            case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
1562 a0d1931c Yartrebo
                    break;
1563 d4b287ed Loren Merritt
            case DWT_X: break;
1564 a0d1931c Yartrebo
            }
1565
        }
1566
    }
1567
}
1568
1569 ceaf1909 Dieter
static void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
1570 f9e6ebf7 Loren Merritt
    if(type==2){
1571
        int level;
1572
        for(level=decomposition_count-1; level>=0; level--)
1573
            spatial_composeX  (buffer, width>>level, height>>level, stride<<level);
1574
    }else{
1575
        dwt_compose_t cs[MAX_DECOMPOSITIONS];
1576
        int y;
1577
        ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
1578
        for(y=0; y<height; y+=4)
1579
            ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
1580
    }
1581
}
1582
1583 0ecca7a4 Michael Niedermayer
static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1584 4f4e9633 Michael Niedermayer
    const int w= b->width;
1585
    const int h= b->height;
1586
    int x, y;
1587
1588 791e7b83 Michael Niedermayer
    if(1){
1589
        int run=0;
1590 a8d73e56 Michael Niedermayer
        int runs[w*h];
1591 791e7b83 Michael Niedermayer
        int run_index=0;
1592 b44985ba Michael Niedermayer
        int max_index;
1593 115329f1 Diego Biurrun
1594 791e7b83 Michael Niedermayer
        for(y=0; y<h; y++){
1595
            for(x=0; x<w; x++){
1596 78486403 Michael Niedermayer
                int v, p=0;
1597 6b2f6646 Michael Niedermayer
                int /*ll=0, */l=0, lt=0, t=0, rt=0;
1598 a8d73e56 Michael Niedermayer
                v= src[x + y*stride];
1599 791e7b83 Michael Niedermayer
1600
                if(y){
1601 a8d73e56 Michael Niedermayer
                    t= src[x + (y-1)*stride];
1602 791e7b83 Michael Niedermayer
                    if(x){
1603 a8d73e56 Michael Niedermayer
                        lt= src[x - 1 + (y-1)*stride];
1604 791e7b83 Michael Niedermayer
                    }
1605
                    if(x + 1 < w){
1606 a8d73e56 Michael Niedermayer
                        rt= src[x + 1 + (y-1)*stride];
1607 791e7b83 Michael Niedermayer
                    }
1608
                }
1609
                if(x){
1610 a8d73e56 Michael Niedermayer
                    l= src[x - 1 + y*stride];
1611 6b2f6646 Michael Niedermayer
                    /*if(x > 1){
1612
                        if(orientation==1) ll= src[y + (x-2)*stride];
1613
                        else               ll= src[x - 2 + y*stride];
1614 791e7b83 Michael Niedermayer
                    }*/
1615
                }
1616 78486403 Michael Niedermayer
                if(parent){
1617 a8d73e56 Michael Niedermayer
                    int px= x>>1;
1618
                    int py= y>>1;
1619 115329f1 Diego Biurrun
                    if(px<b->parent->width && py<b->parent->height)
1620 78486403 Michael Niedermayer
                        p= parent[px + py*2*stride];
1621
                }
1622
                if(!(/*ll|*/l|lt|t|rt|p)){
1623 791e7b83 Michael Niedermayer
                    if(v){
1624
                        runs[run_index++]= run;
1625
                        run=0;
1626
                    }else{
1627
                        run++;
1628
                    }
1629
                }
1630
            }
1631
        }
1632 b44985ba Michael Niedermayer
        max_index= run_index;
1633 791e7b83 Michael Niedermayer
        runs[run_index++]= run;
1634
        run_index=0;
1635
        run= runs[run_index++];
1636
1637 b44985ba Michael Niedermayer
        put_symbol2(&s->c, b->state[30], max_index, 0);
1638
        if(run_index <= max_index)
1639
            put_symbol2(&s->c, b->state[1], run, 3);
1640 115329f1 Diego Biurrun
1641 791e7b83 Michael Niedermayer
        for(y=0; y<h; y++){
1642 d06c75a8 Matthieu Castet
            if(s->c.bytestream_end - s->c.bytestream < w*40){
1643 0ecca7a4 Michael Niedermayer
                av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1644
                return -1;
1645
            }
1646 791e7b83 Michael Niedermayer
            for(x=0; x<w; x++){
1647 78486403 Michael Niedermayer
                int v, p=0;
1648 6b2f6646 Michael Niedermayer
                int /*ll=0, */l=0, lt=0, t=0, rt=0;
1649 a8d73e56 Michael Niedermayer
                v= src[x + y*stride];
1650 791e7b83 Michael Niedermayer
1651
                if(y){
1652 a8d73e56 Michael Niedermayer
                    t= src[x + (y-1)*stride];
1653 791e7b83 Michael Niedermayer
                    if(x){
1654 a8d73e56 Michael Niedermayer
                        lt= src[x - 1 + (y-1)*stride];
1655 791e7b83 Michael Niedermayer
                    }
1656
                    if(x + 1 < w){
1657 a8d73e56 Michael Niedermayer
                        rt= src[x + 1 + (y-1)*stride];
1658 791e7b83 Michael Niedermayer
                    }
1659
                }
1660
                if(x){
1661 a8d73e56 Michael Niedermayer
                    l= src[x - 1 + y*stride];
1662 6b2f6646 Michael Niedermayer
                    /*if(x > 1){
1663
                        if(orientation==1) ll= src[y + (x-2)*stride];
1664
                        else               ll= src[x - 2 + y*stride];
1665 791e7b83 Michael Niedermayer
                    }*/
1666
                }
1667 78486403 Michael Niedermayer
                if(parent){
1668 a8d73e56 Michael Niedermayer
                    int px= x>>1;
1669
                    int py= y>>1;
1670 115329f1 Diego Biurrun
                    if(px<b->parent->width && py<b->parent->height)
1671 78486403 Michael Niedermayer
                        p= parent[px + py*2*stride];
1672
                }
1673
                if(/*ll|*/l|lt|t|rt|p){
1674 c26abfa5 Diego Biurrun
                    int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
1675 6b2f6646 Michael Niedermayer
1676 28869757 Michael Niedermayer
                    put_rac(&s->c, &b->state[0][context], !!v);
1677 791e7b83 Michael Niedermayer
                }else{
1678
                    if(!run){
1679
                        run= runs[run_index++];
1680 4f4e9633 Michael Niedermayer
1681 b44985ba Michael Niedermayer
                        if(run_index <= max_index)
1682
                            put_symbol2(&s->c, b->state[1], run, 3);
1683 791e7b83 Michael Niedermayer
                        assert(v);
1684
                    }else{
1685
                        run--;
1686
                        assert(!v);
1687
                    }
1688
                }
1689
                if(v){
1690 c26abfa5 Diego Biurrun
                    int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
1691
                    int l2= 2*FFABS(l) + (l<0);
1692
                    int t2= 2*FFABS(t) + (t<0);
1693 6b2f6646 Michael Niedermayer
1694 c26abfa5 Diego Biurrun
                    put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4);
1695 538a3841 Michael Niedermayer
                    put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
1696 791e7b83 Michael Niedermayer
                }
1697
            }
1698
        }
1699
    }
1700 0ecca7a4 Michael Niedermayer
    return 0;
1701 791e7b83 Michael Niedermayer
}
1702
1703 115329f1 Diego Biurrun
static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
1704 4f4e9633 Michael Niedermayer
//    encode_subband_qtree(s, b, src, parent, stride, orientation);
1705
//    encode_subband_z0run(s, b, src, parent, stride, orientation);
1706 0ecca7a4 Michael Niedermayer
    return encode_subband_c0run(s, b, src, parent, stride, orientation);
1707 4f4e9633 Michael Niedermayer
//    encode_subband_dzr(s, b, src, parent, stride, orientation);
1708
}
1709
1710 a0d1931c Yartrebo
static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
1711 791e7b83 Michael Niedermayer
    const int w= b->width;
1712
    const int h= b->height;
1713
    int x,y;
1714 115329f1 Diego Biurrun
1715 791e7b83 Michael Niedermayer
    if(1){
1716 b44985ba Michael Niedermayer
        int run, runs;
1717 cbb1d2b1 Michael Niedermayer
        x_and_coeff *xc= b->x_coeff;
1718
        x_and_coeff *prev_xc= NULL;
1719
        x_and_coeff *prev2_xc= xc;
1720
        x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
1721
        x_and_coeff *prev_parent_xc= parent_xc;
1722 791e7b83 Michael Niedermayer
1723 b44985ba Michael Niedermayer
        runs= get_symbol2(&s->c, b->state[30], 0);
1724
        if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1725
        else           run= INT_MAX;
1726
1727 791e7b83 Michael Niedermayer
        for(y=0; y<h; y++){
1728 0cea8a03 Michael Niedermayer
            int v=0;
1729
            int lt=0, t=0, rt=0;
1730
1731 cbb1d2b1 Michael Niedermayer
            if(y && prev_xc->x == 0){
1732
                rt= prev_xc->coeff;
1733 0cea8a03 Michael Niedermayer
            }
1734 791e7b83 Michael Niedermayer
            for(x=0; x<w; x++){
1735 0cea8a03 Michael Niedermayer
                int p=0;
1736
                const int l= v;
1737 115329f1 Diego Biurrun
1738 0cea8a03 Michael Niedermayer
                lt= t; t= rt;
1739 791e7b83 Michael Niedermayer
1740 ff765159 Michael Niedermayer
                if(y){
1741 cbb1d2b1 Michael Niedermayer
                    if(prev_xc->x <= x)
1742
                        prev_xc++;
1743
                    if(prev_xc->x == x + 1)
1744
                        rt= prev_xc->coeff;
1745 ff765159 Michael Niedermayer
                    else
1746
                        rt=0;
1747
                }
1748 cbb1d2b1 Michael Niedermayer
                if(parent_xc){
1749
                    if(x>>1 > parent_xc->x){
1750
                        parent_xc++;
1751 7b49c309 Michael Niedermayer
                    }
1752 cbb1d2b1 Michael Niedermayer
                    if(x>>1 == parent_xc->x){
1753
                        p= parent_xc->coeff;
1754 ff765159 Michael Niedermayer
                    }
1755 78486403 Michael Niedermayer
                }
1756
                if(/*ll|*/l|lt|t|rt|p){
1757 c26abfa5 Diego Biurrun
                    int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
1758 6b2f6646 Michael Niedermayer
1759 28869757 Michael Niedermayer
                    v=get_rac(&s->c, &b->state[0][context]);
1760 3c096ac7 Michael Niedermayer
                    if(v){
1761
                        v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
1762
                        v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
1763 115329f1 Diego Biurrun
1764 cbb1d2b1 Michael Niedermayer
                        xc->x=x;
1765
                        (xc++)->coeff= v;
1766 3c096ac7 Michael Niedermayer
                    }
1767 791e7b83 Michael Niedermayer
                }else{
1768
                    if(!run){
1769 b44985ba Michael Niedermayer
                        if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
1770
                        else           run= INT_MAX;
1771 3c096ac7 Michael Niedermayer
                        v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
1772
                        v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
1773 115329f1 Diego Biurrun
1774 cbb1d2b1 Michael Niedermayer
                        xc->x=x;
1775
                        (xc++)->coeff= v;
1776 791e7b83 Michael Niedermayer
                    }else{
1777 99cd59e5 Michael Niedermayer
                        int max_run;
1778 791e7b83 Michael Niedermayer
                        run--;
1779
                        v=0;
1780 3c1adccd Michael Niedermayer
1781 cbb1d2b1 Michael Niedermayer
                        if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
1782 99cd59e5 Michael Niedermayer
                        else  max_run= FFMIN(run, w-x-1);
1783 cbb1d2b1 Michael Niedermayer
                        if(parent_xc)
1784
                            max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
1785 99cd59e5 Michael Niedermayer
                        x+= max_run;
1786
                        run-= max_run;
1787 791e7b83 Michael Niedermayer
                    }
1788
                }
1789 7b49c309 Michael Niedermayer
            }
1790 cbb1d2b1 Michael Niedermayer
            (xc++)->x= w+1; //end marker
1791
            prev_xc= prev2_xc;
1792
            prev2_xc= xc;
1793 115329f1 Diego Biurrun
1794 cbb1d2b1 Michael Niedermayer
            if(parent_xc){
1795 7b49c309 Michael Niedermayer
                if(y&1){
1796 cbb1d2b1 Michael Niedermayer
                    while(parent_xc->x != parent->width+1)
1797
                        parent_xc++;
1798
                    parent_xc++;
1799
                    prev_parent_xc= parent_xc;
1800 7b49c309 Michael Niedermayer
                }else{
1801 cbb1d2b1 Michael Niedermayer
                    parent_xc= prev_parent_xc;
1802 791e7b83 Michael Niedermayer
                }
1803
            }
1804
        }
1805 a0d1931c Yartrebo
1806 cbb1d2b1 Michael Niedermayer
        (xc++)->x= w+1; //end marker
1807 a0d1931c Yartrebo
    }
1808
}
1809
1810
static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
1811
    const int w= b->width;
1812 62ab0b78 Aurelien Jacobs
    int y;
1813 c97de57c Michael Niedermayer
    const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
1814
    int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
1815 a0d1931c Yartrebo
    int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1816
    int new_index = 0;
1817 115329f1 Diego Biurrun
1818 a0d1931c Yartrebo
    START_TIMER
1819
1820
    if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
1821
        qadd= 0;
1822
        qmul= 1<<QEXPSHIFT;
1823
    }
1824
1825
    /* If we are on the second or later slice, restore our index. */
1826
    if (start_y != 0)
1827
        new_index = save_state[0];
1828
1829 115329f1 Diego Biurrun
1830 a0d1931c Yartrebo
    for(y=start_y; y<h; y++){
1831
        int x = 0;
1832
        int v;
1833
        DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
1834
        memset(line, 0, b->width*sizeof(DWTELEM));
1835
        v = b->x_coeff[new_index].coeff;
1836
        x = b->x_coeff[new_index++].x;
1837
        while(x < w)
1838
        {
1839 538a3841 Michael Niedermayer
            register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
1840
            register int u= -(v&1);
1841
            line[x] = (t^u) - u;
1842
1843 a0d1931c Yartrebo
            v = b->x_coeff[new_index].coeff;
1844
            x = b->x_coeff[new_index++].x;
1845
        }
1846 791e7b83 Michael Niedermayer
    }
1847 a0d1931c Yartrebo
    if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
1848
        STOP_TIMER("decode_subband")
1849
    }
1850 115329f1 Diego Biurrun
1851 a0d1931c Yartrebo
    /* Save our variables for the next slice. */
1852
    save_state[0] = new_index;
1853 115329f1 Diego Biurrun
1854 a0d1931c Yartrebo
    return;
1855 791e7b83 Michael Niedermayer
}
1856
1857 396a5e68 Michael Niedermayer
static void reset_contexts(SnowContext *s){ //FIXME better initial contexts
1858 791e7b83 Michael Niedermayer
    int plane_index, level, orientation;
1859
1860 19aa028d Michael Niedermayer
    for(plane_index=0; plane_index<3; plane_index++){
1861 791e7b83 Michael Niedermayer
        for(level=0; level<s->spatial_decomposition_count; level++){
1862
            for(orientation=level ? 1:0; orientation<4; orientation++){
1863 28869757 Michael Niedermayer
                memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
1864 791e7b83 Michael Niedermayer
            }
1865
        }
1866
    }
1867 28869757 Michael Niedermayer
    memset(s->header_state, MID_STATE, sizeof(s->header_state));
1868
    memset(s->block_state, MID_STATE, sizeof(s->block_state));
1869 155ec6ed Michael Niedermayer
}
1870
1871
static int alloc_blocks(SnowContext *s){
1872
    int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
1873
    int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
1874 115329f1 Diego Biurrun
1875 155ec6ed Michael Niedermayer
    s->b_width = w;
1876
    s->b_height= h;
1877 115329f1 Diego Biurrun
1878 155ec6ed Michael Niedermayer
    s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
1879
    return 0;
1880
}
1881
1882 28869757 Michael Niedermayer
static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
1883
    uint8_t *bytestream= d->bytestream;
1884
    uint8_t *bytestream_start= d->bytestream_start;
1885 155ec6ed Michael Niedermayer
    *d= *s;
1886 28869757 Michael Niedermayer
    d->bytestream= bytestream;
1887
    d->bytestream_start= bytestream_start;
1888 155ec6ed Michael Niedermayer
}
1889
1890
//near copy & paste from dsputil, FIXME
1891
static int pix_sum(uint8_t * pix, int line_size, int w)
1892
{
1893
    int s, i, j;
1894
1895
    s = 0;
1896
    for (i = 0; i < w; i++) {
1897
        for (j = 0; j < w; j++) {
1898
            s += pix[0];
1899
            pix ++;
1900
        }
1901
        pix += line_size - w;
1902
    }
1903
    return s;
1904
}
1905
1906
//near copy & paste from dsputil, FIXME
1907
static int pix_norm1(uint8_t * pix, int line_size, int w)
1908
{
1909
    int s, i, j;
1910 1d503957 Måns Rullgård
    uint32_t *sq = ff_squareTbl + 256;
1911 155ec6ed Michael Niedermayer
1912
    s = 0;
1913
    for (i = 0; i < w; i++) {
1914
        for (j = 0; j < w; j ++) {
1915
            s += sq[pix[0]];
1916
            pix ++;
1917
        }
1918
        pix += line_size - w;
1919
    }
1920
    return s;
1921
}
1922
1923 8c36eaaa Loren Merritt
static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int ref, int type){
1924 155ec6ed Michael Niedermayer
    const int w= s->b_width << s->block_max_depth;
1925
    const int rem_depth= s->block_max_depth - level;
1926
    const int index= (x + y*w) << rem_depth;
1927
    const int block_w= 1<<rem_depth;
1928
    BlockNode block;
1929
    int i,j;
1930 115329f1 Diego Biurrun
1931 155ec6ed Michael Niedermayer
    block.color[0]= l;
1932
    block.color[1]= cb;
1933
    block.color[2]= cr;
1934
    block.mx= mx;
1935
    block.my= my;
1936 8c36eaaa Loren Merritt
    block.ref= ref;
1937 155ec6ed Michael Niedermayer
    block.type= type;
1938
    block.level= level;
1939
1940
    for(j=0; j<block_w; j++){
1941
        for(i=0; i<block_w; i++){
1942
            s->block[index + i + j*w]= block;
1943
        }
1944
    }
1945
}
1946
1947
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){
1948
    const int offset[3]= {
1949
          y*c->  stride + x,
1950
        ((y*c->uvstride + x)>>1),
1951
        ((y*c->uvstride + x)>>1),
1952
    };
1953
    int i;
1954
    for(i=0; i<3; i++){
1955
        c->src[0][i]= src [i];
1956
        c->ref[0][i]= ref [i] + offset[i];
1957
    }
1958
    assert(!ref_index);
1959
}
1960
1961 85fc0e75 Loren Merritt
static inline void pred_mv(SnowContext *s, int *mx, int *my, int ref,
1962
                           BlockNode *left, BlockNode *top, BlockNode *tr){
1963
    if(s->ref_frames == 1){
1964
        *mx = mid_pred(left->mx, top->mx, tr->mx);
1965
        *my = mid_pred(left->my, top->my, tr->my);
1966
    }else{
1967
        const int *scale = scale_mv_ref[ref];
1968
        *mx = mid_pred(left->mx * scale[left->ref] + 128 >>8,
1969
                       top ->mx * scale[top ->ref] + 128 >>8,
1970
                       tr  ->mx * scale[tr  ->ref] + 128 >>8);
1971
        *my = mid_pred(left->my * scale[left->ref] + 128 >>8,
1972
                       top ->my * scale[top ->ref] + 128 >>8,
1973
                       tr  ->my * scale[tr  ->ref] + 128 >>8);
1974
    }
1975
}
1976
1977 155ec6ed Michael Niedermayer
//FIXME copy&paste
1978
#define P_LEFT P[1]
1979
#define P_TOP P[2]
1980
#define P_TOPRIGHT P[3]
1981
#define P_MEDIAN P[4]
1982
#define P_MV1 P[9]
1983
#define FLAG_QPEL   1 //must be 1
1984
1985
static int encode_q_branch(SnowContext *s, int level, int x, int y){
1986
    uint8_t p_buffer[1024];
1987
    uint8_t i_buffer[1024];
1988
    uint8_t p_state[sizeof(s->block_state)];
1989
    uint8_t i_state[sizeof(s->block_state)];
1990 28869757 Michael Niedermayer
    RangeCoder pc, ic;
1991
    uint8_t *pbbak= s->c.bytestream;
1992
    uint8_t *pbbak_start= s->c.bytestream_start;
1993 155ec6ed Michael Niedermayer
    int score, score2, iscore, i_len, p_len, block_s, sum;
1994
    const int w= s->b_width  << s->block_max_depth;
1995
    const int h= s->b_height << s->block_max_depth;
1996
    const int rem_depth= s->block_max_depth - level;
1997
    const int index= (x + y*w) << rem_depth;
1998
    const int block_w= 1<<(LOG2_MB_SIZE - level);
1999
    int trx= (x+1)<<rem_depth;
2000
    int try= (y+1)<<rem_depth;
2001
    BlockNode *left  = x ? &s->block[index-1] : &null_block;
2002
    BlockNode *top   = y ? &s->block[index-w] : &null_block;
2003
    BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
2004
    BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
2005
    BlockNode *tl    = y && x ? &s->block[index-w-1] : left;
2006
    BlockNode *tr    = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2007
    int pl = left->color[0];
2008
    int pcb= left->color[1];
2009
    int pcr= left->color[2];
2010 85fc0e75 Loren Merritt
    int pmx, pmy;
2011 155ec6ed Michael Niedermayer
    int mx=0, my=0;
2012 51d6a3cf Michael Niedermayer
    int l,cr,cb;
2013 155ec6ed Michael Niedermayer
    const int stride= s->current_picture.linesize[0];
2014
    const int uvstride= s->current_picture.linesize[1];
2015 51d6a3cf Michael Niedermayer
    uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y*  stride)*block_w,
2016
                                s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
2017
                                s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
2018 155ec6ed Michael Niedermayer
    int P[10][2];
2019
    int16_t last_mv[3][2];
2020
    int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
2021
    const int shift= 1+qpel;
2022
    MotionEstContext *c= &s->m.me;
2023 8c36eaaa Loren Merritt
    int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
2024 c26abfa5 Diego Biurrun
    int mx_context= av_log2(2*FFABS(left->mx - top->mx));
2025
    int my_context= av_log2(2*FFABS(left->my - top->my));
2026 155ec6ed Michael Niedermayer
    int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2027 8c36eaaa Loren Merritt
    int ref, best_ref, ref_score, ref_mx, ref_my;
2028 155ec6ed Michael Niedermayer
2029
    assert(sizeof(s->block_state) >= 256);
2030
    if(s->keyframe){
2031 85fc0e75 Loren Merritt
        set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
2032 155ec6ed Michael Niedermayer
        return 0;
2033
    }
2034
2035
//    clip predictors / edge ?
2036
2037
    P_LEFT[0]= left->mx;
2038
    P_LEFT[1]= left->my;
2039
    P_TOP [0]= top->mx;
2040
    P_TOP [1]= top->my;
2041
    P_TOPRIGHT[0]= tr->mx;
2042
    P_TOPRIGHT[1]= tr->my;
2043 115329f1 Diego Biurrun
2044 155ec6ed Michael Niedermayer
    last_mv[0][0]= s->block[index].mx;
2045
    last_mv[0][1]= s->block[index].my;
2046
    last_mv[1][0]= right->mx;
2047
    last_mv[1][1]= right->my;
2048
    last_mv[2][0]= bottom->mx;
2049
    last_mv[2][1]= bottom->my;
2050 115329f1 Diego Biurrun
2051 155ec6ed Michael Niedermayer
    s->m.mb_stride=2;
2052 115329f1 Diego Biurrun
    s->m.mb_x=
2053 155ec6ed Michael Niedermayer
    s->m.mb_y= 0;
2054
    s->m.me.skip= 0;
2055
2056
    assert(s->m.me.  stride ==   stride);
2057
    assert(s->m.me.uvstride == uvstride);
2058 115329f1 Diego Biurrun
2059 155ec6ed Michael Niedermayer
    c->penalty_factor    = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
2060
    c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
2061
    c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
2062
    c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
2063 115329f1 Diego Biurrun
2064 ff158dc9 Michael Niedermayer
    c->xmin = - x*block_w - 16+2;
2065
    c->ymin = - y*block_w - 16+2;
2066
    c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2067
    c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
2068 155ec6ed Michael Niedermayer
2069
    if(P_LEFT[0]     > (c->xmax<<shift)) P_LEFT[0]    = (c->xmax<<shift);
2070 115329f1 Diego Biurrun
    if(P_LEFT[1]     > (c->ymax<<shift)) P_LEFT[1]    = (c->ymax<<shift);
2071 155ec6ed Michael Niedermayer
    if(P_TOP[0]      > (c->xmax<<shift)) P_TOP[0]     = (c->xmax<<shift);
2072
    if(P_TOP[1]      > (c->ymax<<shift)) P_TOP[1]     = (c->ymax<<shift);
2073
    if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
2074
    if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
2075
    if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
2076
2077
    P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
2078
    P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
2079
2080
    if (!y) {
2081
        c->pred_x= P_LEFT[0];
2082
        c->pred_y= P_LEFT[1];
2083
    } else {
2084
        c->pred_x = P_MEDIAN[0];
2085
        c->pred_y = P_MEDIAN[1];
2086
    }
2087
2088 8c36eaaa Loren Merritt
    score= INT_MAX;
2089
    best_ref= 0;
2090
    for(ref=0; ref<s->ref_frames; ref++){
2091
        init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0);
2092
2093
        ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv,
2094
                                         (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
2095 155ec6ed Michael Niedermayer
2096 8c36eaaa Loren Merritt
        assert(ref_mx >= c->xmin);
2097
        assert(ref_mx <= c->xmax);
2098
        assert(ref_my >= c->ymin);
2099
        assert(ref_my <= c->ymax);
2100 115329f1 Diego Biurrun
2101 8c36eaaa Loren Merritt
        ref_score= s->m.me.sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
2102
        ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
2103
        ref_score+= 2*av_log2(2*ref)*c->penalty_factor;
2104
        if(s->ref_mvs[ref]){
2105
            s->ref_mvs[ref][index][0]= ref_mx;
2106
            s->ref_mvs[ref][index][1]= ref_my;
2107
            s->ref_scores[ref][index]= ref_score;
2108
        }
2109
        if(score > ref_score){
2110
            score= ref_score;
2111
            best_ref= ref;
2112
            mx= ref_mx;
2113
            my= ref_my;
2114
        }
2115
    }
2116 155ec6ed Michael Niedermayer
    //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
2117 115329f1 Diego Biurrun
2118 155ec6ed Michael Niedermayer
  //  subpel search
2119
    pc= s->c;
2120 28869757 Michael Niedermayer
    pc.bytestream_start=
2121
    pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
2122 155ec6ed Michael Niedermayer
    memcpy(p_state, s->block_state, sizeof(s->block_state));
2123
2124
    if(level!=s->block_max_depth)
2125 28869757 Michael Niedermayer
        put_rac(&pc, &p_state[4 + s_context], 1);
2126
    put_rac(&pc, &p_state[1 + left->type + top->type], 0);
2127 8c36eaaa Loren Merritt
    if(s->ref_frames > 1)
2128
        put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
2129 85fc0e75 Loren Merritt
    pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
2130 8c36eaaa Loren Merritt
    put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
2131
    put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
2132 28869757 Michael Niedermayer
    p_len= pc.bytestream - pc.bytestream_start;
2133
    score += (s->lambda2*(p_len*8
2134
              + (pc.outstanding_count - s->c.outstanding_count)*8
2135
              + (-av_log2(pc.range)    + av_log2(s->c.range))
2136
             ))>>FF_LAMBDA_SHIFT;
2137 155ec6ed Michael Niedermayer
2138
    block_s= block_w*block_w;
2139 51d6a3cf Michael Niedermayer
    sum = pix_sum(current_data[0], stride, block_w);
2140 155ec6ed Michael Niedermayer
    l= (sum + block_s/2)/block_s;
2141 51d6a3cf Michael Niedermayer
    iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
2142 115329f1 Diego Biurrun
2143 155ec6ed Michael Niedermayer
    block_s= block_w*block_w>>2;
2144 51d6a3cf Michael Niedermayer
    sum = pix_sum(current_data[1], uvstride, block_w>>1);
2145 155ec6ed Michael Niedermayer
    cb= (sum + block_s/2)/block_s;
2146
//    iscore += pix_norm1(&current_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
2147 51d6a3cf Michael Niedermayer
    sum = pix_sum(current_data[2], uvstride, block_w>>1);
2148 155ec6ed Michael Niedermayer
    cr= (sum + block_s/2)/block_s;
2149
//    iscore += pix_norm1(&current_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
2150
2151
    ic= s->c;
2152 28869757 Michael Niedermayer
    ic.bytestream_start=
2153
    ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
2154 155ec6ed Michael Niedermayer
    memcpy(i_state, s->block_state, sizeof(s->block_state));
2155
    if(level!=s->block_max_depth)
2156 28869757 Michael Niedermayer
        put_rac(&ic, &i_state[4 + s_context], 1);
2157
    put_rac(&ic, &i_state[1 + left->type + top->type], 1);
2158 155ec6ed Michael Niedermayer
    put_symbol(&ic, &i_state[32],  l-pl , 1);
2159
    put_symbol(&ic, &i_state[64], cb-pcb, 1);
2160
    put_symbol(&ic, &i_state[96], cr-pcr, 1);
2161 28869757 Michael Niedermayer
    i_len= ic.bytestream - ic.bytestream_start;
2162
    iscore += (s->lambda2*(i_len*8
2163
              + (ic.outstanding_count - s->c.outstanding_count)*8
2164
              + (-av_log2(ic.range)    + av_log2(s->c.range))
2165
             ))>>FF_LAMBDA_SHIFT;
2166 155ec6ed Michael Niedermayer
2167
//    assert(score==256*256*256*64-1);
2168
    assert(iscore < 255*255*256 + s->lambda2*10);
2169
    assert(iscore >= 0);
2170
    assert(l>=0 && l<=255);
2171
    assert(pl>=0 && pl<=255);
2172
2173
    if(level==0){
2174
        int varc= iscore >> 8;
2175
        int vard= score >> 8;
2176
        if (vard <= 64 || vard < varc)
2177
            c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
2178
        else
2179
            c->scene_change_score+= s->m.qscale;
2180
    }
2181 115329f1 Diego Biurrun
2182 155ec6ed Michael Niedermayer
    if(level!=s->block_max_depth){
2183 28869757 Michael Niedermayer
        put_rac(&s->c, &s->block_state[4 + s_context], 0);
2184 155ec6ed Michael Niedermayer
        score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
2185
        score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
2186
        score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
2187
        score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
2188
        score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
2189 115329f1 Diego Biurrun
2190 155ec6ed Michael Niedermayer
        if(score2 < score && score2 < iscore)
2191
            return score2;
2192
    }
2193 115329f1 Diego Biurrun
2194 155ec6ed Michael Niedermayer
    if(iscore < score){
2195 85fc0e75 Loren Merritt
        pred_mv(s, &pmx, &pmy, 0, left, top, tr);
2196 28869757 Michael Niedermayer
        memcpy(pbbak, i_buffer, i_len);
2197 155ec6ed Michael Niedermayer
        s->c= ic;
2198 28869757 Michael Niedermayer
        s->c.bytestream_start= pbbak_start;
2199
        s->c.bytestream= pbbak + i_len;
2200 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA);
2201 155ec6ed Michael Niedermayer
        memcpy(s->block_state, i_state, sizeof(s->block_state));
2202
        return iscore;
2203
    }else{
2204 28869757 Michael Niedermayer
        memcpy(pbbak, p_buffer, p_len);
2205 155ec6ed Michael Niedermayer
        s->c= pc;
2206 28869757 Michael Niedermayer
        s->c.bytestream_start= pbbak_start;
2207
        s->c.bytestream= pbbak + p_len;
2208 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
2209 155ec6ed Michael Niedermayer
        memcpy(s->block_state, p_state, sizeof(s->block_state));
2210
        return score;
2211
    }
2212
}
2213
2214 849f1035 Måns Rullgård
static av_always_inline int same_block(BlockNode *a, BlockNode *b){
2215 51d6a3cf Michael Niedermayer
    if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){
2216
        return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2]));
2217
    }else{
2218 8c36eaaa Loren Merritt
        return !((a->mx - b->mx) | (a->my - b->my) | (a->ref - b->ref) | ((a->type ^ b->type)&BLOCK_INTRA));
2219 51d6a3cf Michael Niedermayer
    }
2220
}
2221
2222
static void encode_q_branch2(SnowContext *s, int level, int x, int y){
2223
    const int w= s->b_width  << s->block_max_depth;
2224
    const int rem_depth= s->block_max_depth - level;
2225
    const int index= (x + y*w) << rem_depth;
2226
    int trx= (x+1)<<rem_depth;
2227
    BlockNode *b= &s->block[index];
2228
    BlockNode *left  = x ? &s->block[index-1] : &null_block;
2229
    BlockNode *top   = y ? &s->block[index-w] : &null_block;
2230
    BlockNode *tl    = y && x ? &s->block[index-w-1] : left;
2231
    BlockNode *tr    = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
2232
    int pl = left->color[0];
2233
    int pcb= left->color[1];
2234
    int pcr= left->color[2];
2235 85fc0e75 Loren Merritt
    int pmx, pmy;
2236 8c36eaaa Loren Merritt
    int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
2237 c26abfa5 Diego Biurrun
    int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref;
2238
    int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref;
2239 51d6a3cf Michael Niedermayer
    int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
2240
2241
    if(s->keyframe){
2242 85fc0e75 Loren Merritt
        set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
2243 51d6a3cf Michael Niedermayer
        return;
2244
    }
2245
2246
    if(level!=s->block_max_depth){
2247
        if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){
2248 d6f41eed Michael Niedermayer
            put_rac(&s->c, &s->block_state[4 + s_context], 1);
2249
        }else{
2250 51d6a3cf Michael Niedermayer
            put_rac(&s->c, &s->block_state[4 + s_context], 0);
2251
            encode_q_branch2(s, level+1, 2*x+0, 2*y+0);
2252
            encode_q_branch2(s, level+1, 2*x+1, 2*y+0);
2253
            encode_q_branch2(s, level+1, 2*x+0, 2*y+1);
2254
            encode_q_branch2(s, level+1, 2*x+1, 2*y+1);
2255
            return;
2256
        }
2257
    }
2258
    if(b->type & BLOCK_INTRA){
2259 85fc0e75 Loren Merritt
        pred_mv(s, &pmx, &pmy, 0, left, top, tr);
2260 51d6a3cf Michael Niedermayer
        put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1);
2261
        put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1);
2262
        put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1);
2263
        put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1);
2264 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA);
2265 51d6a3cf Michael Niedermayer
    }else{
2266 85fc0e75 Loren Merritt
        pred_mv(s, &pmx, &pmy, b->ref, left, top, tr);
2267 51d6a3cf Michael Niedermayer
        put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0);
2268 8c36eaaa Loren Merritt
        if(s->ref_frames > 1)
2269
            put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0);
2270 51d6a3cf Michael Niedermayer
        put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1);
2271
        put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1);
2272 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0);
2273 51d6a3cf Michael Niedermayer
    }
2274
}
2275
2276 155ec6ed Michael Niedermayer
static void decode_q_branch(SnowContext *s, int level, int x, int y){
2277
    const int w= s->b_width << s->block_max_depth;
2278
    const int rem_depth= s->block_max_depth - level;
2279
    const int index= (x + y*w) << rem_depth;
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;
2286 115329f1 Diego Biurrun
2287 155ec6ed Michael Niedermayer
    if(s->keyframe){
2288 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, null_block.ref, BLOCK_INTRA);
2289 155ec6ed Michael Niedermayer
        return;
2290
    }
2291
2292 28869757 Michael Niedermayer
    if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
2293 155ec6ed Michael Niedermayer
        int type;
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 8c36eaaa Loren Merritt
        int ref = 0;
2300
        int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
2301 c26abfa5 Diego Biurrun
        int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx));
2302
        int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my));
2303 115329f1 Diego Biurrun
2304 28869757 Michael Niedermayer
        type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
2305 155ec6ed Michael Niedermayer
2306
        if(type){
2307 85fc0e75 Loren Merritt
            pred_mv(s, &mx, &my, 0, left, top, tr);
2308 155ec6ed Michael Niedermayer
            l += get_symbol(&s->c, &s->block_state[32], 1);
2309
            cb+= get_symbol(&s->c, &s->block_state[64], 1);
2310
            cr+= get_symbol(&s->c, &s->block_state[96], 1);
2311
        }else{
2312 8c36eaaa Loren Merritt
            if(s->ref_frames > 1)
2313
                ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0);
2314 85fc0e75 Loren Merritt
            pred_mv(s, &mx, &my, ref, left, top, tr);
2315 8c36eaaa Loren Merritt
            mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1);
2316
            my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1);
2317 155ec6ed Michael Niedermayer
        }
2318 8c36eaaa Loren Merritt
        set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type);
2319 155ec6ed Michael Niedermayer
    }else{
2320
        decode_q_branch(s, level+1, 2*x+0, 2*y+0);
2321
        decode_q_branch(s, level+1, 2*x+1, 2*y+0);
2322
        decode_q_branch(s, level+1, 2*x+0, 2*y+1);
2323
        decode_q_branch(s, level+1, 2*x+1, 2*y+1);
2324
    }
2325
}
2326
2327 74e6a8aa Loren Merritt
static void encode_blocks(SnowContext *s, int search){
2328 155ec6ed Michael Niedermayer
    int x, y;
2329
    int w= s->b_width;
2330
    int h= s->b_height;
2331
2332 74e6a8aa Loren Merritt
    if(s->avctx->me_method == ME_ITER && !s->keyframe && search)
2333 51d6a3cf Michael Niedermayer
        iterative_me(s);
2334
2335 155ec6ed Michael Niedermayer
    for(y=0; y<h; y++){
2336 d06c75a8 Matthieu Castet
        if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
2337 0ecca7a4 Michael Niedermayer
            av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
2338
            return;
2339
        }
2340 155ec6ed Michael Niedermayer
        for(x=0; x<w; x++){
2341 74e6a8aa Loren Merritt
            if(s->avctx->me_method == ME_ITER || !search)
2342 51d6a3cf Michael Niedermayer
                encode_q_branch2(s, 0, x, y);
2343
            else
2344
                encode_q_branch (s, 0, x, y);
2345 155ec6ed Michael Niedermayer
        }
2346
    }
2347
}
2348
2349
static void decode_blocks(SnowContext *s){
2350
    int x, y;
2351
    int w= s->b_width;
2352
    int h= s->b_height;
2353
2354
    for(y=0; y<h; y++){
2355
        for(x=0; x<w; x++){
2356
            decode_q_branch(s, 0, x, y);
2357
        }
2358
    }
2359 791e7b83 Michael Niedermayer
}
2360
2361
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){
2362
    int x, y;
2363 3924dac4 Michael Niedermayer
START_TIMER
2364 791e7b83 Michael Niedermayer
    for(y=0; y < b_h+5; y++){
2365
        for(x=0; x < b_w; x++){
2366 3924dac4 Michael Niedermayer
            int a0= src[x    ];
2367
            int a1= src[x + 1];
2368
            int a2= src[x + 2];
2369
            int a3= src[x + 3];
2370
            int a4= src[x + 4];
2371
            int a5= src[x + 5];
2372 791e7b83 Michael Niedermayer
//            int am= 9*(a1+a2) - (a0+a3);
2373
            int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2374
//            int am= 18*(a2+a3) - 2*(a1+a4);
2375
//             int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
2376
//             int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
2377
2378
//            if(b_w==16) am= 8*(a1+a2);
2379
2380 8c2515bb Yartrebo
            if(dx<8) am = (32*a2*( 8-dx) +    am* dx    + 128)>>8;
2381
            else     am = (   am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
2382 115329f1 Diego Biurrun
2383 8c2515bb Yartrebo
            /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
2384
            if(am&(~255)) am= ~(am>>31);
2385 115329f1 Diego Biurrun
2386 8c2515bb Yartrebo
            tmp[x] = am;
2387 791e7b83 Michael Niedermayer
2388
/*            if     (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) +    aL* dx     + 32)>>6;
2389
            else if(dx< 8) tmp[x + y*stride]= (   aL*( 8-dx) +    am*(dx- 4) + 32)>>6;
2390
            else if(dx<12) tmp[x + y*stride]= (   am*(12-dx) +    aR*(dx- 8) + 32)>>6;
2391
            else           tmp[x + y*stride]= (   aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
2392
        }
2393 3924dac4 Michael Niedermayer
        tmp += stride;
2394
        src += stride;
2395 791e7b83 Michael Niedermayer
    }
2396 3924dac4 Michael Niedermayer
    tmp -= (b_h+5)*stride;
2397 115329f1 Diego Biurrun
2398 791e7b83 Michael Niedermayer
    for(y=0; y < b_h; y++){
2399
        for(x=0; x < b_w; x++){
2400 3924dac4 Michael Niedermayer
            int a0= tmp[x + 0*stride];
2401
            int a1= tmp[x + 1*stride];
2402
            int a2= tmp[x + 2*stride];
2403
            int a3= tmp[x + 3*stride];
2404
            int a4= tmp[x + 4*stride];
2405
            int a5= tmp[x + 5*stride];
2406 791e7b83 Michael Niedermayer
            int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
2407