Mercurial > libavcodec.hg
annotate snow.c @ 11398:00b80bf84ad9 libavcodec
bfin: fix function prototypes
Move prototypes to header files, add missing prototypes,
make some functions static.
author | mru |
---|---|
date | Mon, 08 Mar 2010 02:36:11 +0000 |
parents | b57409c0c286 |
children | 421c9441c11e |
rev | line source |
---|---|
2138 | 1 /* |
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
3 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
2138 | 7 * modify it under the terms of the GNU Lesser General Public |
8 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
2138 | 10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
2138 | 12 * 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3035
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2138 | 19 */ |
20 | |
21 #include "avcodec.h" | |
22 #include "dsputil.h" | |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
23 #include "snow.h" |
2335 | 24 |
25 #include "rangecoder.h" | |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8611
diff
changeset
|
26 #include "mathops.h" |
2138 | 27 |
28 #include "mpegvideo.h" | |
11373 | 29 #include "h263.h" |
2138 | 30 |
31 #undef NDEBUG | |
32 #include <assert.h> | |
33 | |
34 static const int8_t quant3[256]={ | |
35 0, 0, 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,-1, | |
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, | |
51 }; | |
52 static const int8_t quant3b[256]={ | |
53 0, 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 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
69 }; | |
2596 | 70 static const int8_t quant3bA[256]={ |
71 0, 0, 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 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
87 }; | |
2138 | 88 static const int8_t quant5[256]={ |
89 0, 1, 1, 1, 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,-2,-2,-2, | |
104 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
105 }; | |
106 static const int8_t quant7[256]={ | |
107 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
108 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
109 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3, | |
120 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, | |
121 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
122 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, | |
123 }; | |
124 static const int8_t quant9[256]={ | |
125 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
126 3, 3, 3, 3, 3, 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,-4,-4,-4,-4, | |
139 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
140 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
141 }; | |
142 static const int8_t quant11[256]={ | |
143 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, | |
144 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
145 4, 4, 4, 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,-5,-5, | |
156 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
157 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
158 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
159 }; | |
160 static const int8_t quant13[256]={ | |
161 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
162 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
163 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
164 5, 5, 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,-6, | |
173 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
174 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
175 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
176 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
177 }; | |
178 | |
179 #if 0 //64*cubic | |
180 static const uint8_t obmc32[1024]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
181 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, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
182 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
183 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
184 0, 0, 4, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 28, 32, 32, 32, 32, 28, 28, 24, 24, 20, 16, 16, 12, 8, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
185 0, 0, 4, 8, 8, 12, 16, 24, 28, 32, 36, 40, 44, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 24, 16, 12, 8, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
186 0, 4, 4, 8, 12, 20, 24, 32, 40, 44, 52, 56, 60, 64, 68, 72, 72, 68, 64, 60, 56, 52, 44, 40, 32, 24, 20, 12, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
187 0, 4, 4, 12, 16, 24, 32, 40, 52, 60, 68, 76, 80, 88, 88, 92, 92, 88, 88, 80, 76, 68, 60, 52, 40, 32, 24, 16, 12, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
188 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, 84, 92,100,108,112,116,116,112,108,100, 92, 84, 76, 64, 52, 40, 32, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
189 0, 4, 8, 16, 28, 40, 52, 64, 76, 88,100,112,124,132,136,140,140,136,132,124,112,100, 88, 76, 64, 52, 40, 28, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
190 0, 4, 12, 20, 32, 44, 60, 76, 88,104,120,132,144,152,160,164,164,160,152,144,132,120,104, 88, 76, 60, 44, 32, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
191 0, 4, 12, 24, 36, 48, 68, 84,100,120,136,152,164,176,180,184,184,180,176,164,152,136,120,100, 84, 68, 48, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
192 0, 4, 12, 24, 40, 56, 76, 92,112,132,152,168,180,192,204,208,208,204,192,180,168,152,132,112, 92, 76, 56, 40, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
193 0, 4, 16, 28, 44, 60, 80,100,124,144,164,180,196,208,220,224,224,220,208,196,180,164,144,124,100, 80, 60, 44, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
194 0, 8, 16, 28, 48, 64, 88,108,132,152,176,192,208,224,232,240,240,232,224,208,192,176,152,132,108, 88, 64, 48, 28, 16, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
195 0, 4, 16, 32, 48, 68, 88,112,136,160,180,204,220,232,244,248,248,244,232,220,204,180,160,136,112, 88, 68, 48, 32, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
196 1, 8, 16, 32, 48, 72, 92,116,140,164,184,208,224,240,248,255,255,248,240,224,208,184,164,140,116, 92, 72, 48, 32, 16, 8, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
197 1, 8, 16, 32, 48, 72, 92,116,140,164,184,208,224,240,248,255,255,248,240,224,208,184,164,140,116, 92, 72, 48, 32, 16, 8, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
198 0, 4, 16, 32, 48, 68, 88,112,136,160,180,204,220,232,244,248,248,244,232,220,204,180,160,136,112, 88, 68, 48, 32, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
199 0, 8, 16, 28, 48, 64, 88,108,132,152,176,192,208,224,232,240,240,232,224,208,192,176,152,132,108, 88, 64, 48, 28, 16, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
200 0, 4, 16, 28, 44, 60, 80,100,124,144,164,180,196,208,220,224,224,220,208,196,180,164,144,124,100, 80, 60, 44, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
201 0, 4, 12, 24, 40, 56, 76, 92,112,132,152,168,180,192,204,208,208,204,192,180,168,152,132,112, 92, 76, 56, 40, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
202 0, 4, 12, 24, 36, 48, 68, 84,100,120,136,152,164,176,180,184,184,180,176,164,152,136,120,100, 84, 68, 48, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
203 0, 4, 12, 20, 32, 44, 60, 76, 88,104,120,132,144,152,160,164,164,160,152,144,132,120,104, 88, 76, 60, 44, 32, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
204 0, 4, 8, 16, 28, 40, 52, 64, 76, 88,100,112,124,132,136,140,140,136,132,124,112,100, 88, 76, 64, 52, 40, 28, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
205 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, 84, 92,100,108,112,116,116,112,108,100, 92, 84, 76, 64, 52, 40, 32, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
206 0, 4, 4, 12, 16, 24, 32, 40, 52, 60, 68, 76, 80, 88, 88, 92, 92, 88, 88, 80, 76, 68, 60, 52, 40, 32, 24, 16, 12, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
207 0, 4, 4, 8, 12, 20, 24, 32, 40, 44, 52, 56, 60, 64, 68, 72, 72, 68, 64, 60, 56, 52, 44, 40, 32, 24, 20, 12, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
208 0, 0, 4, 8, 8, 12, 16, 24, 28, 32, 36, 40, 44, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 24, 16, 12, 8, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
209 0, 0, 4, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 28, 32, 32, 32, 32, 28, 28, 24, 24, 20, 16, 16, 12, 8, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
210 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
211 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
212 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, |
2138 | 213 //error:0.000022 |
214 }; | |
215 static const uint8_t obmc16[256]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
216 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
217 0, 4, 4, 8, 16, 20, 20, 24, 24, 20, 20, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
218 0, 4, 16, 24, 36, 44, 52, 60, 60, 52, 44, 36, 24, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
219 0, 8, 24, 44, 60, 80, 96,104,104, 96, 80, 60, 44, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
220 0, 16, 36, 60, 92,116,136,152,152,136,116, 92, 60, 36, 16, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
221 0, 20, 44, 80,116,152,180,196,196,180,152,116, 80, 44, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
222 4, 20, 52, 96,136,180,212,228,228,212,180,136, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
223 4, 24, 60,104,152,196,228,248,248,228,196,152,104, 60, 24, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
224 4, 24, 60,104,152,196,228,248,248,228,196,152,104, 60, 24, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
225 4, 20, 52, 96,136,180,212,228,228,212,180,136, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
226 0, 20, 44, 80,116,152,180,196,196,180,152,116, 80, 44, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
227 0, 16, 36, 60, 92,116,136,152,152,136,116, 92, 60, 36, 16, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
228 0, 8, 24, 44, 60, 80, 96,104,104, 96, 80, 60, 44, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
229 0, 4, 16, 24, 36, 44, 52, 60, 60, 52, 44, 36, 24, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
230 0, 4, 4, 8, 16, 20, 20, 24, 24, 20, 20, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
231 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
2138 | 232 //error:0.000033 |
233 }; | |
234 #elif 1 // 64*linear | |
235 static const uint8_t obmc32[1024]={ | |
3206 | 236 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, |
237 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, | |
238 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, | |
239 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, | |
240 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, | |
241 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, | |
242 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, | |
243 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, | |
244 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, | |
245 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, | |
246 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, | |
247 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, | |
248 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, | |
249 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, | |
250 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, | |
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, 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, | |
253 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, | |
254 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, | |
255 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, | |
256 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, | |
257 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, | |
258 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, | |
259 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, | |
260 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, | |
261 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, | |
262 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, | |
263 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, | |
264 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, | |
265 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, | |
266 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, | |
267 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, | |
2138 | 268 //error:0.000020 |
269 }; | |
270 static const uint8_t obmc16[256]={ | |
3206 | 271 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, |
272 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
273 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
274 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
275 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
276 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
277 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
278 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
279 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
280 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
281 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
282 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
283 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
284 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
285 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
286 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, | |
2138 | 287 //error:0.000015 |
288 }; | |
289 #else //64*cos | |
290 static const uint8_t obmc32[1024]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
291 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, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
292 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
293 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
294 0, 0, 4, 4, 4, 8, 8, 12, 16, 20, 20, 24, 28, 28, 28, 28, 28, 28, 28, 28, 24, 20, 20, 16, 12, 8, 8, 4, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
295 0, 0, 4, 4, 8, 12, 16, 20, 24, 28, 36, 40, 44, 44, 48, 48, 48, 48, 44, 44, 40, 36, 28, 24, 20, 16, 12, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
296 0, 0, 4, 8, 12, 20, 24, 32, 36, 44, 48, 56, 60, 64, 68, 68, 68, 68, 64, 60, 56, 48, 44, 36, 32, 24, 20, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
297 0, 4, 4, 8, 16, 24, 32, 40, 48, 60, 68, 76, 80, 84, 88, 92, 92, 88, 84, 80, 76, 68, 60, 48, 40, 32, 24, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
298 0, 4, 8, 12, 20, 32, 40, 52, 64, 76, 84, 96,104,108,112,116,116,112,108,104, 96, 84, 76, 64, 52, 40, 32, 20, 12, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
299 0, 4, 8, 16, 24, 36, 48, 64, 76, 92,104,116,124,132,136,140,140,136,132,124,116,104, 92, 76, 64, 48, 36, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
300 0, 4, 12, 20, 28, 44, 60, 76, 92,104,120,136,148,156,160,164,164,160,156,148,136,120,104, 92, 76, 60, 44, 28, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
301 0, 4, 12, 20, 36, 48, 68, 84,104,120,140,152,168,176,184,188,188,184,176,168,152,140,120,104, 84, 68, 48, 36, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
302 0, 4, 12, 24, 36, 56, 76, 96,116,136,152,172,184,196,204,208,208,204,196,184,172,152,136,116, 96, 76, 56, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
303 0, 4, 12, 24, 44, 60, 80,104,124,148,168,184,200,212,224,228,228,224,212,200,184,168,148,124,104, 80, 60, 44, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
304 0, 4, 12, 28, 44, 64, 84,108,132,156,176,196,212,228,236,240,240,236,228,212,196,176,156,132,108, 84, 64, 44, 28, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
305 0, 4, 16, 28, 48, 68, 88,112,136,160,184,204,224,236,244,252,252,244,236,224,204,184,160,136,112, 88, 68, 48, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
306 1, 4, 16, 28, 48, 68, 92,116,140,164,188,208,228,240,252,255,255,252,240,228,208,188,164,140,116, 92, 68, 48, 28, 16, 4, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
307 1, 4, 16, 28, 48, 68, 92,116,140,164,188,208,228,240,252,255,255,252,240,228,208,188,164,140,116, 92, 68, 48, 28, 16, 4, 1, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
308 0, 4, 16, 28, 48, 68, 88,112,136,160,184,204,224,236,244,252,252,244,236,224,204,184,160,136,112, 88, 68, 48, 28, 16, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
309 0, 4, 12, 28, 44, 64, 84,108,132,156,176,196,212,228,236,240,240,236,228,212,196,176,156,132,108, 84, 64, 44, 28, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
310 0, 4, 12, 24, 44, 60, 80,104,124,148,168,184,200,212,224,228,228,224,212,200,184,168,148,124,104, 80, 60, 44, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
311 0, 4, 12, 24, 36, 56, 76, 96,116,136,152,172,184,196,204,208,208,204,196,184,172,152,136,116, 96, 76, 56, 36, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
312 0, 4, 12, 20, 36, 48, 68, 84,104,120,140,152,168,176,184,188,188,184,176,168,152,140,120,104, 84, 68, 48, 36, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
313 0, 4, 12, 20, 28, 44, 60, 76, 92,104,120,136,148,156,160,164,164,160,156,148,136,120,104, 92, 76, 60, 44, 28, 20, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
314 0, 4, 8, 16, 24, 36, 48, 64, 76, 92,104,116,124,132,136,140,140,136,132,124,116,104, 92, 76, 64, 48, 36, 24, 16, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
315 0, 4, 8, 12, 20, 32, 40, 52, 64, 76, 84, 96,104,108,112,116,116,112,108,104, 96, 84, 76, 64, 52, 40, 32, 20, 12, 8, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
316 0, 4, 4, 8, 16, 24, 32, 40, 48, 60, 68, 76, 80, 84, 88, 92, 92, 88, 84, 80, 76, 68, 60, 48, 40, 32, 24, 16, 8, 4, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
317 0, 0, 4, 8, 12, 20, 24, 32, 36, 44, 48, 56, 60, 64, 68, 68, 68, 68, 64, 60, 56, 48, 44, 36, 32, 24, 20, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
318 0, 0, 4, 4, 8, 12, 16, 20, 24, 28, 36, 40, 44, 44, 48, 48, 48, 48, 44, 44, 40, 36, 28, 24, 20, 16, 12, 8, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
319 0, 0, 4, 4, 4, 8, 8, 12, 16, 20, 20, 24, 28, 28, 28, 28, 28, 28, 28, 28, 24, 20, 20, 16, 12, 8, 8, 4, 4, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
320 0, 0, 0, 4, 4, 4, 4, 8, 8, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 8, 8, 4, 4, 4, 4, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
321 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
322 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, |
2138 | 323 //error:0.000022 |
324 }; | |
325 static const uint8_t obmc16[256]={ | |
5659
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
326 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
327 0, 0, 4, 8, 12, 16, 20, 20, 20, 20, 16, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
328 0, 4, 12, 24, 32, 44, 52, 56, 56, 52, 44, 32, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
329 0, 8, 24, 40, 60, 80, 96,104,104, 96, 80, 60, 40, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
330 0, 12, 32, 64, 92,120,140,152,152,140,120, 92, 64, 32, 12, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
331 4, 16, 44, 80,120,156,184,196,196,184,156,120, 80, 44, 16, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
332 4, 20, 52, 96,140,184,216,232,232,216,184,140, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
333 0, 20, 56,104,152,196,232,252,252,232,196,152,104, 56, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
334 0, 20, 56,104,152,196,232,252,252,232,196,152,104, 56, 20, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
335 4, 20, 52, 96,140,184,216,232,232,216,184,140, 96, 52, 20, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
336 4, 16, 44, 80,120,156,184,196,196,184,156,120, 80, 44, 16, 4, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
337 0, 12, 32, 64, 92,120,140,152,152,140,120, 92, 64, 32, 12, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
338 0, 8, 24, 40, 60, 80, 96,104,104, 96, 80, 60, 40, 24, 8, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
339 0, 4, 12, 24, 32, 44, 52, 56, 56, 52, 44, 32, 24, 12, 4, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
340 0, 0, 4, 8, 12, 16, 20, 20, 20, 20, 16, 12, 8, 4, 0, 0, |
ff44e77914ca
scaling obmc tables under #if 0 also by 4 (yes they where forgotten apparently)
michael
parents:
5652
diff
changeset
|
341 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, |
2138 | 342 //error:0.000022 |
343 }; | |
5910 | 344 #endif /* 0 */ |
2138 | 345 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
346 //linear *64 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
347 static const uint8_t obmc8[64]={ |
3206 | 348 4, 12, 20, 28, 28, 20, 12, 4, |
349 12, 36, 60, 84, 84, 60, 36, 12, | |
350 20, 60,100,140,140,100, 60, 20, | |
351 28, 84,140,196,196,140, 84, 28, | |
352 28, 84,140,196,196,140, 84, 28, | |
353 20, 60,100,140,140,100, 60, 20, | |
354 12, 36, 60, 84, 84, 60, 36, 12, | |
355 4, 12, 20, 28, 28, 20, 12, 4, | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
356 //error:0.000000 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
357 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
358 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
359 //linear *64 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
360 static const uint8_t obmc4[16]={ |
3206 | 361 16, 48, 48, 16, |
362 48,144,144, 48, | |
363 48,144,144, 48, | |
364 16, 48, 48, 16, | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
365 //error:0.000000 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
366 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
367 |
7129 | 368 static const uint8_t * const obmc_tab[4]={ |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
369 obmc32, obmc16, obmc8, obmc4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
370 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
371 |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
372 static int scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES]; |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
373 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
374 typedef struct BlockNode{ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
375 int16_t mx; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
376 int16_t my; |
3314 | 377 uint8_t ref; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
378 uint8_t color[3]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
379 uint8_t type; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
380 //#define TYPE_SPLIT 1 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
381 #define BLOCK_INTRA 1 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
382 #define BLOCK_OPT 2 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
383 //#define TYPE_NOCOLOR 4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
384 uint8_t level; //FIXME merge into type? |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
385 }BlockNode; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
386 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
387 static const BlockNode null_block= { //FIXME add border maybe |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
388 .color= {128,128,128}, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
389 .mx= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
390 .my= 0, |
3314 | 391 .ref= 0, |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
392 .type= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
393 .level= 0, |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
394 }; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
395 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
396 #define LOG2_MB_SIZE 4 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
397 #define MB_SIZE (1<<LOG2_MB_SIZE) |
5575 | 398 #define ENCODER_EXTRA_BITS 4 |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
399 #define HTAPS_MAX 8 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
400 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
401 typedef struct x_and_coeff{ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
402 int16_t x; |
2596 | 403 uint16_t coeff; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
404 } x_and_coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
405 |
2138 | 406 typedef struct SubBand{ |
407 int level; | |
408 int stride; | |
409 int width; | |
410 int height; | |
6412 | 411 int qlog; ///< log(qscale)/log[2^(1/6)] |
2138 | 412 DWTELEM *buf; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
413 IDWTELEM *ibuf; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
414 int buf_x_offset; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
415 int buf_y_offset; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
416 int stride_line; ///< Stride measured in lines, not pixels. |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
417 x_and_coeff * x_coeff; |
2138 | 418 struct SubBand *parent; |
419 uint8_t state[/*7*2*/ 7 + 512][32]; | |
420 }SubBand; | |
421 | |
422 typedef struct Plane{ | |
423 int width; | |
424 int height; | |
425 SubBand band[MAX_DECOMPOSITIONS][4]; | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
426 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
427 int htaps; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
428 int8_t hcoeff[HTAPS_MAX/2]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
429 int diag_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
430 int fast_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
431 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
432 int last_htaps; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
433 int8_t last_hcoeff[HTAPS_MAX/2]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
434 int last_diag_mc; |
2138 | 435 }Plane; |
436 | |
437 typedef struct SnowContext{ | |
438 | |
439 AVCodecContext *avctx; | |
2335 | 440 RangeCoder c; |
2138 | 441 DSPContext dsp; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
442 AVFrame new_picture; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
443 AVFrame input_picture; ///< new_picture with the internal linesizes |
2138 | 444 AVFrame current_picture; |
3314 | 445 AVFrame last_picture[MAX_REF_FRAMES]; |
5633
873ea64637d9
code to do halfpel interpolation per frame (unfinished and under ifdef but it
michael
parents:
5627
diff
changeset
|
446 uint8_t *halfpel_plane[MAX_REF_FRAMES][4][4]; |
2138 | 447 AVFrame mconly_picture; |
448 // uint8_t q_context[16]; | |
449 uint8_t header_state[32]; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
450 uint8_t block_state[128 + 32*128]; |
2138 | 451 int keyframe; |
2199 | 452 int always_reset; |
2138 | 453 int version; |
454 int spatial_decomposition_type; | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
455 int last_spatial_decomposition_type; |
2138 | 456 int temporal_decomposition_type; |
457 int spatial_decomposition_count; | |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
458 int last_spatial_decomposition_count; |
2138 | 459 int temporal_decomposition_count; |
3314 | 460 int max_ref_frames; |
461 int ref_frames; | |
462 int16_t (*ref_mvs[MAX_REF_FRAMES])[2]; | |
463 uint32_t *ref_scores[MAX_REF_FRAMES]; | |
2138 | 464 DWTELEM *spatial_dwt_buffer; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
465 IDWTELEM *spatial_idwt_buffer; |
2138 | 466 int colorspace_type; |
467 int chroma_h_shift; | |
468 int chroma_v_shift; | |
469 int spatial_scalability; | |
470 int qlog; | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
471 int last_qlog; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
472 int lambda; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
473 int lambda2; |
3313 | 474 int pass1_rc; |
2138 | 475 int mv_scale; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
476 int last_mv_scale; |
2138 | 477 int qbias; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
478 int last_qbias; |
2138 | 479 #define QBIAS_SHIFT 3 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
480 int b_width; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
481 int b_height; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
482 int block_max_depth; |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
483 int last_block_max_depth; |
2138 | 484 Plane plane[MAX_PLANES]; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
485 BlockNode *block; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
486 #define ME_CACHE_SIZE 1024 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
487 int me_cache[ME_CACHE_SIZE]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
488 int me_cache_generation; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
489 slice_buffer sb; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
490 |
6412 | 491 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to eventually make the motion estimation independent of MpegEncContext, so this will be removed then (FIXME/XXX) |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
492 |
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
493 uint8_t *scratchbuf; |
2138 | 494 }SnowContext; |
495 | |
2562 | 496 typedef struct { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
497 IDWTELEM *b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
498 IDWTELEM *b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
499 IDWTELEM *b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
500 IDWTELEM *b3; |
2562 | 501 int y; |
8308 | 502 } DWTCompose; |
2562 | 503 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
504 #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))) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
505 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num))) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
506 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
507 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM * base_buffer) |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
508 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
509 int i; |
2967 | 510 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
511 buf->base_buffer = base_buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
512 buf->line_count = line_count; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
513 buf->line_width = line_width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
514 buf->data_count = max_allocated_lines; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
515 buf->line = av_mallocz (sizeof(IDWTELEM *) * line_count); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
516 buf->data_stack = av_malloc (sizeof(IDWTELEM *) * max_allocated_lines); |
2967 | 517 |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
518 for(i = 0; i < max_allocated_lines; i++){ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
519 buf->data_stack[i] = av_malloc (sizeof(IDWTELEM) * line_width); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
520 } |
2967 | 521 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
522 buf->data_stack_top = max_allocated_lines - 1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
523 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
524 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
525 static IDWTELEM * slice_buffer_load_line(slice_buffer * buf, int line) |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
526 { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
527 IDWTELEM * buffer; |
2967 | 528 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
529 assert(buf->data_stack_top >= 0); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
530 // assert(!buf->line[line]); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
531 if (buf->line[line]) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
532 return buf->line[line]; |
2967 | 533 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
534 buffer = buf->data_stack[buf->data_stack_top]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
535 buf->data_stack_top--; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
536 buf->line[line] = buffer; |
2967 | 537 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
538 return buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
539 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
540 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
541 static void slice_buffer_release(slice_buffer * buf, int line) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
542 { |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
543 IDWTELEM * buffer; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
544 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
545 assert(line >= 0 && line < buf->line_count); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
546 assert(buf->line[line]); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
547 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
548 buffer = buf->line[line]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
549 buf->data_stack_top++; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
550 buf->data_stack[buf->data_stack_top] = buffer; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
551 buf->line[line] = NULL; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
552 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
553 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
554 static void slice_buffer_flush(slice_buffer * buf) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
555 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
556 int i; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
557 for(i = 0; i < buf->line_count; i++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
558 if (buf->line[i]) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
559 slice_buffer_release(buf, i); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
560 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
561 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
562 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
563 static void slice_buffer_destroy(slice_buffer * buf) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
564 { |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
565 int i; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
566 slice_buffer_flush(buf); |
2967 | 567 |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
568 for(i = buf->data_count - 1; i >= 0; i--){ |
3190 | 569 av_freep(&buf->data_stack[i]); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
570 } |
3190 | 571 av_freep(&buf->data_stack); |
572 av_freep(&buf->line); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
573 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
574 |
2979 | 575 #ifdef __sgi |
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
576 // Avoid a name clash on SGI IRIX |
2979 | 577 #undef qexp |
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
578 #endif |
2246 | 579 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0 |
2600 | 580 static uint8_t qexp[QROOT]; |
2138 | 581 |
582 static inline int mirror(int v, int m){ | |
2998 | 583 while((unsigned)v > (unsigned)m){ |
584 v=-v; | |
585 if(v<0) v+= 2*m; | |
586 } | |
587 return v; | |
2138 | 588 } |
589 | |
2335 | 590 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
2138 | 591 int i; |
592 | |
593 if(v){ | |
4001 | 594 const int a= FFABS(v); |
2138 | 595 const int e= av_log2(a); |
596 #if 1 | |
2967 | 597 const int el= FFMIN(e, 10); |
2335 | 598 put_rac(c, state+0, 0); |
2138 | 599 |
600 for(i=0; i<el; i++){ | |
2335 | 601 put_rac(c, state+1+i, 1); //1..10 |
2138 | 602 } |
603 for(; i<e; i++){ | |
2335 | 604 put_rac(c, state+1+9, 1); //1..10 |
2138 | 605 } |
2335 | 606 put_rac(c, state+1+FFMIN(i,9), 0); |
2138 | 607 |
608 for(i=e-1; i>=el; i--){ | |
2335 | 609 put_rac(c, state+22+9, (a>>i)&1); //22..31 |
2138 | 610 } |
611 for(; i>=0; i--){ | |
2335 | 612 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 613 } |
614 | |
615 if(is_signed) | |
2335 | 616 put_rac(c, state+11 + el, v < 0); //11..21 |
2138 | 617 #else |
2967 | 618 |
2335 | 619 put_rac(c, state+0, 0); |
2138 | 620 if(e<=9){ |
621 for(i=0; i<e; i++){ | |
2335 | 622 put_rac(c, state+1+i, 1); //1..10 |
2138 | 623 } |
2335 | 624 put_rac(c, state+1+i, 0); |
2138 | 625 |
626 for(i=e-1; i>=0; i--){ | |
2335 | 627 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
2138 | 628 } |
629 | |
630 if(is_signed) | |
2335 | 631 put_rac(c, state+11 + e, v < 0); //11..21 |
2138 | 632 }else{ |
633 for(i=0; i<e; i++){ | |
2335 | 634 put_rac(c, state+1+FFMIN(i,9), 1); //1..10 |
2138 | 635 } |
9540 | 636 put_rac(c, state+1+9, 0); |
2138 | 637 |
638 for(i=e-1; i>=0; i--){ | |
2335 | 639 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 |
2138 | 640 } |
641 | |
642 if(is_signed) | |
9540 | 643 put_rac(c, state+11 + 10, v < 0); //11..21 |
2138 | 644 } |
5910 | 645 #endif /* 1 */ |
2138 | 646 }else{ |
2335 | 647 put_rac(c, state+0, 1); |
2138 | 648 } |
649 } | |
650 | |
2335 | 651 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
652 if(get_rac(c, state+0)) | |
2138 | 653 return 0; |
654 else{ | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
655 int i, e, a; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
656 e= 0; |
2335 | 657 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10 |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
658 e++; |
2138 | 659 } |
660 | |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
661 a= 1; |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
662 for(i=e-1; i>=0; i--){ |
2335 | 663 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31 |
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
664 } |
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
665 |
9546 | 666 e= -(is_signed && get_rac(c, state+11 + FFMIN(e,10))); //11..21 |
667 return (a^e)-e; | |
2138 | 668 } |
669 } | |
670 | |
2335 | 671 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){ |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
672 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
673 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
674 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
675 assert(v>=0); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
676 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
677 |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
678 while(v >= r){ |
2335 | 679 put_rac(c, state+4+log2, 1); |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
680 v -= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
681 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
682 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
683 } |
2335 | 684 put_rac(c, state+4+log2, 0); |
2967 | 685 |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
686 for(i=log2-1; i>=0; i--){ |
2335 | 687 put_rac(c, state+31-i, (v>>i)&1); |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
688 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
689 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
690 |
2335 | 691 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){ |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
692 int i; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
693 int r= log2>=0 ? 1<<log2 : 1; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
694 int v=0; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
695 |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
696 assert(log2>=-4); |
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
697 |
2335 | 698 while(get_rac(c, state+4+log2)){ |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
699 v+= r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
700 log2++; |
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
701 if(log2>0) r+=r; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
702 } |
2967 | 703 |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
704 for(i=log2-1; i>=0; i--){ |
2335 | 705 v+= get_rac(c, state+31-i)<<i; |
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
706 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
707 |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
708 return v; |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
709 } |
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
710 |
5627 | 711 static av_always_inline void |
712 lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, | |
713 int dst_step, int src_step, int ref_step, | |
714 int width, int mul, int add, int shift, | |
715 int highpass, int inverse){ | |
2138 | 716 const int mirror_left= !highpass; |
717 const int mirror_right= (width&1) ^ highpass; | |
718 const int w= (width>>1) - 1 + (highpass & width); | |
719 int i; | |
720 | |
721 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) | |
722 if(mirror_left){ | |
723 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); | |
724 dst += dst_step; | |
725 src += src_step; | |
726 } | |
2967 | 727 |
2138 | 728 for(i=0; i<w; i++){ |
5627 | 729 dst[i*dst_step] = |
730 LIFT(src[i*src_step], | |
731 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), | |
732 inverse); | |
2138 | 733 } |
2967 | 734 |
2138 | 735 if(mirror_right){ |
5627 | 736 dst[w*dst_step] = |
737 LIFT(src[w*src_step], | |
738 ((mul*2*ref[w*ref_step]+add)>>shift), | |
739 inverse); | |
2138 | 740 } |
741 } | |
742 | |
5627 | 743 static av_always_inline void |
744 inv_lift(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref, | |
745 int dst_step, int src_step, int ref_step, | |
746 int width, int mul, int add, int shift, | |
747 int highpass, int inverse){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
748 const int mirror_left= !highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
749 const int mirror_right= (width&1) ^ highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
750 const int w= (width>>1) - 1 + (highpass & width); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
751 int i; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
752 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
753 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
754 if(mirror_left){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
755 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
756 dst += dst_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
757 src += src_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
758 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
759 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
760 for(i=0; i<w; i++){ |
5627 | 761 dst[i*dst_step] = |
762 LIFT(src[i*src_step], | |
763 ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), | |
764 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
765 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
766 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
767 if(mirror_right){ |
5627 | 768 dst[w*dst_step] = |
769 LIFT(src[w*src_step], | |
770 ((mul*2*ref[w*ref_step]+add)>>shift), | |
771 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
772 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
773 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
774 |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
775 #ifndef liftS |
5627 | 776 static av_always_inline void |
777 liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, | |
778 int dst_step, int src_step, int ref_step, | |
779 int width, int mul, int add, int shift, | |
780 int highpass, int inverse){ | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
781 const int mirror_left= !highpass; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
782 const int mirror_right= (width&1) ^ highpass; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
783 const int w= (width>>1) - 1 + (highpass & width); |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
784 int i; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
785 |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
786 assert(shift == 4); |
5627 | 787 #define LIFTS(src, ref, inv) \ |
788 ((inv) ? \ | |
789 (src) + (((ref) + 4*(src))>>shift): \ | |
790 -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23))) | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
791 if(mirror_left){ |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
792 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
793 dst += dst_step; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
794 src += src_step; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
795 } |
2967 | 796 |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
797 for(i=0; i<w; i++){ |
5627 | 798 dst[i*dst_step] = |
799 LIFTS(src[i*src_step], | |
800 mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, | |
801 inverse); | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
802 } |
2967 | 803 |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
804 if(mirror_right){ |
5627 | 805 dst[w*dst_step] = |
806 LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
807 } |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
808 } |
5627 | 809 static av_always_inline void |
810 inv_liftS(IDWTELEM *dst, IDWTELEM *src, IDWTELEM *ref, | |
811 int dst_step, int src_step, int ref_step, | |
812 int width, int mul, int add, int shift, | |
813 int highpass, int inverse){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
814 const int mirror_left= !highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
815 const int mirror_right= (width&1) ^ highpass; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
816 const int w= (width>>1) - 1 + (highpass & width); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
817 int i; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
818 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
819 assert(shift == 4); |
5627 | 820 #define LIFTS(src, ref, inv) \ |
821 ((inv) ? \ | |
822 (src) + (((ref) + 4*(src))>>shift): \ | |
823 -((-16*(src) + (ref) + add/4 + 1 + (5<<25))/(5*4) - (1<<23))) | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
824 if(mirror_left){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
825 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
826 dst += dst_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
827 src += src_step; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
828 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
829 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
830 for(i=0; i<w; i++){ |
5627 | 831 dst[i*dst_step] = |
832 LIFTS(src[i*src_step], | |
833 mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, | |
834 inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
835 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
836 |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
837 if(mirror_right){ |
5627 | 838 dst[w*dst_step] = |
839 LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
840 } |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
841 } |
6413 | 842 #endif /* ! liftS */ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
843 |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
844 static void horizontal_decompose53i(DWTELEM *b, int width){ |
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
845 DWTELEM temp[width]; |
2138 | 846 const int width2= width>>1; |
2893 | 847 int x; |
2138 | 848 const int w2= (width+1)>>1; |
849 | |
850 for(x=0; x<width2; x++){ | |
851 temp[x ]= b[2*x ]; | |
852 temp[x+w2]= b[2*x + 1]; | |
853 } | |
854 if(width&1) | |
855 temp[x ]= b[2*x ]; | |
856 #if 0 | |
2893 | 857 { |
858 int A1,A2,A3,A4; | |
2138 | 859 A2= temp[1 ]; |
860 A4= temp[0 ]; | |
861 A1= temp[0+width2]; | |
862 A1 -= (A2 + A4)>>1; | |
863 A4 += (A1 + 1)>>1; | |
864 b[0+width2] = A1; | |
865 b[0 ] = A4; | |
866 for(x=1; x+1<width2; x+=2){ | |
867 A3= temp[x+width2]; | |
868 A4= temp[x+1 ]; | |
869 A3 -= (A2 + A4)>>1; | |
870 A2 += (A1 + A3 + 2)>>2; | |
871 b[x+width2] = A3; | |
872 b[x ] = A2; | |
873 | |
874 A1= temp[x+1+width2]; | |
875 A2= temp[x+2 ]; | |
876 A1 -= (A2 + A4)>>1; | |
877 A4 += (A1 + A3 + 2)>>2; | |
878 b[x+1+width2] = A1; | |
879 b[x+1 ] = A4; | |
880 } | |
881 A3= temp[width-1]; | |
882 A3 -= A2; | |
883 A2 += (A1 + A3 + 2)>>2; | |
884 b[width -1] = A3; | |
885 b[width2-1] = A2; | |
2893 | 886 } |
2967 | 887 #else |
2138 | 888 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0); |
889 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0); | |
6413 | 890 #endif /* 0 */ |
2138 | 891 } |
892 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
893 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 894 int i; |
2967 | 895 |
2138 | 896 for(i=0; i<width; i++){ |
897 b1[i] -= (b0[i] + b2[i])>>1; | |
898 } | |
899 } | |
900 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
901 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 902 int i; |
2967 | 903 |
2138 | 904 for(i=0; i<width; i++){ |
905 b1[i] += (b0[i] + b2[i] + 2)>>2; | |
906 } | |
907 } | |
908 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
909 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 910 int y; |
2138 | 911 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride; |
912 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride; | |
2967 | 913 |
2138 | 914 for(y=-2; y<height; y+=2){ |
915 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
916 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
917 | |
2998 | 918 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width); |
919 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width); | |
6405 | 920 |
2998 | 921 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width); |
922 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width); | |
2967 | 923 |
2138 | 924 b0=b2; |
925 b1=b3; | |
926 } | |
927 } | |
928 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
929 static void horizontal_decompose97i(DWTELEM *b, int width){ |
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
930 DWTELEM temp[width]; |
2138 | 931 const int w2= (width+1)>>1; |
932 | |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
933 lift (temp+w2, b +1, b , 1, 2, 2, width, W_AM, W_AO, W_AS, 1, 1); |
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
934 liftS(temp , b , temp+w2, 1, 2, 1, width, W_BM, W_BO, W_BS, 0, 0); |
5589
946c2db0a093
cleanup (remove some old experimentation related code)
michael
parents:
5588
diff
changeset
|
935 lift (b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0); |
2138 | 936 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0); |
937 } | |
938 | |
939 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
940 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 941 int i; |
2967 | 942 |
2138 | 943 for(i=0; i<width; i++){ |
944 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
945 } | |
946 } | |
947 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
948 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 949 int i; |
2967 | 950 |
2138 | 951 for(i=0; i<width; i++){ |
952 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
953 } | |
954 } | |
955 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
956 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 957 int i; |
2967 | 958 |
2138 | 959 for(i=0; i<width; i++){ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
960 #ifdef liftS |
2138 | 961 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
962 #else |
5565
93082c591c8b
Change rounding of the horizontal DWT to match the vertical one.
michael
parents:
5551
diff
changeset
|
963 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + W_BO*5 + (5<<27)) / (5*16) - (1<<23); |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
964 #endif |
2138 | 965 } |
966 } | |
967 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
968 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
2138 | 969 int i; |
2967 | 970 |
2138 | 971 for(i=0; i<width; i++){ |
972 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
973 } | |
974 } | |
975 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
976 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){ |
2198 | 977 int y; |
2138 | 978 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride; |
979 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride; | |
980 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride; | |
981 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride; | |
2967 | 982 |
2138 | 983 for(y=-4; y<height; y+=2){ |
984 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
985 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
986 | |
2998 | 987 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width); |
988 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width); | |
6405 | 989 |
2998 | 990 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width); |
991 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width); | |
992 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width); | |
993 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width); | |
2138 | 994 |
995 b0=b2; | |
996 b1=b3; | |
997 b2=b4; | |
998 b3=b5; | |
999 } | |
1000 } | |
1001 | |
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1002 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
2138 | 1003 int level; |
2967 | 1004 |
2164 | 1005 for(level=0; level<decomposition_count; level++){ |
1006 switch(type){ | |
3326 | 1007 case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break; |
1008 case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break; | |
2138 | 1009 } |
1010 } | |
1011 } | |
1012 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1013 static void horizontal_compose53i(IDWTELEM *b, int width){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1014 IDWTELEM temp[width]; |
2138 | 1015 const int width2= width>>1; |
1016 const int w2= (width+1)>>1; | |
2893 | 1017 int x; |
2138 | 1018 |
1019 for(x=0; x<width2; x++){ | |
10840
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1020 temp[2*x ]= b[x ]; |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1021 temp[2*x + 1]= b[x+w2]; |
2138 | 1022 } |
1023 if(width&1) | |
10840
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1024 temp[2*x ]= b[x ]; |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1025 |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1026 b[0] = temp[0] - ((temp[1]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1027 for(x=2; x<width-1; x+=2){ |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1028 b[x ] = temp[x ] - ((temp[x-1] + temp[x+1]+2)>>2); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1029 b[x-1] = temp[x-1] + ((b [x-2] + b [x ]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1030 } |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1031 if(width&1){ |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1032 b[x ] = temp[x ] - ((temp[x-1]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1033 b[x-1] = temp[x-1] + ((b [x-2] + b [x ]+1)>>1); |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1034 }else |
c76bc0410301
Optimize horizontal_compose53i() by inlining inv_lift() and optimizing the
michael
parents:
10815
diff
changeset
|
1035 b[x-1] = temp[x-1] + b[x-2]; |
2138 | 1036 } |
1037 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1038 static void vertical_compose53iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1039 int i; |
2967 | 1040 |
2138 | 1041 for(i=0; i<width; i++){ |
1042 b1[i] += (b0[i] + b2[i])>>1; | |
1043 } | |
1044 } | |
1045 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1046 static void vertical_compose53iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1047 int i; |
2967 | 1048 |
2138 | 1049 for(i=0; i<width; i++){ |
1050 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
1051 } | |
1052 } | |
1053 | |
8308 | 1054 static void spatial_compose53i_buffered_init(DWTCompose *cs, slice_buffer * sb, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1055 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1056 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1057 cs->y = -1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1058 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1059 |
8308 | 1060 static void spatial_compose53i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1061 cs->b0 = buffer + mirror(-1-1, height-1)*stride; |
1062 cs->b1 = buffer + mirror(-1 , height-1)*stride; | |
1063 cs->y = -1; | |
1064 } | |
1065 | |
8308 | 1066 static void spatial_compose53i_dy_buffered(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1067 int y= cs->y; |
2967 | 1068 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1069 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1070 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1071 IDWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1072 IDWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1073 |
10841 | 1074 if(y+1<(unsigned)height && y<(unsigned)height){ |
1075 int x; | |
1076 | |
1077 for(x=0; x<width; x++){ | |
1078 b2[x] -= (b1[x] + b3[x] + 2)>>2; | |
1079 b1[x] += (b0[x] + b2[x])>>1; | |
1080 } | |
1081 }else{ | |
2998 | 1082 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1083 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
10841 | 1084 } |
6405 | 1085 |
2998 | 1086 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1087 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1088 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1089 cs->b0 = b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1090 cs->b1 = b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1091 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1092 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1093 |
8308 | 1094 static void spatial_compose53i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1095 int y= cs->y; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1096 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1097 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1098 IDWTELEM *b2= buffer + mirror(y+1, height-1)*stride; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1099 IDWTELEM *b3= buffer + mirror(y+2, height-1)*stride; |
2138 | 1100 |
2998 | 1101 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
1102 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
6405 | 1103 |
2998 | 1104 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
1105 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
2138 | 1106 |
2562 | 1107 cs->b0 = b2; |
1108 cs->b1 = b3; | |
1109 cs->y += 2; | |
1110 } | |
1111 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1112 static void av_unused spatial_compose53i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1113 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1114 spatial_compose53i_init(&cs, buffer, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1115 while(cs.y <= height) |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1116 spatial_compose53i_dy(&cs, buffer, width, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1117 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1118 |
2967 | 1119 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1120 void ff_snow_horizontal_compose97i(IDWTELEM *b, int width){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1121 IDWTELEM temp[width]; |
2138 | 1122 const int w2= (width+1)>>1; |
1123 | |
10842 | 1124 #if 0 //maybe more understadable but slower |
1125 inv_lift (temp , b , b +w2, 2, 1, 1, width, W_DM, W_DO, W_DS, 0, 1); | |
1126 inv_lift (temp+1 , b +w2, temp , 2, 1, 2, width, W_CM, W_CO, W_CS, 1, 1); | |
1127 | |
1128 inv_liftS(b , temp , temp+1 , 2, 2, 2, width, W_BM, W_BO, W_BS, 0, 1); | |
1129 inv_lift (b+1 , temp+1 , b , 2, 2, 2, width, W_AM, W_AO, W_AS, 1, 0); | |
1130 #else | |
1131 int x; | |
1132 temp[0] = b[0] - ((3*b[w2]+2)>>2); | |
1133 for(x=1; x<(width>>1); x++){ | |
1134 temp[2*x ] = b[x ] - ((3*(b [x+w2-1] + b[x+w2])+4)>>3); | |
1135 temp[2*x-1] = b[x+w2-1] - temp[2*x-2] - temp[2*x]; | |
1136 } | |
1137 if(width&1){ | |
1138 temp[2*x ] = b[x ] - ((3*b [x+w2-1]+2)>>2); | |
1139 temp[2*x-1] = b[x+w2-1] - temp[2*x-2] - temp[2*x]; | |
1140 }else | |
1141 temp[2*x-1] = b[x+w2-1] - 2*temp[2*x-2]; | |
1142 | |
1143 b[0] = temp[0] + ((2*temp[0] + temp[1]+4)>>3); | |
1144 for(x=2; x<width-1; x+=2){ | |
1145 b[x ] = temp[x ] + ((4*temp[x ] + temp[x-1] + temp[x+1]+8)>>4); | |
1146 b[x-1] = temp[x-1] + ((3*(b [x-2] + b [x ] ))>>1); | |
1147 } | |
1148 if(width&1){ | |
1149 b[x ] = temp[x ] + ((2*temp[x ] + temp[x-1]+4)>>3); | |
1150 b[x-1] = temp[x-1] + ((3*(b [x-2] + b [x ] ))>>1); | |
1151 }else | |
1152 b[x-1] = temp[x-1] + 3*b [x-2]; | |
1153 #endif | |
2138 | 1154 } |
1155 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1156 static void vertical_compose97iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1157 int i; |
2967 | 1158 |
2138 | 1159 for(i=0; i<width; i++){ |
1160 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
1161 } | |
1162 } | |
1163 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1164 static void vertical_compose97iH1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1165 int i; |
2967 | 1166 |
2138 | 1167 for(i=0; i<width; i++){ |
1168 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
1169 } | |
1170 } | |
1171 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1172 static void vertical_compose97iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1173 int i; |
2967 | 1174 |
2138 | 1175 for(i=0; i<width; i++){ |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1176 #ifdef liftS |
2138 | 1177 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1178 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1179 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1180 #endif |
2138 | 1181 } |
1182 } | |
1183 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1184 static void vertical_compose97iL1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width){ |
2138 | 1185 int i; |
2967 | 1186 |
2138 | 1187 for(i=0; i<width; i++){ |
1188 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
1189 } | |
1190 } | |
1191 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1192 void ff_snow_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width){ |
2592 | 1193 int i; |
2967 | 1194 |
2592 | 1195 for(i=0; i<width; i++){ |
1196 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS; | |
1197 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS; | |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1198 #ifdef liftS |
2592 | 1199 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS; |
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1200 #else |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1201 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS; |
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1202 #endif |
2592 | 1203 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; |
1204 } | |
1205 } | |
1206 | |
8308 | 1207 static void spatial_compose97i_buffered_init(DWTCompose *cs, slice_buffer * sb, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1208 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1209 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1210 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1211 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1212 cs->y = -3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1213 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1214 |
8308 | 1215 static void spatial_compose97i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride){ |
2562 | 1216 cs->b0 = buffer + mirror(-3-1, height-1)*stride; |
1217 cs->b1 = buffer + mirror(-3 , height-1)*stride; | |
1218 cs->b2 = buffer + mirror(-3+1, height-1)*stride; | |
1219 cs->b3 = buffer + mirror(-3+2, height-1)*stride; | |
1220 cs->y = -3; | |
1221 } | |
2138 | 1222 |
8308 | 1223 static void spatial_compose97i_dy_buffered(DSPContext *dsp, DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1224 int y = cs->y; |
2967 | 1225 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1226 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1227 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1228 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1229 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1230 IDWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1231 IDWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line); |
2967 | 1232 |
2592 | 1233 if(y>0 && y+4<height){ |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1234 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width); |
2592 | 1235 }else{ |
2998 | 1236 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1237 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1238 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1239 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
2592 | 1240 } |
6405 | 1241 |
9495 | 1242 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width); |
1243 if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width); | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1244 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1245 cs->b0=b2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1246 cs->b1=b3; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1247 cs->b2=b4; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1248 cs->b3=b5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1249 cs->y += 2; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1250 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1251 |
8308 | 1252 static void spatial_compose97i_dy(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride){ |
2562 | 1253 int y = cs->y; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1254 IDWTELEM *b0= cs->b0; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1255 IDWTELEM *b1= cs->b1; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1256 IDWTELEM *b2= cs->b2; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1257 IDWTELEM *b3= cs->b3; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1258 IDWTELEM *b4= buffer + mirror(y+3, height-1)*stride; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1259 IDWTELEM *b5= buffer + mirror(y+4, height-1)*stride; |
2138 | 1260 |
9495 | 1261 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
1262 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
1263 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
1264 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
1265 | |
1266 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width); | |
1267 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width); | |
2562 | 1268 |
1269 cs->b0=b2; | |
1270 cs->b1=b3; | |
1271 cs->b2=b4; | |
1272 cs->b3=b5; | |
1273 cs->y += 2; | |
1274 } | |
1275 | |
5989
382aa8b243c5
prevent warnings about functions being possibly unused
michael
parents:
5988
diff
changeset
|
1276 static void av_unused spatial_compose97i(IDWTELEM *buffer, int width, int height, int stride){ |
8308 | 1277 DWTCompose cs; |
5988
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1278 spatial_compose97i_init(&cs, buffer, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1279 while(cs.y <= height) |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1280 spatial_compose97i_dy(&cs, buffer, width, height, stride); |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1281 } |
919193c63fb8
thank you for your efforts to keep my code clean, but i would like to
michael
parents:
5934
diff
changeset
|
1282 |
8308 | 1283 static void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1284 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1285 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1286 switch(type){ |
3326 | 1287 case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; |
1288 case DWT_53: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1289 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1290 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1291 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1292 |
8308 | 1293 static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, DWTCompose *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1294 const int support = type==1 ? 3 : 5; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1295 int level; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1296 if(type==2) return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1297 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1298 for(level=decomposition_count-1; level>=0; level--){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1299 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1300 switch(type){ |
3326 | 1301 case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1302 break; |
3326 | 1303 case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
6414 | 1304 break; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1305 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1306 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1307 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1308 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1309 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1310 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){ |
2138 | 1311 const int w= b->width; |
1312 const int h= b->height; | |
1313 int x,y; | |
2967 | 1314 |
10815 | 1315 int run, runs; |
1316 x_and_coeff *xc= b->x_coeff; | |
1317 x_and_coeff *prev_xc= NULL; | |
1318 x_and_coeff *prev2_xc= xc; | |
1319 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; | |
1320 x_and_coeff *prev_parent_xc= parent_xc; | |
1321 | |
1322 runs= get_symbol2(&s->c, b->state[30], 0); | |
1323 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); | |
1324 else run= INT_MAX; | |
1325 | |
1326 for(y=0; y<h; y++){ | |
1327 int v=0; | |
1328 int lt=0, t=0, rt=0; | |
1329 | |
1330 if(y && prev_xc->x == 0){ | |
1331 rt= prev_xc->coeff; | |
1332 } | |
1333 for(x=0; x<w; x++){ | |
1334 int p=0; | |
1335 const int l= v; | |
1336 | |
1337 lt= t; t= rt; | |
1338 | |
1339 if(y){ | |
1340 if(prev_xc->x <= x) | |
1341 prev_xc++; | |
1342 if(prev_xc->x == x + 1) | |
1343 rt= prev_xc->coeff; | |
1344 else | |
1345 rt=0; | |
2193 | 1346 } |
10815 | 1347 if(parent_xc){ |
1348 if(x>>1 > parent_xc->x){ | |
1349 parent_xc++; | |
2194 | 1350 } |
10815 | 1351 if(x>>1 == parent_xc->x){ |
1352 p= parent_xc->coeff; | |
2138 | 1353 } |
2192 | 1354 } |
10815 | 1355 if(/*ll|*/l|lt|t|rt|p){ |
1356 int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); | |
1357 | |
1358 v=get_rac(&s->c, &b->state[0][context]); | |
1359 if(v){ | |
1360 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); | |
1361 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]); | |
1362 | |
1363 xc->x=x; | |
1364 (xc++)->coeff= v; | |
1365 } | |
1366 }else{ | |
1367 if(!run){ | |
1368 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); | |
1369 else run= INT_MAX; | |
1370 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); | |
1371 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]); | |
1372 | |
1373 xc->x=x; | |
1374 (xc++)->coeff= v; | |
2192 | 1375 }else{ |
10815 | 1376 int max_run; |
1377 run--; | |
1378 v=0; | |
1379 | |
1380 if(y) max_run= FFMIN(run, prev_xc->x - x - 2); | |
1381 else max_run= FFMIN(run, w-x-1); | |
1382 if(parent_xc) | |
1383 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1); | |
1384 x+= max_run; | |
1385 run-= max_run; | |
2138 | 1386 } |
1387 } | |
1388 } | |
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1389 (xc++)->x= w+1; //end marker |
10815 | 1390 prev_xc= prev2_xc; |
1391 prev2_xc= xc; | |
1392 | |
1393 if(parent_xc){ | |
1394 if(y&1){ | |
1395 while(parent_xc->x != parent->width+1) | |
1396 parent_xc++; | |
1397 parent_xc++; | |
1398 prev_parent_xc= parent_xc; | |
1399 }else{ | |
1400 parent_xc= prev_parent_xc; | |
1401 } | |
1402 } | |
1403 } | |
1404 | |
1405 (xc++)->x= w+1; //end marker | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1406 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1407 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1408 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1409 const int w= b->width; |
2893 | 1410 int y; |
4594 | 1411 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 1412 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1413 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1414 int new_index = 0; |
2967 | 1415 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1416 if(b->ibuf == s->spatial_idwt_buffer || s->qlog == LOSSLESS_QLOG){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1417 qadd= 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1418 qmul= 1<<QEXPSHIFT; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1419 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1420 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1421 /* If we are on the second or later slice, restore our index. */ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1422 if (start_y != 0) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1423 new_index = save_state[0]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1424 |
2967 | 1425 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1426 for(y=start_y; y<h; y++){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1427 int x = 0; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1428 int v; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1429 IDWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1430 memset(line, 0, b->width*sizeof(IDWTELEM)); |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1431 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1432 x = b->x_coeff[new_index++].x; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
1433 while(x < w){ |
2596 | 1434 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT; |
1435 register int u= -(v&1); | |
1436 line[x] = (t^u) - u; | |
1437 | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1438 v = b->x_coeff[new_index].coeff; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1439 x = b->x_coeff[new_index++].x; |
2138 | 1440 } |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1441 } |
2967 | 1442 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1443 /* Save our variables for the next slice. */ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1444 save_state[0] = new_index; |
2967 | 1445 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1446 return; |
2138 | 1447 } |
1448 | |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
1449 static void reset_contexts(SnowContext *s){ //FIXME better initial contexts |
2138 | 1450 int plane_index, level, orientation; |
1451 | |
2199 | 1452 for(plane_index=0; plane_index<3; plane_index++){ |
5665
834f359e7257
perform init after reading the values needed for init
michael
parents:
5664
diff
changeset
|
1453 for(level=0; level<MAX_DECOMPOSITIONS; level++){ |
2138 | 1454 for(orientation=level ? 1:0; orientation<4; orientation++){ |
2335 | 1455 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state)); |
2138 | 1456 } |
1457 } | |
1458 } | |
2335 | 1459 memset(s->header_state, MID_STATE, sizeof(s->header_state)); |
1460 memset(s->block_state, MID_STATE, sizeof(s->block_state)); | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1461 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1462 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1463 static int alloc_blocks(SnowContext *s){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1464 int w= -((-s->avctx->width )>>LOG2_MB_SIZE); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1465 int h= -((-s->avctx->height)>>LOG2_MB_SIZE); |
2967 | 1466 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1467 s->b_width = w; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1468 s->b_height= h; |
2967 | 1469 |
9370 | 1470 av_free(s->block); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1471 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2)); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1472 return 0; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1473 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1474 |
2335 | 1475 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){ |
1476 uint8_t *bytestream= d->bytestream; | |
1477 uint8_t *bytestream_start= d->bytestream_start; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1478 *d= *s; |
2335 | 1479 d->bytestream= bytestream; |
1480 d->bytestream_start= bytestream_start; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1481 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1482 |
3314 | 1483 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){ |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1484 const int w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1485 const int rem_depth= s->block_max_depth - level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1486 const int index= (x + y*w) << rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1487 const int block_w= 1<<rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1488 BlockNode block; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1489 int i,j; |
2967 | 1490 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1491 block.color[0]= l; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1492 block.color[1]= cb; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1493 block.color[2]= cr; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1494 block.mx= mx; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1495 block.my= my; |
3314 | 1496 block.ref= ref; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1497 block.type= type; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1498 block.level= level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1499 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1500 for(j=0; j<block_w; j++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1501 for(i=0; i<block_w; i++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1502 s->block[index + i + j*w]= block; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1503 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1504 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1505 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1506 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1507 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){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1508 const int offset[3]= { |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1509 y*c-> stride + x, |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1510 ((y*c->uvstride + x)>>1), |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1511 ((y*c->uvstride + x)>>1), |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1512 }; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1513 int i; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1514 for(i=0; i<3; i++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1515 c->src[0][i]= src [i]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1516 c->ref[0][i]= ref [i] + offset[i]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1517 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1518 assert(!ref_index); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1519 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1520 |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1521 static inline void pred_mv(SnowContext *s, int *mx, int *my, int ref, |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1522 const BlockNode *left, const BlockNode *top, const BlockNode *tr){ |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1523 if(s->ref_frames == 1){ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1524 *mx = mid_pred(left->mx, top->mx, tr->mx); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1525 *my = mid_pred(left->my, top->my, tr->my); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1526 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1527 const int *scale = scale_mv_ref[ref]; |
4407
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1528 *mx = mid_pred((left->mx * scale[left->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1529 (top ->mx * scale[top ->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1530 (tr ->mx * scale[tr ->ref] + 128) >>8); |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1531 *my = mid_pred((left->my * scale[left->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1532 (top ->my * scale[top ->ref] + 128) >>8, |
15688bdfe1b5
Brings down the number of snow.c warnings from 33 to 27 by putting parentheses
takis
parents:
4360
diff
changeset
|
1533 (tr ->my * scale[tr ->ref] + 128) >>8); |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1534 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1535 } |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1536 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
1537 static av_always_inline int same_block(BlockNode *a, BlockNode *b){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1538 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1539 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2])); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1540 }else{ |
3314 | 1541 return !((a->mx - b->mx) | (a->my - b->my) | (a->ref - b->ref) | ((a->type ^ b->type)&BLOCK_INTRA)); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1542 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1543 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1544 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1545 static void decode_q_branch(SnowContext *s, int level, int x, int y){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1546 const int w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1547 const int rem_depth= s->block_max_depth - level; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1548 const int index= (x + y*w) << rem_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1549 int trx= (x+1)<<rem_depth; |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1550 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1551 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1552 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
1553 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1554 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
2967 | 1555 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1556 if(s->keyframe){ |
3314 | 1557 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); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1558 return; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1559 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1560 |
2335 | 1561 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){ |
4332 | 1562 int type, mx, my; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1563 int l = left->color[0]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1564 int cb= left->color[1]; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1565 int cr= left->color[2]; |
3314 | 1566 int ref = 0; |
1567 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); | |
4001 | 1568 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx)); |
1569 int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my)); | |
2967 | 1570 |
2335 | 1571 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1572 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1573 if(type){ |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1574 pred_mv(s, &mx, &my, 0, left, top, tr); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1575 l += get_symbol(&s->c, &s->block_state[32], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1576 cb+= get_symbol(&s->c, &s->block_state[64], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1577 cr+= get_symbol(&s->c, &s->block_state[96], 1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1578 }else{ |
3314 | 1579 if(s->ref_frames > 1) |
1580 ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0); | |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1581 pred_mv(s, &mx, &my, ref, left, top, tr); |
3314 | 1582 mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1); |
1583 my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1); | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1584 } |
3314 | 1585 set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1586 }else{ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1587 decode_q_branch(s, level+1, 2*x+0, 2*y+0); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1588 decode_q_branch(s, level+1, 2*x+1, 2*y+0); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1589 decode_q_branch(s, level+1, 2*x+0, 2*y+1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1590 decode_q_branch(s, level+1, 2*x+1, 2*y+1); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1591 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1592 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1593 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1594 static void decode_blocks(SnowContext *s){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1595 int x, y; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1596 int w= s->b_width; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1597 int h= s->b_height; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1598 |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1599 for(y=0; y<h; y++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1600 for(x=0; x<w; x++){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1601 decode_q_branch(s, 0, x, y); |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1602 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1603 } |
2138 | 1604 } |
1605 | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1606 static void mc_block(Plane *p, uint8_t *dst, const uint8_t *src, uint8_t *tmp, int stride, int b_w, int b_h, int dx, int dy){ |
7622 | 1607 static const uint8_t weight[64]={ |
5648 | 1608 8,7,6,5,4,3,2,1, |
1609 7,7,0,0,0,0,0,1, | |
1610 6,0,6,0,0,0,2,0, | |
1611 5,0,0,5,0,3,0,0, | |
1612 4,0,0,0,4,0,0,0, | |
1613 3,0,0,5,0,3,0,0, | |
1614 2,0,6,0,0,0,2,0, | |
1615 1,7,0,0,0,0,0,1, | |
1616 }; | |
1617 | |
7622 | 1618 static const uint8_t brane[256]={ |
5648 | 1619 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12, |
1620 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52, | |
1621 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc, | |
1622 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc, | |
1623 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc, | |
1624 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc, | |
1625 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc, | |
1626 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16, | |
1627 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56, | |
1628 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96, | |
1629 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc, | |
1630 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc, | |
1631 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc, | |
1632 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc, | |
1633 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc, | |
1634 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A, | |
1635 }; | |
1636 | |
7622 | 1637 static const uint8_t needs[16]={ |
5648 | 1638 0,1,0,0, |
1639 2,4,2,0, | |
1640 0,1,0,0, | |
1641 15 | |
1642 }; | |
1643 | |
1644 int x, y, b, r, l; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1645 int16_t tmpIt [64*(32+HTAPS_MAX)]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1646 uint8_t tmp2t[3][stride*(32+HTAPS_MAX)]; |
5648 | 1647 int16_t *tmpI= tmpIt; |
1648 uint8_t *tmp2= tmp2t[0]; | |
6205 | 1649 const uint8_t *hpel[11]; |
5648 | 1650 assert(dx<16 && dy<16); |
1651 r= brane[dx + 16*dy]&15; | |
1652 l= brane[dx + 16*dy]>>4; | |
1653 | |
1654 b= needs[l] | needs[r]; | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1655 if(p && !p->diag_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1656 b= 15; |
5648 | 1657 |
1658 if(b&5){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1659 for(y=0; y < b_h+HTAPS_MAX-1; y++){ |
5649 | 1660 for(x=0; x < b_w; x++){ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1661 int a_1=src[x + HTAPS_MAX/2-4]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1662 int a0= src[x + HTAPS_MAX/2-3]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1663 int a1= src[x + HTAPS_MAX/2-2]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1664 int a2= src[x + HTAPS_MAX/2-1]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1665 int a3= src[x + HTAPS_MAX/2+0]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1666 int a4= src[x + HTAPS_MAX/2+1]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1667 int a5= src[x + HTAPS_MAX/2+2]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1668 int a6= src[x + HTAPS_MAX/2+3]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1669 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1670 if(!p || p->fast_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1671 am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1672 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1673 am= (am+16)>>5; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1674 }else{ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1675 am= p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1676 tmpI[x]= am; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1677 am= (am+32)>>6; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1678 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1679 |
5649 | 1680 if(am&(~255)) am= ~(am>>31); |
1681 tmp2[x]= am; | |
1682 } | |
1683 tmpI+= 64; | |
1684 tmp2+= stride; | |
1685 src += stride; | |
2138 | 1686 } |
5649 | 1687 src -= stride*y; |
5648 | 1688 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1689 src += HTAPS_MAX/2 - 1; |
5648 | 1690 tmp2= tmp2t[1]; |
1691 | |
1692 if(b&2){ | |
5649 | 1693 for(y=0; y < b_h; y++){ |
1694 for(x=0; x < b_w+1; x++){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1695 int a_1=src[x + (HTAPS_MAX/2-4)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1696 int a0= src[x + (HTAPS_MAX/2-3)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1697 int a1= src[x + (HTAPS_MAX/2-2)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1698 int a2= src[x + (HTAPS_MAX/2-1)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1699 int a3= src[x + (HTAPS_MAX/2+0)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1700 int a4= src[x + (HTAPS_MAX/2+1)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1701 int a5= src[x + (HTAPS_MAX/2+2)*stride]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1702 int a6= src[x + (HTAPS_MAX/2+3)*stride]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1703 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1704 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1705 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 16)>>5; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1706 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1707 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 32)>>6; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1708 |
5649 | 1709 if(am&(~255)) am= ~(am>>31); |
1710 tmp2[x]= am; | |
1711 } | |
1712 src += stride; | |
1713 tmp2+= stride; | |
5648 | 1714 } |
5649 | 1715 src -= stride*y; |
5648 | 1716 } |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1717 src += stride*(HTAPS_MAX/2 - 1); |
5648 | 1718 tmp2= tmp2t[2]; |
1719 tmpI= tmpIt; | |
1720 if(b&4){ | |
1721 for(y=0; y < b_h; y++){ | |
1722 for(x=0; x < b_w; x++){ | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1723 int a_1=tmpI[x + (HTAPS_MAX/2-4)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1724 int a0= tmpI[x + (HTAPS_MAX/2-3)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1725 int a1= tmpI[x + (HTAPS_MAX/2-2)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1726 int a2= tmpI[x + (HTAPS_MAX/2-1)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1727 int a3= tmpI[x + (HTAPS_MAX/2+0)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1728 int a4= tmpI[x + (HTAPS_MAX/2+1)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1729 int a5= tmpI[x + (HTAPS_MAX/2+2)*64]; |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1730 int a6= tmpI[x + (HTAPS_MAX/2+3)*64]; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1731 int am=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1732 if(!p || p->fast_mc) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1733 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 512)>>10; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1734 else |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1735 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 2048)>>12; |
5648 | 1736 if(am&(~255)) am= ~(am>>31); |
1737 tmp2[x]= am; | |
1738 } | |
1739 tmpI+= 64; | |
1740 tmp2+= stride; | |
2138 | 1741 } |
5648 | 1742 } |
1743 | |
1744 hpel[ 0]= src; | |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1745 hpel[ 1]= tmp2t[0] + stride*(HTAPS_MAX/2-1); |
5648 | 1746 hpel[ 2]= src + 1; |
1747 | |
1748 hpel[ 4]= tmp2t[1]; | |
1749 hpel[ 5]= tmp2t[2]; | |
1750 hpel[ 6]= tmp2t[1] + 1; | |
1751 | |
1752 hpel[ 8]= src + stride; | |
1753 hpel[ 9]= hpel[1] + stride; | |
1754 hpel[10]= hpel[8] + 1; | |
1755 | |
1756 if(b==15){ | |
6205 | 1757 const uint8_t *src1= hpel[dx/8 + dy/8*4 ]; |
1758 const uint8_t *src2= hpel[dx/8 + dy/8*4+1]; | |
1759 const uint8_t *src3= hpel[dx/8 + dy/8*4+4]; | |
1760 const uint8_t *src4= hpel[dx/8 + dy/8*4+5]; | |
5648 | 1761 dx&=7; |
1762 dy&=7; | |
1763 for(y=0; y < b_h; y++){ | |
1764 for(x=0; x < b_w; x++){ | |
1765 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+ | |
1766 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6; | |
1767 } | |
1768 src1+=stride; | |
1769 src2+=stride; | |
1770 src3+=stride; | |
1771 src4+=stride; | |
1772 dst +=stride; | |
1773 } | |
1774 }else{ | |
6205 | 1775 const uint8_t *src1= hpel[l]; |
1776 const uint8_t *src2= hpel[r]; | |
5648 | 1777 int a= weight[((dx&7) + (8*(dy&7)))]; |
1778 int b= 8-a; | |
1779 for(y=0; y < b_h; y++){ | |
1780 for(x=0; x < b_w; x++){ | |
1781 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3; | |
1782 } | |
1783 src1+=stride; | |
1784 src2+=stride; | |
1785 dst +=stride; | |
1786 } | |
2138 | 1787 } |
1788 } | |
1789 | |
1790 #define mca(dx,dy,b_w)\ | |
5254 | 1791 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, const uint8_t *src, int stride, int h){\ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1792 uint8_t tmp[stride*(b_w+HTAPS_MAX-1)];\ |
2138 | 1793 assert(h==b_w);\ |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1794 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, tmp, stride, b_w, b_w, dx, dy);\ |
2138 | 1795 } |
1796 | |
1797 mca( 0, 0,16) | |
1798 mca( 8, 0,16) | |
1799 mca( 0, 8,16) | |
1800 mca( 8, 8,16) | |
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1801 mca( 0, 0,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1802 mca( 8, 0,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1803 mca( 0, 8,8) |
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
1804 mca( 8, 8,8) |
2138 | 1805 |
3314 | 1806 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
1807 if(block->type & BLOCK_INTRA){ |
2206 | 1808 int x, y; |
3018 | 1809 const int color = block->color[plane_index]; |
1810 const int color4= color*0x01010101; | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1811 if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1812 for(y=0; y < b_h; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1813 *(uint32_t*)&dst[0 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1814 *(uint32_t*)&dst[4 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1815 *(uint32_t*)&dst[8 + y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1816 *(uint32_t*)&dst[12+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1817 *(uint32_t*)&dst[16+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1818 *(uint32_t*)&dst[20+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1819 *(uint32_t*)&dst[24+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1820 *(uint32_t*)&dst[28+ y*stride]= color4; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1821 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1822 }else if(b_w==16){ |
3018 | 1823 for(y=0; y < b_h; y++){ |
1824 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1825 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1826 *(uint32_t*)&dst[8 + y*stride]= color4; | |
1827 *(uint32_t*)&dst[12+ y*stride]= color4; | |
1828 } | |
1829 }else if(b_w==8){ | |
1830 for(y=0; y < b_h; y++){ | |
1831 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1832 *(uint32_t*)&dst[4 + y*stride]= color4; | |
1833 } | |
1834 }else if(b_w==4){ | |
1835 for(y=0; y < b_h; y++){ | |
1836 *(uint32_t*)&dst[0 + y*stride]= color4; | |
1837 } | |
1838 }else{ | |
1839 for(y=0; y < b_h; y++){ | |
1840 for(x=0; x < b_w; x++){ | |
1841 dst[x + y*stride]= color; | |
1842 } | |
2138 | 1843 } |
1844 } | |
1845 }else{ | |
3314 | 1846 uint8_t *src= s->last_picture[block->ref].data[plane_index]; |
2206 | 1847 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale; |
1848 int mx= block->mx*scale; | |
1849 int my= block->my*scale; | |
2223 | 1850 const int dx= mx&15; |
1851 const int dy= my&15; | |
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
1852 const int tab_index= 3 - (b_w>>2) + (b_w>>4); |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1853 sx += (mx>>4) - (HTAPS_MAX/2-1); |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1854 sy += (my>>4) - (HTAPS_MAX/2-1); |
2206 | 1855 src += sx + sy*stride; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1856 if( (unsigned)sx >= w - b_w - (HTAPS_MAX-2) |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1857 || (unsigned)sy >= h - b_h - (HTAPS_MAX-2)){ |
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
1858 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+HTAPS_MAX-1, b_h+HTAPS_MAX-1, sx, sy, w, h); |
2206 | 1859 src= tmp + MB_SIZE; |
2138 | 1860 } |
3189 | 1861 // assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h); |
1862 // assert(!(b_w&(b_w-1))); | |
3018 | 1863 assert(b_w>1 && b_h>1); |
6206
ea591bc7522a
add parenthesis, fix warning: snow.c:2413: warning: suggest parentheses around && within ||
bcoudurier
parents:
6205
diff
changeset
|
1864 assert((tab_index>=0 && tab_index<4) || b_w==32); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1865 if((dx&3) || (dy&3) || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h) || (b_w&(b_w-1)) || !s->plane[plane_index].fast_mc ) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1866 mc_block(&s->plane[plane_index], dst, src, tmp, stride, b_w, b_h, dx, dy); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1867 else if(b_w==32){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1868 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1869 for(y=0; y<b_h; y+=16){ |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1870 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1871 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1872 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1873 }else if(b_w==b_h) |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1874 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride); |
3018 | 1875 else if(b_w==2*b_h){ |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1876 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1877 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride); |
3018 | 1878 }else{ |
1879 assert(2*b_w==b_h); | |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1880 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
1881 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride); |
3018 | 1882 } |
2138 | 1883 } |
1884 } | |
1885 | |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1886 void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1887 int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1888 int y, x; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1889 IDWTELEM * dst; |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1890 for(y=0; y<b_h; y++){ |
5409 | 1891 //FIXME ugly misuse of obmc_stride |
4436
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1892 const uint8_t *obmc1= obmc + y*obmc_stride; |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1893 const uint8_t *obmc2= obmc1+ (obmc_stride>>1); |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1894 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); |
d3e389536b0a
Add the const specifier as needed to reduce the number of warnings.
takis
parents:
4409
diff
changeset
|
1895 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); |
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1896 dst = slice_buffer_get_line(sb, src_y + y); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1897 for(x=0; x<b_w; x++){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1898 int v= obmc1[x] * block[3][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1899 +obmc2[x] * block[2][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1900 +obmc3[x] * block[1][x + y*src_stride] |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1901 +obmc4[x] * block[0][x + y*src_stride]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1902 |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1903 v <<= 8 - LOG2_OBMC_MAX; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1904 if(FRAC_BITS != 8){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1905 v >>= 8 - FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1906 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1907 if(add){ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1908 v += dst[x + src_x]; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1909 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1910 if(v&(~255)) v= ~(v>>31); |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1911 dst8[x + y*src_stride] = v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1912 }else{ |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1913 dst[x + src_x] -= v; |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1914 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1915 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1916 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1917 } |
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1918 |
6412 | 1919 //FIXME name cleanup (b_w, block_w, b_width stuff) |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
1920 static av_always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer *sb, IDWTELEM *dst, uint8_t *dst8, const uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int offset_dst, int plane_index){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1921 const int b_width = s->b_width << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1922 const int b_height= s->b_height << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1923 const int b_stride= b_width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1924 BlockNode *lt= &s->block[b_x + b_y*b_stride]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1925 BlockNode *rt= lt+1; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1926 BlockNode *lb= lt+b_stride; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1927 BlockNode *rb= lb+1; |
2967 | 1928 uint8_t *block[4]; |
2842 | 1929 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride; |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
1930 uint8_t *tmp = s->scratchbuf; |
2842 | 1931 uint8_t *ptmp; |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1932 int x,y; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1933 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1934 if(b_x<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1935 lt= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1936 lb= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1937 }else if(b_x + 1 >= b_width){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1938 rt= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1939 rb= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1940 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1941 if(b_y<0){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1942 lt= lb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1943 rt= rb; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1944 }else if(b_y + 1 >= b_height){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1945 lb= lt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1946 rb= rt; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1947 } |
2967 | 1948 |
6412 | 1949 if(src_x<0){ //FIXME merge with prev & always round internal width up to *16 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1950 obmc -= src_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1951 b_w += src_x; |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1952 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1953 dst -= src_x; |
2206 | 1954 src_x=0; |
1955 }else if(src_x + b_w > w){ | |
1956 b_w = w - src_x; | |
1957 } | |
1958 if(src_y<0){ | |
1959 obmc -= src_y*obmc_stride; | |
1960 b_h += src_y; | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1961 if(!sliced && !offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1962 dst -= src_y*dst_stride; |
2206 | 1963 src_y=0; |
1964 }else if(src_y + b_h> h){ | |
1965 b_h = h - src_y; | |
1966 } | |
2967 | 1967 |
2206 | 1968 if(b_w<=0 || b_h<=0) return; |
1969 | |
6414 | 1970 assert(src_stride > 2*MB_SIZE + 5); |
1971 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
1972 if(!sliced && offset_dst) |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
1973 dst += src_x + src_y*dst_stride; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
1974 dst8+= src_x + src_y*src_stride; |
2206 | 1975 // src += src_x + src_y*src_stride; |
1976 | |
2842 | 1977 ptmp= tmp + 3*tmp_step; |
1978 block[0]= ptmp; | |
1979 ptmp+=tmp_step; | |
3314 | 1980 pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h); |
2206 | 1981 |
1982 if(same_block(lt, rt)){ | |
1983 block[1]= block[0]; | |
1984 }else{ | |
2842 | 1985 block[1]= ptmp; |
1986 ptmp+=tmp_step; | |
3314 | 1987 pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h); |
2206 | 1988 } |
2967 | 1989 |
2206 | 1990 if(same_block(lt, lb)){ |
1991 block[2]= block[0]; | |
1992 }else if(same_block(rt, lb)){ | |
1993 block[2]= block[1]; | |
1994 }else{ | |
2842 | 1995 block[2]= ptmp; |
1996 ptmp+=tmp_step; | |
3314 | 1997 pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h); |
2206 | 1998 } |
1999 | |
2000 if(same_block(lt, rb) ){ | |
2001 block[3]= block[0]; | |
2002 }else if(same_block(rt, rb)){ | |
2003 block[3]= block[1]; | |
2004 }else if(same_block(lb, rb)){ | |
2005 block[3]= block[2]; | |
2006 }else{ | |
2842 | 2007 block[3]= ptmp; |
3314 | 2008 pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h); |
2206 | 2009 } |
2010 #if 0 | |
2011 for(y=0; y<b_h; y++){ | |
2012 for(x=0; x<b_w; x++){ | |
2013 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX); | |
2014 if(add) dst[x + y*dst_stride] += v; | |
2015 else dst[x + y*dst_stride] -= v; | |
2016 } | |
2017 } | |
2018 for(y=0; y<b_h; y++){ | |
2019 uint8_t *obmc2= obmc + (obmc_stride>>1); | |
2020 for(x=0; x<b_w; x++){ | |
2021 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX); | |
2022 if(add) dst[x + y*dst_stride] += v; | |
2023 else dst[x + y*dst_stride] -= v; | |
2024 } | |
2025 } | |
2026 for(y=0; y<b_h; y++){ | |
2027 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2028 for(x=0; x<b_w; x++){ | |
2029 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX); | |
2030 if(add) dst[x + y*dst_stride] += v; | |
2031 else dst[x + y*dst_stride] -= v; | |
2032 } | |
2033 } | |
2034 for(y=0; y<b_h; y++){ | |
2035 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
2036 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2037 for(x=0; x<b_w; x++){ | |
2038 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX); | |
2039 if(add) dst[x + y*dst_stride] += v; | |
2040 else dst[x + y*dst_stride] -= v; | |
2041 } | |
2042 } | |
2043 #else | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2044 if(sliced){ |
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2045 s->dsp.inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8); |
6475 | 2046 }else{ |
2047 for(y=0; y<b_h; y++){ | |
2048 //FIXME ugly misuse of obmc_stride | |
2049 const uint8_t *obmc1= obmc + y*obmc_stride; | |
2050 const uint8_t *obmc2= obmc1+ (obmc_stride>>1); | |
2051 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); | |
2052 const uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
2053 for(x=0; x<b_w; x++){ | |
2054 int v= obmc1[x] * block[3][x + y*src_stride] | |
2055 +obmc2[x] * block[2][x + y*src_stride] | |
2056 +obmc3[x] * block[1][x + y*src_stride] | |
2057 +obmc4[x] * block[0][x + y*src_stride]; | |
2058 | |
2059 v <<= 8 - LOG2_OBMC_MAX; | |
2060 if(FRAC_BITS != 8){ | |
2061 v >>= 8 - FRAC_BITS; | |
2062 } | |
2063 if(add){ | |
2064 v += dst[x + y*dst_stride]; | |
2065 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; | |
2066 if(v&(~255)) v= ~(v>>31); | |
2067 dst8[x + y*src_stride] = v; | |
2068 }else{ | |
2069 dst[x + y*dst_stride] -= v; | |
2070 } | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2071 } |
2206 | 2072 } |
2073 } | |
5910 | 2074 #endif /* 0 */ |
2206 | 2075 } |
2076 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2077 static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, IDWTELEM * old_buffer, int plane_index, int add, int mb_y){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2078 Plane *p= &s->plane[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2079 const int mb_w= s->b_width << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2080 const int mb_h= s->b_height << s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2081 int x, y, mb_x; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2082 int block_size = MB_SIZE >> s->block_max_depth; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2083 int block_w = plane_index ? block_size/2 : block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2084 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2085 int obmc_stride= plane_index ? block_size : 2*block_size; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2086 int ref_stride= s->current_picture.linesize[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2087 uint8_t *dst8= s->current_picture.data[plane_index]; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2088 int w= p->width; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2089 int h= p->height; |
2967 | 2090 |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2091 if(s->keyframe || (s->avctx->debug&512)){ |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2092 if(mb_y==mb_h) |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2093 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2094 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2095 if(add){ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2096 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2097 // DWTELEM * line = slice_buffer_get_line(sb, y); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2098 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2099 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2100 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2101 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2102 v >>= FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2103 if(v&(~255)) v= ~(v>>31); |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2104 dst8[x + y*ref_stride]= v; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2105 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2106 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2107 }else{ |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2108 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2109 // DWTELEM * line = slice_buffer_get_line(sb, y); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2110 IDWTELEM * line = sb->line[y]; |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
2111 for(x=0; x<w; x++){ |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2112 line[x] -= 128 << FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2113 // buf[x + y*w]-= 128<<FRAC_BITS; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2114 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2115 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2116 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2117 |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2118 return; |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2119 } |
2967 | 2120 |
6475 | 2121 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2122 add_yblock(s, 1, sb, old_buffer, dst8, obmc, | |
2123 block_w*mb_x - block_w/2, | |
2124 block_w*mb_y - block_w/2, | |
2125 block_w, block_w, | |
2126 w, h, | |
2127 w, ref_stride, obmc_stride, | |
2128 mb_x - 1, mb_y - 1, | |
2129 add, 0, plane_index); | |
2130 } | |
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2131 } |
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2132 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2133 static av_always_inline void predict_slice(SnowContext *s, IDWTELEM *buf, int plane_index, int add, int mb_y){ |
2138 | 2134 Plane *p= &s->plane[plane_index]; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2135 const int mb_w= s->b_width << s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2136 const int mb_h= s->b_height << s->block_max_depth; |
2562 | 2137 int x, y, mb_x; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2138 int block_size = MB_SIZE >> s->block_max_depth; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2139 int block_w = plane_index ? block_size/2 : block_size; |
2206 | 2140 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2141 const int obmc_stride= plane_index ? block_size : 2*block_size; |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2142 int ref_stride= s->current_picture.linesize[plane_index]; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2143 uint8_t *dst8= s->current_picture.data[plane_index]; |
2138 | 2144 int w= p->width; |
2145 int h= p->height; | |
2967 | 2146 |
2206 | 2147 if(s->keyframe || (s->avctx->debug&512)){ |
2562 | 2148 if(mb_y==mb_h) |
2149 return; | |
2150 | |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2151 if(add){ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2152 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2153 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2154 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2155 v >>= FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2156 if(v&(~255)) v= ~(v>>31); |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2157 dst8[x + y*ref_stride]= v; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2158 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2159 } |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2160 }else{ |
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2161 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2162 for(x=0; x<w; x++){ |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2163 buf[x + y*w]-= 128<<FRAC_BITS; |
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2164 } |
2206 | 2165 } |
2138 | 2166 } |
2206 | 2167 |
2168 return; | |
2138 | 2169 } |
2967 | 2170 |
6414 | 2171 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
2172 add_yblock(s, 0, NULL, buf, dst8, obmc, | |
2173 block_w*mb_x - block_w/2, | |
2174 block_w*mb_y - block_w/2, | |
2175 block_w, block_w, | |
2176 w, h, | |
2177 w, ref_stride, obmc_stride, | |
2178 mb_x - 1, mb_y - 1, | |
2179 add, 1, plane_index); | |
2180 } | |
2562 | 2181 } |
2182 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
2183 static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add){ |
2562 | 2184 const int mb_h= s->b_height << s->block_max_depth; |
2185 int mb_y; | |
2186 for(mb_y=0; mb_y<=mb_h; mb_y++) | |
2187 predict_slice(s, buf, plane_index, add, mb_y); | |
2138 | 2188 } |
2189 | |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2190 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int start_y, int end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2191 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2192 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2193 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2194 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2195 int x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2196 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2197 if(s->qlog == LOSSLESS_QLOG) return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2198 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2199 for(y=start_y; y<end_y; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2200 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2201 IDWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2202 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2203 int i= line[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2204 if(i<0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2205 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2206 }else if(i>0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2207 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2208 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2209 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2210 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2211 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2212 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2213 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2214 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2215 int x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2216 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2217 IDWTELEM * line=0; // silence silly "could be used without having been initialized" warning |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2218 IDWTELEM * prev; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2219 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2220 if (start_y != 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2221 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2222 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2223 for(y=start_y; y<end_y; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2224 prev = line; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2225 // line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2226 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2227 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2228 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2229 if(use_median){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2230 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2231 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2232 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2233 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2234 else line[x] += line[x - 1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2235 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2236 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2237 if(y) line[x] += prev[x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2238 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2239 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2240 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2241 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2242 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2243 static void decode_qlogs(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2244 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2245 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2246 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2247 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2248 for(orientation=level ? 1:0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2249 int q; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2250 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2251 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2252 else q= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2253 s->plane[plane_index].band[level][orientation].qlog= q; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2254 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2255 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2256 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2257 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2258 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2259 #define GET_S(dst, check) \ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2260 tmp= get_symbol(&s->c, s->header_state, 0);\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2261 if(!(check)){\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2262 av_log(s->avctx, AV_LOG_ERROR, "Error " #dst " is %d\n", tmp);\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2263 return -1;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2264 }\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2265 dst= tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2266 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2267 static int decode_header(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2268 int plane_index, tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2269 uint8_t kstate[32]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2270 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2271 memset(kstate, MID_STATE, sizeof(kstate)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2272 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2273 s->keyframe= get_rac(&s->c, kstate); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2274 if(s->keyframe || s->always_reset){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2275 reset_contexts(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2276 s->spatial_decomposition_type= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2277 s->qlog= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2278 s->qbias= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2279 s->mv_scale= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2280 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2281 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2282 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2283 GET_S(s->version, tmp <= 0U) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2284 s->always_reset= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2285 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2286 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2287 GET_S(s->spatial_decomposition_count, 0 < tmp && tmp <= MAX_DECOMPOSITIONS) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2288 s->colorspace_type= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2289 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2290 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2291 s->spatial_scalability= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2292 // s->rate_scalability= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2293 GET_S(s->max_ref_frames, tmp < (unsigned)MAX_REF_FRAMES) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2294 s->max_ref_frames++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2295 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2296 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2297 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2298 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2299 if(!s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2300 if(get_rac(&s->c, s->header_state)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2301 for(plane_index=0; plane_index<2; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2302 int htaps, i, sum=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2303 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2304 p->diag_mc= get_rac(&s->c, s->header_state); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2305 htaps= get_symbol(&s->c, s->header_state, 0)*2 + 2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2306 if((unsigned)htaps > HTAPS_MAX || htaps==0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2307 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2308 p->htaps= htaps; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2309 for(i= htaps/2; i; i--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2310 p->hcoeff[i]= get_symbol(&s->c, s->header_state, 0) * (1-2*(i&1)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2311 sum += p->hcoeff[i]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2312 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2313 p->hcoeff[0]= 32-sum; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2314 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2315 s->plane[2].diag_mc= s->plane[1].diag_mc; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2316 s->plane[2].htaps = s->plane[1].htaps; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2317 memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2318 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2319 if(get_rac(&s->c, s->header_state)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2320 GET_S(s->spatial_decomposition_count, 0 < tmp && tmp <= MAX_DECOMPOSITIONS) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2321 decode_qlogs(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2322 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2323 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2324 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2325 s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2326 if(s->spatial_decomposition_type > 1U){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2327 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2328 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2329 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2330 if(FFMIN(s->avctx-> width>>s->chroma_h_shift, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2331 s->avctx->height>>s->chroma_v_shift) >> (s->spatial_decomposition_count-1) <= 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2332 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_count %d too large for size", s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2333 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2334 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2335 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2336 s->qlog += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2337 s->mv_scale += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2338 s->qbias += get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2339 s->block_max_depth+= get_symbol(&s->c, s->header_state, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2340 if(s->block_max_depth > 1 || s->block_max_depth < 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2341 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2342 s->block_max_depth= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2343 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2344 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2345 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2346 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2347 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2348 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2349 static void init_qexp(void){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2350 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2351 double v=128; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2352 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2353 for(i=0; i<QROOT; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2354 qexp[i]= lrintf(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2355 v *= pow(2, 1.0 / QROOT); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2356 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2357 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2358 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2359 static av_cold int common_init(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2360 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2361 int width, height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2362 int i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2363 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2364 s->avctx= avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2365 s->max_ref_frames=1; //just make sure its not an invalid value in case of no initial keyframe |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2366 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2367 dsputil_init(&s->dsp, avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2368 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2369 #define mcf(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2370 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2371 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2372 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2373 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2374 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2375 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2376 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2377 mcf( 0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2378 mcf( 4, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2379 mcf( 8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2380 mcf(12, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2381 mcf( 0, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2382 mcf( 4, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2383 mcf( 8, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2384 mcf(12, 4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2385 mcf( 0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2386 mcf( 4, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2387 mcf( 8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2388 mcf(12, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2389 mcf( 0,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2390 mcf( 4,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2391 mcf( 8,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2392 mcf(12,12) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2393 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2394 #define mcfh(dx,dy)\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2395 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2396 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2397 mc_block_hpel ## dx ## dy ## 16;\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2398 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2399 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2400 mc_block_hpel ## dx ## dy ## 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2401 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2402 mcfh(0, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2403 mcfh(8, 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2404 mcfh(0, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2405 mcfh(8, 8) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2406 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2407 if(!qexp[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2408 init_qexp(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2409 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2410 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2411 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2412 width= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2413 height= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2414 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2415 s->spatial_idwt_buffer= av_mallocz(width*height*sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2416 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM)); //FIXME this does not belong here |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2417 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2418 for(i=0; i<MAX_REF_FRAMES; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2419 for(j=0; j<MAX_REF_FRAMES; j++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2420 scale_mv_ref[i][j] = 256*(i+1)/(j+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2421 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2422 s->avctx->get_buffer(s->avctx, &s->mconly_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2423 s->scratchbuf = av_malloc(s->mconly_picture.linesize[0]*7*MB_SIZE); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2424 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2425 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2426 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2427 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2428 static int common_init_after_header(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2429 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2430 int plane_index, level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2431 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2432 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2433 int w= s->avctx->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2434 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2435 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2436 if(plane_index){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2437 w>>= s->chroma_h_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2438 h>>= s->chroma_v_shift; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2439 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2440 s->plane[plane_index].width = w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2441 s->plane[plane_index].height= h; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2442 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2443 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2444 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2445 SubBand *b= &s->plane[plane_index].band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2446 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2447 b->buf= s->spatial_dwt_buffer; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2448 b->level= level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2449 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2450 b->width = (w + !(orientation&1))>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2451 b->height= (h + !(orientation>1))>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2452 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2453 b->stride_line = 1 << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2454 b->buf_x_offset = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2455 b->buf_y_offset = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2456 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2457 if(orientation&1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2458 b->buf += (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2459 b->buf_x_offset = (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2460 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2461 if(orientation>1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2462 b->buf += b->stride>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2463 b->buf_y_offset = b->stride_line >> 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2464 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2465 b->ibuf= s->spatial_idwt_buffer + (b->buf - s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2466 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2467 if(level) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2468 b->parent= &s->plane[plane_index].band[level-1][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2469 //FIXME avoid this realloc |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2470 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2471 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2472 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2473 w= (w+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2474 h= (h+1)>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2475 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2476 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2477 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2478 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2479 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2480 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2481 #define QUANTIZE2 0 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2482 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2483 #if QUANTIZE2==1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2484 #define Q2_STEP 8 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2485 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2486 static void find_sse(SnowContext *s, Plane *p, int *score, int score_stride, IDWTELEM *r0, IDWTELEM *r1, int level, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2487 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2488 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2489 int xo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2490 int yo=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2491 int step= 1 << (s->spatial_decomposition_count - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2492 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2493 if(orientation&1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2494 xo= step>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2495 if(orientation&2) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2496 yo= step>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2497 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2498 //FIXME bias for nonzero ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2499 //FIXME optimize |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2500 memset(score, 0, sizeof(*score)*score_stride*((p->height + Q2_STEP-1)/Q2_STEP)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2501 for(y=0; y<p->height; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2502 for(x=0; x<p->width; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2503 int sx= (x-xo + step/2) / step / Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2504 int sy= (y-yo + step/2) / step / Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2505 int v= r0[x + y*p->width] - r1[x + y*p->width]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2506 assert(sx>=0 && sy>=0 && sx < score_stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2507 v= ((v+8)>>4)<<4; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2508 score[sx + sy*score_stride] += v*v; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2509 assert(score[sx + sy*score_stride] >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2510 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2511 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2512 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2513 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2514 static void dequantize_all(SnowContext *s, Plane *p, IDWTELEM *buffer, int width, int height){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2515 int level, orientation; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2516 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2517 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2518 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2519 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2520 IDWTELEM *dst= buffer + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2521 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2522 dequantize(s, b, dst, b->stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2523 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2524 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2525 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2526 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2527 static void dwt_quantize(SnowContext *s, Plane *p, DWTELEM *buffer, int width, int height, int stride, int type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2528 int level, orientation, ys, xs, x, y, pass; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2529 IDWTELEM best_dequant[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2530 IDWTELEM idwt2_buffer[height * stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2531 const int score_stride= (width + 10)/Q2_STEP; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2532 int best_score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2533 int score[(width + 10)/Q2_STEP * (height + 10)/Q2_STEP]; //FIXME size |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2534 int threshold= (s->m.lambda * s->m.lambda) >> 6; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2535 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2536 //FIXME pass the copy cleanly ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2537 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2538 // memcpy(dwt_buffer, buffer, height * stride * sizeof(DWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2539 ff_spatial_dwt(buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2540 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2541 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2542 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2543 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2544 IDWTELEM *dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2545 DWTELEM *src= buffer + (b-> buf - s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2546 assert(src == b->buf); // code does not depend on this but it is true currently |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2547 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2548 quantize(s, b, dst, src, b->stride, s->qbias); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2549 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2550 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2551 for(pass=0; pass<1; pass++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2552 if(s->qbias == 0) //keyframe |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2553 continue; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2554 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2555 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2556 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2557 IDWTELEM *dst= idwt2_buffer + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2558 IDWTELEM *best_dst= best_dequant + (b->ibuf - s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2559 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2560 for(ys= 0; ys<Q2_STEP; ys++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2561 for(xs= 0; xs<Q2_STEP; xs++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2562 memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2563 dequantize_all(s, p, idwt2_buffer, width, height); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2564 ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2565 find_sse(s, p, best_score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2566 memcpy(idwt2_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2567 for(y=ys; y<b->height; y+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2568 for(x=xs; x<b->width; x+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2569 if(dst[x + y*b->stride]<0) dst[x + y*b->stride]++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2570 if(dst[x + y*b->stride]>0) dst[x + y*b->stride]--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2571 //FIXME try more than just -- |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2572 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2573 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2574 dequantize_all(s, p, idwt2_buffer, width, height); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2575 ff_spatial_idwt(idwt2_buffer, width, height, stride, type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2576 find_sse(s, p, score, score_stride, idwt2_buffer, s->spatial_idwt_buffer, level, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2577 for(y=ys; y<b->height; y+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2578 for(x=xs; x<b->width; x+= Q2_STEP){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2579 int score_idx= x/Q2_STEP + (y/Q2_STEP)*score_stride; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2580 if(score[score_idx] <= best_score[score_idx] + threshold){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2581 best_score[score_idx]= score[score_idx]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2582 if(best_dst[x + y*b->stride]<0) best_dst[x + y*b->stride]++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2583 if(best_dst[x + y*b->stride]>0) best_dst[x + y*b->stride]--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2584 //FIXME copy instead |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2585 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2586 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2587 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2588 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2589 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2590 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2591 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2592 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2593 memcpy(s->spatial_idwt_buffer, best_dequant, height * stride * sizeof(IDWTELEM)); //FIXME work with that directly instead of copy at the end |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2594 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2595 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2596 #endif /* QUANTIZE2==1 */ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2597 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2598 #define USE_HALFPEL_PLANE 0 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2599 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2600 static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame *frame){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2601 int p,x,y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2602 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2603 assert(!(s->avctx->flags & CODEC_FLAG_EMU_EDGE)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2604 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2605 for(p=0; p<3; p++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2606 int is_chroma= !!p; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2607 int w= s->avctx->width >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2608 int h= s->avctx->height >>is_chroma; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2609 int ls= frame->linesize[p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2610 uint8_t *src= frame->data[p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2611 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2612 halfpel[1][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2613 halfpel[2][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2614 halfpel[3][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) + EDGE_WIDTH*(1+ls); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2615 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2616 halfpel[0][p]= src; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2617 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2618 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2619 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2620 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2621 halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] + src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2622 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2623 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2624 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2625 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2626 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2627 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2628 halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2629 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2630 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2631 src= halfpel[1][p]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2632 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2633 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2634 int i= y*ls + x; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2635 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2636 halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2637 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2638 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2639 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2640 //FIXME border! |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2641 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2642 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2643 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2644 static void release_buffer(AVCodecContext *avctx){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2645 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2646 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2647 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2648 if(s->last_picture[s->max_ref_frames-1].data[0]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2649 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2650 for(i=0; i<9; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2651 if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2652 av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] - EDGE_WIDTH*(1+s->current_picture.linesize[i%3])); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2653 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2654 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2655 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2656 static int frame_start(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2657 AVFrame tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2658 int w= s->avctx->width; //FIXME round up to x16 ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2659 int h= s->avctx->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2660 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2661 if(s->current_picture.data[0]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2662 s->dsp.draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH ); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2663 s->dsp.draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2664 s->dsp.draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2665 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2666 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2667 release_buffer(s->avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2668 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2669 tmp= s->last_picture[s->max_ref_frames-1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2670 memmove(s->last_picture+1, s->last_picture, (s->max_ref_frames-1)*sizeof(AVFrame)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2671 memmove(s->halfpel_plane+1, s->halfpel_plane, (s->max_ref_frames-1)*sizeof(void*)*4*4); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2672 if(USE_HALFPEL_PLANE && s->current_picture.data[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2673 halfpel_interpol(s, s->halfpel_plane[0], &s->current_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2674 s->last_picture[0]= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2675 s->current_picture= tmp; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2676 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2677 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2678 s->ref_frames= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2679 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2680 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2681 for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2682 if(i && s->last_picture[i-1].key_frame) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2683 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2684 s->ref_frames= i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2685 if(s->ref_frames==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2686 av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2687 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2688 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2689 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2690 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2691 s->current_picture.reference= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2692 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2693 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2694 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2695 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2696 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2697 s->current_picture.key_frame= s->keyframe; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2698 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2699 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2700 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2701 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2702 static av_cold void common_end(SnowContext *s){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2703 int plane_index, level, orientation, i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2704 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2705 av_freep(&s->spatial_dwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2706 av_freep(&s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2707 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2708 s->m.me.temp= NULL; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2709 av_freep(&s->m.me.scratchpad); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2710 av_freep(&s->m.me.map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2711 av_freep(&s->m.me.score_map); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2712 av_freep(&s->m.obmc_scratchpad); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2713 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2714 av_freep(&s->block); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2715 av_freep(&s->scratchbuf); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2716 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2717 for(i=0; i<MAX_REF_FRAMES; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2718 av_freep(&s->ref_mvs[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2719 av_freep(&s->ref_scores[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2720 if(s->last_picture[i].data[0]) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2721 s->avctx->release_buffer(s->avctx, &s->last_picture[i]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2722 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2723 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2724 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2725 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2726 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2727 SubBand *b= &s->plane[plane_index].band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2728 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2729 av_freep(&b->x_coeff); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2730 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2731 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2732 } |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2733 if (s->mconly_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2734 s->avctx->release_buffer(s->avctx, &s->mconly_picture); |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2735 if (s->current_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
2736 s->avctx->release_buffer(s->avctx, &s->current_picture); |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2737 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2738 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2739 static av_cold int decode_init(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2740 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2741 avctx->pix_fmt= PIX_FMT_YUV420P; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2742 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2743 common_init(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2744 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2745 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2746 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2747 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2748 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2749 const uint8_t *buf = avpkt->data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2750 int buf_size = avpkt->size; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2751 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2752 RangeCoder * const c= &s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2753 int bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2754 AVFrame *picture = data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2755 int level, orientation, plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2756 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2757 ff_init_range_decoder(c, buf, buf_size); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2758 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2759 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2760 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2761 if(decode_header(s)<0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2762 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2763 common_init_after_header(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2764 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2765 // realloc slice buffer for the case that spatial_decomposition_count changed |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2766 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2767 slice_buffer_init(&s->sb, s->plane[0].height, (MB_SIZE >> s->block_max_depth) + s->spatial_decomposition_count * 8 + 1, s->plane[0].width, s->spatial_idwt_buffer); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2768 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2769 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2770 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2771 p->fast_mc= p->diag_mc && p->htaps==6 && p->hcoeff[0]==40 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2772 && p->hcoeff[1]==-10 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2773 && p->hcoeff[2]==2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2774 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2775 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2776 alloc_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2777 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2778 if(frame_start(s) < 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2779 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2780 //keyframe flag duplication mess FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2781 if(avctx->debug&FF_DEBUG_PICT_INFO) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2782 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2783 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2784 decode_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2785 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2786 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2787 Plane *p= &s->plane[plane_index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2788 int w= p->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2789 int h= p->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2790 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2791 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2792 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2793 if(s->avctx->debug&2048){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2794 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2795 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2796 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2797 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2798 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2799 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2800 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2801 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2802 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2803 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2804 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2805 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2806 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2807 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2808 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2809 unpack_coeffs(s, b, b->parent, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2810 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2811 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2812 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2813 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2814 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2815 const int mb_h= s->b_height << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2816 const int block_size = MB_SIZE >> s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2817 const int block_w = plane_index ? block_size/2 : block_size; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2818 int mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2819 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2820 int yd=0, yq=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2821 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2822 int end_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2823 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2824 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2825 for(mb_y=0; mb_y<=mb_h; mb_y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2826 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2827 int slice_starty = block_w*mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2828 int slice_h = block_w*(mb_y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2829 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2830 slice_starty = FFMAX(0, slice_starty - (block_w >> 1)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2831 slice_h -= (block_w >> 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2832 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2833 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2834 for(level=0; level<s->spatial_decomposition_count; level++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2835 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2836 SubBand *b= &p->band[level][orientation]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2837 int start_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2838 int end_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2839 int our_mb_start = mb_y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2840 int our_mb_end = (mb_y + 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2841 const int extra= 3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2842 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra: 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2843 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2844 if (!(s->keyframe || s->avctx->debug&512)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2845 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2846 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2847 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2848 start_y = FFMIN(b->height, start_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2849 end_y = FFMIN(b->height, end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2850 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2851 if (start_y != end_y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2852 if (orientation == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2853 SubBand * correlate_band = &p->band[0][0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2854 int correlate_end_y = FFMIN(b->height, end_y + 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2855 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2856 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2857 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2858 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->ibuf, correlate_band->stride, start_y, end_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2859 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2860 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2861 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2862 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2863 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2864 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2865 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2866 for(; yd<slice_h; yd+=4){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2867 ff_spatial_idwt_buffered_slice(&s->dsp, cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2868 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2869 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2870 if(s->qlog == LOSSLESS_QLOG){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2871 for(; yq<slice_h && yq<h; yq++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2872 IDWTELEM * line = slice_buffer_get_line(&s->sb, yq); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2873 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2874 line[x] <<= FRAC_BITS; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2875 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2876 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2877 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2878 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2879 predict_slice_buffered(s, &s->sb, s->spatial_idwt_buffer, plane_index, 1, mb_y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2880 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2881 y = FFMIN(p->height, slice_starty); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2882 end_y = FFMIN(p->height, slice_h); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2883 while(y < end_y) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2884 slice_buffer_release(&s->sb, y++); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2885 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2886 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2887 slice_buffer_flush(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2888 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2889 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2890 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2891 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2892 emms_c(); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2893 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2894 release_buffer(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2895 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2896 if(!(s->avctx->debug&2048)) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2897 *picture= s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2898 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2899 *picture= s->mconly_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2900 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2901 *data_size = sizeof(AVFrame); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2902 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2903 bytes_read= c->bytestream - c->bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2904 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2905 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2906 return bytes_read; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2907 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2908 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2909 static av_cold int decode_end(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2910 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2911 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2912 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2913 slice_buffer_destroy(&s->sb); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2914 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2915 common_end(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2916 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2917 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2918 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2919 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2920 AVCodec snow_decoder = { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2921 "snow", |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2922 CODEC_TYPE_VIDEO, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2923 CODEC_ID_SNOW, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2924 sizeof(SnowContext), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2925 decode_init, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2926 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2927 decode_end, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2928 decode_frame, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2929 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2930 NULL, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2931 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2932 }; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2933 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2934 #if CONFIG_SNOW_ENCODER |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2935 static av_cold int encode_init(AVCodecContext *avctx) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2936 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2937 SnowContext *s = avctx->priv_data; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2938 int plane_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2939 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2940 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2941 av_log(avctx, AV_LOG_ERROR, "This codec is under development, files encoded with it may not be decodable with future versions!!!\n" |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2942 "Use vstrict=-2 / -strict -2 to use it anyway.\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2943 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2944 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2945 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2946 if(avctx->prediction_method == DWT_97 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2947 && (avctx->flags & CODEC_FLAG_QSCALE) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2948 && avctx->global_quality == 0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2949 av_log(avctx, AV_LOG_ERROR, "The 9/7 wavelet is incompatible with lossless mode.\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2950 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2951 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2952 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2953 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2954 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2955 s->mv_scale = (avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2956 s->block_max_depth= (avctx->flags & CODEC_FLAG_4MV ) ? 1 : 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2957 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2958 for(plane_index=0; plane_index<3; plane_index++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2959 s->plane[plane_index].diag_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2960 s->plane[plane_index].htaps= 6; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2961 s->plane[plane_index].hcoeff[0]= 40; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2962 s->plane[plane_index].hcoeff[1]= -10; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2963 s->plane[plane_index].hcoeff[2]= 2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2964 s->plane[plane_index].fast_mc= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2965 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2966 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2967 common_init(avctx); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2968 alloc_blocks(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2969 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2970 s->version=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2971 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2972 s->m.avctx = avctx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2973 s->m.flags = avctx->flags; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2974 s->m.bit_rate= avctx->bit_rate; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2975 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2976 s->m.me.temp = |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2977 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2978 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2979 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2980 s->m.obmc_scratchpad= av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2981 h263_encode_init(&s->m); //mv_penalty |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2982 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2983 s->max_ref_frames = FFMAX(FFMIN(avctx->refs, MAX_REF_FRAMES), 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2984 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2985 if(avctx->flags&CODEC_FLAG_PASS1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2986 if(!avctx->stats_out) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2987 avctx->stats_out = av_mallocz(256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2988 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2989 if((avctx->flags&CODEC_FLAG_PASS2) || !(avctx->flags&CODEC_FLAG_QSCALE)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2990 if(ff_rate_control_init(&s->m) < 0) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2991 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2992 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2993 s->pass1_rc= !(avctx->flags & (CODEC_FLAG_QSCALE|CODEC_FLAG_PASS2)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2994 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2995 avctx->coded_frame= &s->current_picture; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2996 switch(avctx->pix_fmt){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2997 // case PIX_FMT_YUV444P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2998 // case PIX_FMT_YUV422P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
2999 case PIX_FMT_YUV420P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3000 case PIX_FMT_GRAY8: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3001 // case PIX_FMT_YUV411P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3002 // case PIX_FMT_YUV410P: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3003 s->colorspace_type= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3004 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3005 /* case PIX_FMT_RGB32: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3006 s->colorspace= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3007 break;*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3008 default: |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3009 av_log(avctx, AV_LOG_ERROR, "pixel format not supported\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3010 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3011 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3012 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3013 s->chroma_h_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3014 s->chroma_v_shift= 1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3015 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3016 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3017 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3018 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3019 s->avctx->get_buffer(s->avctx, &s->input_picture); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3020 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3021 if(s->avctx->me_method == ME_ITER){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3022 int i; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3023 int size= s->b_width * s->b_height << 2*s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3024 for(i=0; i<s->max_ref_frames; i++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3025 s->ref_mvs[i]= av_mallocz(size*sizeof(int16_t[2])); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3026 s->ref_scores[i]= av_mallocz(size*sizeof(uint32_t)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3027 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3028 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3029 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3030 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3031 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3032 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3033 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3034 static int pix_sum(uint8_t * pix, int line_size, int w) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3035 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3036 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3037 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3038 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3039 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3040 for (j = 0; j < w; j++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3041 s += pix[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3042 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3043 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3044 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3045 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3046 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3047 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3048 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3049 //near copy & paste from dsputil, FIXME |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3050 static int pix_norm1(uint8_t * pix, int line_size, int w) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3051 { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3052 int s, i, j; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3053 uint32_t *sq = ff_squareTbl + 256; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3054 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3055 s = 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3056 for (i = 0; i < w; i++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3057 for (j = 0; j < w; j ++) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3058 s += sq[pix[0]]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3059 pix ++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3060 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3061 pix += line_size - w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3062 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3063 return s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3064 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3065 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3066 //FIXME copy&paste |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3067 #define P_LEFT P[1] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3068 #define P_TOP P[2] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3069 #define P_TOPRIGHT P[3] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3070 #define P_MEDIAN P[4] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3071 #define P_MV1 P[9] |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3072 #define FLAG_QPEL 1 //must be 1 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3073 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3074 static int encode_q_branch(SnowContext *s, int level, int x, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3075 uint8_t p_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3076 uint8_t i_buffer[1024]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3077 uint8_t p_state[sizeof(s->block_state)]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3078 uint8_t i_state[sizeof(s->block_state)]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3079 RangeCoder pc, ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3080 uint8_t *pbbak= s->c.bytestream; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3081 uint8_t *pbbak_start= s->c.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3082 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3083 const int w= s->b_width << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3084 const int h= s->b_height << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3085 const int rem_depth= s->block_max_depth - level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3086 const int index= (x + y*w) << rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3087 const int block_w= 1<<(LOG2_MB_SIZE - level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3088 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3089 int try= (y+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3090 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3091 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3092 const BlockNode *right = trx<w ? &s->block[index+1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3093 const BlockNode *bottom= try<h ? &s->block[index+w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3094 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3095 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3096 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3097 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3098 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3099 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3100 int mx=0, my=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3101 int l,cr,cb; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3102 const int stride= s->current_picture.linesize[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3103 const int uvstride= s->current_picture.linesize[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3104 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3105 s->input_picture.data[1] + (x + y*uvstride)*block_w/2, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3106 s->input_picture.data[2] + (x + y*uvstride)*block_w/2}; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3107 int P[10][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3108 int16_t last_mv[3][2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3109 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3110 const int shift= 1+qpel; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3111 MotionEstContext *c= &s->m.me; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3112 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3113 int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3114 int my_context= av_log2(2*FFABS(left->my - top->my)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3115 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3116 int ref, best_ref, ref_score, ref_mx, ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3117 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3118 assert(sizeof(s->block_state) >= 256); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3119 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3120 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3121 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3122 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3123 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3124 // clip predictors / edge ? |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3125 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3126 P_LEFT[0]= left->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3127 P_LEFT[1]= left->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3128 P_TOP [0]= top->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3129 P_TOP [1]= top->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3130 P_TOPRIGHT[0]= tr->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3131 P_TOPRIGHT[1]= tr->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3132 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3133 last_mv[0][0]= s->block[index].mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3134 last_mv[0][1]= s->block[index].my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3135 last_mv[1][0]= right->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3136 last_mv[1][1]= right->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3137 last_mv[2][0]= bottom->mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3138 last_mv[2][1]= bottom->my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3139 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3140 s->m.mb_stride=2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3141 s->m.mb_x= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3142 s->m.mb_y= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3143 c->skip= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3144 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3145 assert(c-> stride == stride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3146 assert(c->uvstride == uvstride); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3147 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3148 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3149 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3150 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3151 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3152 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3153 c->xmin = - x*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3154 c->ymin = - y*block_w - 16+3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3155 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3156 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-3; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3157 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3158 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3159 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3160 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3161 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3162 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3163 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3164 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3165 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3166 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3167 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3168 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3169 if (!y) { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3170 c->pred_x= P_LEFT[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3171 c->pred_y= P_LEFT[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3172 } else { |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3173 c->pred_x = P_MEDIAN[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3174 c->pred_y = P_MEDIAN[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3175 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3176 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3177 score= INT_MAX; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3178 best_ref= 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3179 for(ref=0; ref<s->ref_frames; ref++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3180 init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3181 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3182 ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv, |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3183 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3184 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3185 assert(ref_mx >= c->xmin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3186 assert(ref_mx <= c->xmax); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3187 assert(ref_my >= c->ymin); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3188 assert(ref_my <= c->ymax); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3189 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3190 ref_score= c->sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3191 ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3192 ref_score+= 2*av_log2(2*ref)*c->penalty_factor; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3193 if(s->ref_mvs[ref]){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3194 s->ref_mvs[ref][index][0]= ref_mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3195 s->ref_mvs[ref][index][1]= ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3196 s->ref_scores[ref][index]= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3197 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3198 if(score > ref_score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3199 score= ref_score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3200 best_ref= ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3201 mx= ref_mx; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3202 my= ref_my; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3203 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3204 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3205 //FIXME if mb_cmp != SSE then intra cannot be compared currently and mb_penalty vs. lambda2 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3206 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3207 // subpel search |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3208 base_bits= get_rac_count(&s->c) - 8*(s->c.bytestream - s->c.bytestream_start); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3209 pc= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3210 pc.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3211 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3212 memcpy(p_state, s->block_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3213 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3214 if(level!=s->block_max_depth) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3215 put_rac(&pc, &p_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3216 put_rac(&pc, &p_state[1 + left->type + top->type], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3217 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3218 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3219 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3220 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3221 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3222 p_len= pc.bytestream - pc.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3223 score += (s->lambda2*(get_rac_count(&pc)-base_bits))>>FF_LAMBDA_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3224 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3225 block_s= block_w*block_w; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3226 sum = pix_sum(current_data[0], stride, block_w); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3227 l= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3228 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3229 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3230 block_s= block_w*block_w>>2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3231 sum = pix_sum(current_data[1], uvstride, block_w>>1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3232 cb= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3233 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3234 sum = pix_sum(current_data[2], uvstride, block_w>>1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3235 cr= (sum + block_s/2)/block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3236 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3237 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3238 ic= s->c; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3239 ic.bytestream_start= |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3240 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3241 memcpy(i_state, s->block_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3242 if(level!=s->block_max_depth) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3243 put_rac(&ic, &i_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3244 put_rac(&ic, &i_state[1 + left->type + top->type], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3245 put_symbol(&ic, &i_state[32], l-pl , 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3246 put_symbol(&ic, &i_state[64], cb-pcb, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3247 put_symbol(&ic, &i_state[96], cr-pcr, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3248 i_len= ic.bytestream - ic.bytestream_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3249 iscore += (s->lambda2*(get_rac_count(&ic)-base_bits))>>FF_LAMBDA_SHIFT; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3250 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3251 // assert(score==256*256*256*64-1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3252 assert(iscore < 255*255*256 + s->lambda2*10); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3253 assert(iscore >= 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3254 assert(l>=0 && l<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3255 assert(pl>=0 && pl<=255); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3256 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3257 if(level==0){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3258 int varc= iscore >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3259 int vard= score >> 8; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3260 if (vard <= 64 || vard < varc) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3261 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3262 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3263 c->scene_change_score+= s->m.qscale; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3264 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3265 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3266 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3267 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3268 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3269 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3270 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3271 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3272 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3273 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3274 if(score2 < score && score2 < iscore) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3275 return score2; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3276 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3277 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3278 if(iscore < score){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3279 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3280 memcpy(pbbak, i_buffer, i_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3281 s->c= ic; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3282 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3283 s->c.bytestream= pbbak + i_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3284 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3285 memcpy(s->block_state, i_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3286 return iscore; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3287 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3288 memcpy(pbbak, p_buffer, p_len); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3289 s->c= pc; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3290 s->c.bytestream_start= pbbak_start; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3291 s->c.bytestream= pbbak + p_len; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3292 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3293 memcpy(s->block_state, p_state, sizeof(s->block_state)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3294 return score; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3295 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3296 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3297 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3298 static void encode_q_branch2(SnowContext *s, int level, int x, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3299 const int w= s->b_width << s->block_max_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3300 const int rem_depth= s->block_max_depth - level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3301 const int index= (x + y*w) << rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3302 int trx= (x+1)<<rem_depth; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3303 BlockNode *b= &s->block[index]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3304 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3305 const BlockNode *top = y ? &s->block[index-w] : &null_block; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3306 const BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3307 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3308 int pl = left->color[0]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3309 int pcb= left->color[1]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3310 int pcr= left->color[2]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3311 int pmx, pmy; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3312 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3313 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3314 int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3315 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3316 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3317 if(s->keyframe){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3318 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3319 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3320 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3321 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3322 if(level!=s->block_max_depth){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3323 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3324 put_rac(&s->c, &s->block_state[4 + s_context], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3325 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3326 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3327 encode_q_branch2(s, level+1, 2*x+0, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3328 encode_q_branch2(s, level+1, 2*x+1, 2*y+0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3329 encode_q_branch2(s, level+1, 2*x+0, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3330 encode_q_branch2(s, level+1, 2*x+1, 2*y+1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3331 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3332 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3333 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3334 if(b->type & BLOCK_INTRA){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3335 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3336 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3337 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3338 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3339 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3340 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3341 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3342 pred_mv(s, &pmx, &pmy, b->ref, left, top, tr); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3343 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3344 if(s->ref_frames > 1) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3345 put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3346 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3347 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3348 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3349 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3350 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3351 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3352 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3353 int i, x2, y2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3354 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3355 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3356 const int block_w = plane_index ? block_size/2 : block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3357 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3358 const int obmc_stride= plane_index ? block_size : 2*block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3359 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3360 uint8_t *src= s-> input_picture.data[plane_index]; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3361 IDWTELEM *dst= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; //FIXME change to unsigned |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3362 const int b_stride = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3363 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3364 const int h= p->height; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3365 int index= mb_x + mb_y*b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3366 BlockNode *b= &s->block[index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3367 BlockNode backup= *b; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3368 int ab=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3369 int aa=0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3370 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3371 b->type|= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3372 b->color[plane_index]= 0; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3373 memset(dst, 0, obmc_stride*obmc_stride*sizeof(IDWTELEM)); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3374 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3375 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3376 int mb_x2= mb_x + (i &1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3377 int mb_y2= mb_y + (i>>1) - 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3378 int x= block_w*mb_x2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3379 int y= block_w*mb_y2 + block_w/2; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3380 |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3381 add_yblock(s, 0, NULL, dst + ((i&1)+(i>>1)*obmc_stride)*block_w, NULL, obmc, |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3382 x, y, block_w, block_w, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3383 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3384 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3385 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3386 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3387 int obmc_v= obmc[index]; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3388 int d; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3389 if(y<0) obmc_v += obmc[index + block_w*obmc_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3390 if(x<0) obmc_v += obmc[index + block_w]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3391 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3392 if(x+block_w>w) obmc_v += obmc[index - block_w]; |
6412 | 3393 //FIXME precalculate this or simplify it somehow else |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3394 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3395 d = -dst[index] + (1<<(FRAC_BITS-1)); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3396 dst[index] = d; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3397 ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v; |
6412 | 3398 aa += obmc_v * obmc_v; //FIXME precalculate this |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3399 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3400 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3401 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3402 *b= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3403 |
5127 | 3404 return av_clip(((ab<<LOG2_OBMC_MAX) + aa/2)/aa, 0, 255); //FIXME we should not need clipping |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3405 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3406 |
3051 | 3407 static inline int get_block_bits(SnowContext *s, int x, int y, int w){ |
3408 const int b_stride = s->b_width << s->block_max_depth; | |
3409 const int b_height = s->b_height<< s->block_max_depth; | |
3410 int index= x + y*b_stride; | |
4408
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3411 const BlockNode *b = &s->block[index]; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3412 const BlockNode *left = x ? &s->block[index-1] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3413 const BlockNode *top = y ? &s->block[index-b_stride] : &null_block; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3414 const BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left; |
c3be13eac2d6
Bring down the number of snow.c warnings from 27 to 17 by using the const
takis
parents:
4407
diff
changeset
|
3415 const BlockNode *tr = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl; |
3051 | 3416 int dmx, dmy; |
4001 | 3417 // int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
3418 // int my_context= av_log2(2*FFABS(left->my - top->my)); | |
3051 | 3419 |
3420 if(x<0 || x>=b_stride || y>=b_height) | |
3421 return 0; | |
3422 /* | |
3423 1 0 0 | |
3424 01X 1-2 1 | |
3425 001XX 3-6 2-3 | |
3426 0001XXX 7-14 4-7 | |
3427 00001XXXX 15-30 8-15 | |
3428 */ | |
3429 //FIXME try accurate rate | |
6412 | 3430 //FIXME intra and inter predictors if surrounding blocks are not the same type |
3051 | 3431 if(b->type & BLOCK_INTRA){ |
4001 | 3432 return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0])) |
3433 + av_log2(2*FFABS(left->color[1] - b->color[1])) | |
3434 + av_log2(2*FFABS(left->color[2] - b->color[2]))); | |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3435 }else{ |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3436 pred_mv(s, &dmx, &dmy, b->ref, left, top, tr); |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3437 dmx-= b->mx; |
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3438 dmy-= b->my; |
4001 | 3439 return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda |
3440 + av_log2(2*FFABS(dmy)) | |
3314 | 3441 + av_log2(2*b->ref)); |
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3442 } |
3051 | 3443 } |
3444 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3445 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, const uint8_t *obmc_edged){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3446 Plane *p= &s->plane[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3447 const int block_size = MB_SIZE >> s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3448 const int block_w = plane_index ? block_size/2 : block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3449 const int obmc_stride= plane_index ? block_size : 2*block_size; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3450 const int ref_stride= s->current_picture.linesize[plane_index]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3451 uint8_t *dst= s->current_picture.data[plane_index]; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3452 uint8_t *src= s-> input_picture.data[plane_index]; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3453 IDWTELEM *pred= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; |
8214
c5276ad92ff8
snow: move scratch buffer from stack to malloced buffer in context
mru
parents:
7622
diff
changeset
|
3454 uint8_t *cur = s->scratchbuf; |
5652
941e5deeb2a4
rename HTAPS -> HTAPS_MAX (later is correct after the previous change)
michael
parents:
5651
diff
changeset
|
3455 uint8_t tmp[ref_stride*(2*MB_SIZE+HTAPS_MAX-1)]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3456 const int b_stride = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3457 const int b_height = s->b_height<< s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3458 const int w= p->width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3459 const int h= p->height; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3460 int distortion; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3461 int rate= 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3462 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3463 int sx= block_w*mb_x - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3464 int sy= block_w*mb_y - block_w/2; |
3206 | 3465 int x0= FFMAX(0,-sx); |
3466 int y0= FFMAX(0,-sy); | |
3467 int x1= FFMIN(block_w*2, w-sx); | |
3468 int y1= FFMIN(block_w*2, h-sy); | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3469 int i,x,y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3470 |
3314 | 3471 pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_w*2, &s->block[mb_x + mb_y*b_stride], plane_index, w, h); |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3472 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3473 for(y=y0; y<y1; y++){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3474 const uint8_t *obmc1= obmc_edged + y*obmc_stride; |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3475 const IDWTELEM *pred1 = pred + y*obmc_stride; |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3476 uint8_t *cur1 = cur + y*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3477 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3478 for(x=x0; x<x1; x++){ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3479 #if FRAC_BITS >= LOG2_OBMC_MAX |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3480 int v = (cur1[x] * obmc1[x]) << (FRAC_BITS - LOG2_OBMC_MAX); |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3481 #else |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3482 int v = (cur1[x] * obmc1[x] + (1<<(LOG2_OBMC_MAX - FRAC_BITS-1))) >> (LOG2_OBMC_MAX - FRAC_BITS); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
3483 #endif |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3484 v = (v + pred1[x]) >> FRAC_BITS; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3485 if(v&(~255)) v= ~(v>>31); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3486 dst1[x] = v; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3487 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3488 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3489 |
3206 | 3490 /* copy the regions where obmc[] = (uint8_t)256 */ |
3491 if(LOG2_OBMC_MAX == 8 | |
3492 && (mb_x == 0 || mb_x == b_stride-1) | |
3493 && (mb_y == 0 || mb_y == b_height-1)){ | |
3494 if(mb_x == 0) | |
3495 x1 = block_w; | |
3496 else | |
3497 x0 = block_w; | |
3498 if(mb_y == 0) | |
3499 y1 = block_w; | |
3500 else | |
3501 y0 = block_w; | |
3502 for(y=y0; y<y1; y++) | |
3503 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0); | |
3504 } | |
3505 | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3506 if(block_w==16){ |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3507 /* FIXME rearrange dsputil to fit 32x32 cmp functions */ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3508 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */ |
6412 | 3509 /* FIXME cmps overlap but do not cover the wavelet's whole support. |
3510 * So improving the score of one block is not strictly guaranteed | |
3511 * to improve the score of the whole frame, thus iterative motion | |
3512 * estimation does not always converge. */ | |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3513 if(s->avctx->me_cmp == FF_CMP_W97) |
4197 | 3514 distortion = w97_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3515 else if(s->avctx->me_cmp == FF_CMP_W53) |
4197 | 3516 distortion = w53_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3517 else{ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3518 distortion = 0; |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3519 for(i=0; i<4; i++){ |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3520 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride; |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3521 distortion += s->dsp.me_cmp[0](&s->m, src + off, dst + off, ref_stride, 16); |
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3522 } |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3523 } |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3524 }else{ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3525 assert(block_w==8); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3526 distortion = s->dsp.me_cmp[0](&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3527 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3528 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3529 if(plane_index==0){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3530 for(i=0; i<4; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3531 /* ..RRr |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3532 * .RXx. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3533 * rxx.. |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3534 */ |
3051 | 3535 rate += get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3536 } |
3057 | 3537 if(mb_x == b_stride-2) |
3538 rate += get_block_bits(s, mb_x + 1, mb_y + 1, 1); | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3539 } |
3051 | 3540 return distortion + rate*penalty_factor; |
3541 } | |
3542 | |
3543 static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){ | |
3544 int i, y2; | |
3545 Plane *p= &s->plane[plane_index]; | |
3546 const int block_size = MB_SIZE >> s->block_max_depth; | |
3547 const int block_w = plane_index ? block_size/2 : block_size; | |
3548 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; | |
3549 const int obmc_stride= plane_index ? block_size : 2*block_size; | |
3550 const int ref_stride= s->current_picture.linesize[plane_index]; | |
3551 uint8_t *dst= s->current_picture.data[plane_index]; | |
3552 uint8_t *src= s-> input_picture.data[plane_index]; | |
6426 | 3553 //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst |
3554 // const has only been removed from zero_dst to suppress a warning | |
3555 static IDWTELEM zero_dst[4096]; //FIXME | |
3051 | 3556 const int b_stride = s->b_width << s->block_max_depth; |
3557 const int w= p->width; | |
3558 const int h= p->height; | |
3559 int distortion= 0; | |
3560 int rate= 0; | |
3561 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); | |
3562 | |
3563 for(i=0; i<9; i++){ | |
3564 int mb_x2= mb_x + (i%3) - 1; | |
3565 int mb_y2= mb_y + (i/3) - 1; | |
3566 int x= block_w*mb_x2 + block_w/2; | |
3567 int y= block_w*mb_y2 + block_w/2; | |
3568 | |
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3569 add_yblock(s, 0, NULL, zero_dst, dst, obmc, |
3051 | 3570 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index); |
3571 | |
3572 //FIXME find a cleaner/simpler way to skip the outside stuff | |
3573 for(y2= y; y2<0; y2++) | |
3574 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3575 for(y2= h; y2<y+block_w; y2++) | |
3576 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
3577 if(x<0){ | |
3578 for(y2= y; y2<y+block_w; y2++) | |
3579 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x); | |
3580 } | |
3581 if(x+block_w > w){ | |
3582 for(y2= y; y2<y+block_w; y2++) | |
3583 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w); | |
3584 } | |
3585 | |
3586 assert(block_w== 8 || block_w==16); | |
3587 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w); | |
3588 } | |
3589 | |
3590 if(plane_index==0){ | |
3591 BlockNode *b= &s->block[mb_x+mb_y*b_stride]; | |
3592 int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1); | |
3593 | |
3594 /* ..RRRr | |
3595 * .RXXx. | |
3596 * .RXXx. | |
3597 * rxxx. | |
3598 */ | |
3599 if(merged) | |
3600 rate = get_block_bits(s, mb_x, mb_y, 2); | |
3601 for(i=merged?4:0; i<9; i++){ | |
3602 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}}; | |
3603 rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1); | |
3604 } | |
3605 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3606 return distortion + rate*penalty_factor; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3607 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3608 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3609 static void ff_spatial_idwt_init(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3610 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3611 for(level=decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3612 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3613 case DWT_97: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3614 case DWT_53: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3615 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3616 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3617 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3618 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3619 static void ff_spatial_idwt_slice(DWTCompose *cs, IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3620 const int support = type==1 ? 3 : 5; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3621 int level; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3622 if(type==2) return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3623 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3624 for(level=decomposition_count-1; level>=0; level--){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3625 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3626 switch(type){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3627 case DWT_97: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3628 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3629 case DWT_53: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3630 break; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3631 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3632 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3633 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3634 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3635 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3636 static void ff_spatial_idwt(IDWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3637 DWTCompose cs[MAX_DECOMPOSITIONS]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3638 int y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3639 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3640 for(y=0; y<height; y+=4) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3641 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3642 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3643 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3644 static int encode_subband_c0run(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3645 const int w= b->width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3646 const int h= b->height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3647 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3648 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3649 if(1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3650 int run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3651 int runs[w*h]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3652 int run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3653 int max_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3654 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3655 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3656 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3657 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3658 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3659 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3660 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3661 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3662 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3663 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3664 lt= src[x - 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3665 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3666 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3667 rt= src[x + 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3668 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3669 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3670 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3671 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3672 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3673 if(orientation==1) ll= src[y + (x-2)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3674 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3675 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3676 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3677 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3678 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3679 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3680 if(px<b->parent->width && py<b->parent->height) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3681 p= parent[px + py*2*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3682 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3683 if(!(/*ll|*/l|lt|t|rt|p)){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3684 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3685 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3686 run=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3687 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3688 run++; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3689 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3690 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3691 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3692 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3693 max_index= run_index; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3694 runs[run_index++]= run; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3695 run_index=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3696 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3697 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3698 put_symbol2(&s->c, b->state[30], max_index, 0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3699 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3700 put_symbol2(&s->c, b->state[1], run, 3); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3701 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3702 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3703 if(s->c.bytestream_end - s->c.bytestream < w*40){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3704 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3705 return -1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3706 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3707 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3708 int v, p=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3709 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3710 v= src[x + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3711 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3712 if(y){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3713 t= src[x + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3714 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3715 lt= src[x - 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3716 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3717 if(x + 1 < w){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3718 rt= src[x + 1 + (y-1)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3719 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3720 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3721 if(x){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3722 l= src[x - 1 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3723 /*if(x > 1){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3724 if(orientation==1) ll= src[y + (x-2)*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3725 else ll= src[x - 2 + y*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3726 }*/ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3727 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3728 if(parent){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3729 int px= x>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3730 int py= y>>1; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3731 if(px<b->parent->width && py<b->parent->height) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3732 p= parent[px + py*2*stride]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3733 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3734 if(/*ll|*/l|lt|t|rt|p){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3735 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3736 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3737 put_rac(&s->c, &b->state[0][context], !!v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3738 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3739 if(!run){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3740 run= runs[run_index++]; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3741 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3742 if(run_index <= max_index) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3743 put_symbol2(&s->c, b->state[1], run, 3); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3744 assert(v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3745 }else{ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3746 run--; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3747 assert(!v); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3748 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3749 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3750 if(v){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3751 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3752 int l2= 2*FFABS(l) + (l<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3753 int t2= 2*FFABS(t) + (t<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3754 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3755 put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3756 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3757 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3758 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3759 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3760 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3761 return 0; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3762 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3763 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3764 static int encode_subband(SnowContext *s, SubBand *b, IDWTELEM *src, IDWTELEM *parent, int stride, int orientation){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3765 // encode_subband_qtree(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3766 // encode_subband_z0run(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3767 return encode_subband_c0run(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3768 // encode_subband_dzr(s, b, src, parent, stride, orientation); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3769 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
3770 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3771 static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3772 const int b_stride= s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3773 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3774 BlockNode backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3775 int rd, index, value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3776 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3777 assert(mb_x>=0 && mb_y>=0); |
2994 | 3778 assert(mb_x<b_stride); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3779 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3780 if(intra){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3781 block->color[0] = p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3782 block->color[1] = p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3783 block->color[2] = p[2]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3784 block->type |= BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3785 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3786 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1); |
3314 | 3787 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3788 if(s->me_cache[index] == value) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3789 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3790 s->me_cache[index]= value; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3791 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3792 block->mx= p[0]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3793 block->my= p[1]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3794 block->type &= ~BLOCK_INTRA; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3795 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3796 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3797 rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3798 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3799 //FIXME chroma |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3800 if(rd < *best_rd){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3801 *best_rd= rd; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3802 return 1; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3803 }else{ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3804 *block= backup; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3805 return 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3806 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3807 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3808 |
6412 | 3809 /* special case for int[2] args we discard afterwards, |
3810 * fixes compilation problem with gcc 2.95 */ | |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3811 static av_always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){ |
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3812 int p[2] = {p0, p1}; |
3197 | 3813 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd); |
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3814 } |
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3815 |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3816 static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd){ |
3051 | 3817 const int b_stride= s->b_width << s->block_max_depth; |
3818 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | |
3819 BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | |
3820 int rd, index, value; | |
3821 | |
3822 assert(mb_x>=0 && mb_y>=0); | |
3823 assert(mb_x<b_stride); | |
3824 assert(((mb_x|mb_y)&1) == 0); | |
3825 | |
3826 index= (p0 + 31*p1) & (ME_CACHE_SIZE-1); | |
3314 | 3827 value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12); |
3051 | 3828 if(s->me_cache[index] == value) |
3829 return 0; | |
3830 s->me_cache[index]= value; | |
3831 | |
3832 block->mx= p0; | |
3833 block->my= p1; | |
3314 | 3834 block->ref= ref; |
3051 | 3835 block->type &= ~BLOCK_INTRA; |
3836 block[1]= block[b_stride]= block[b_stride+1]= *block; | |
3837 | |
3838 rd= get_4block_rd(s, mb_x, mb_y, 0); | |
3839 | |
3840 //FIXME chroma | |
3841 if(rd < *best_rd){ | |
3842 *best_rd= rd; | |
3843 return 1; | |
3844 }else{ | |
3845 block[0]= backup[0]; | |
3846 block[1]= backup[1]; | |
3847 block[b_stride]= backup[2]; | |
3848 block[b_stride+1]= backup[3]; | |
3849 return 0; | |
3850 } | |
3851 } | |
3852 | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3853 static void iterative_me(SnowContext *s){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3854 int pass, mb_x, mb_y; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3855 const int b_width = s->b_width << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3856 const int b_height= s->b_height << s->block_max_depth; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3857 const int b_stride= b_width; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3858 int color[3]; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3859 |
3194
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3860 { |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3861 RangeCoder r = s->c; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3862 uint8_t state[sizeof(s->block_state)]; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3863 memcpy(state, s->block_state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3864 for(mb_y= 0; mb_y<s->b_height; mb_y++) |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3865 for(mb_x= 0; mb_x<s->b_width; mb_x++) |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3866 encode_q_branch(s, 0, mb_x, mb_y); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3867 s->c = r; |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3868 memcpy(s->block_state, state, sizeof(s->block_state)); |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3869 } |
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3870 |
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3871 for(pass=0; pass<25; pass++){ |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3872 int change= 0; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3873 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3874 for(mb_y= 0; mb_y<b_height; mb_y++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3875 for(mb_x= 0; mb_x<b_width; mb_x++){ |
3314 | 3876 int dia_change, i, j, ref; |
3877 int best_rd= INT_MAX, ref_rd; | |
3878 BlockNode backup, ref_b; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3879 const int index= mb_x + mb_y * b_stride; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3880 BlockNode *block= &s->block[index]; |
3324 | 3881 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : NULL; |
3882 BlockNode *lb = mb_x ? &s->block[index -1] : NULL; | |
3883 BlockNode *rb = mb_x+1<b_width ? &s->block[index +1] : NULL; | |
3884 BlockNode *bb = mb_y+1<b_height ? &s->block[index+b_stride ] : NULL; | |
3885 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : NULL; | |
3886 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->block[index-b_stride+1] : NULL; | |
3887 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL; | |
3888 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->block[index+b_stride+1] : NULL; | |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3889 const int b_w= (MB_SIZE >> s->block_max_depth); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3890 uint8_t obmc_edged[b_w*2][b_w*2]; |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3891 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3892 if(pass && (block->type & BLOCK_OPT)) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3893 continue; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3894 block->type |= BLOCK_OPT; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3895 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3896 backup= *block; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3897 |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3898 if(!s->me_cache_generation) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3899 memset(s->me_cache, 0, sizeof(s->me_cache)); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3900 s->me_cache_generation += 1<<22; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3901 |
6412 | 3902 //FIXME precalculate |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3903 { |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3904 int x, y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3905 memcpy(obmc_edged, obmc_tab[s->block_max_depth], b_w*b_w*4); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3906 if(mb_x==0) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3907 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3908 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3909 if(mb_x==b_stride-1) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3910 for(y=0; y<b_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3911 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3912 if(mb_y==0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3913 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3914 obmc_edged[0][x] += obmc_edged[b_w-1][x]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3915 for(y=1; y<b_w; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3916 memcpy(obmc_edged[y], obmc_edged[0], b_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3917 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3918 if(mb_y==b_height-1){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3919 for(x=0; x<b_w*2; x++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3920 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3921 for(y=b_w; y<b_w*2-1; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3922 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3923 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3924 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3925 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3926 //skip stuff outside the picture |
6474
e6995f3fbf7f
cosmetics: Normalize {} placement after for, while, if.
diego
parents:
6437
diff
changeset
|
3927 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){ |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3928 uint8_t *src= s-> input_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3929 uint8_t *dst= s->current_picture.data[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3930 const int stride= s->current_picture.linesize[0]; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3931 const int block_w= MB_SIZE >> s->block_max_depth; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3932 const int sx= block_w*mb_x - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3933 const int sy= block_w*mb_y - block_w/2; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3934 const int w= s->plane[0].width; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3935 const int h= s->plane[0].height; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3936 int y; |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3937 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3938 for(y=sy; y<0; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3939 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3940 for(y=h; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3941 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3942 if(sx<0){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3943 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3944 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3945 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3946 if(sx+block_w*2 > w){ |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3947 for(y=sy; y<sy+block_w*2; y++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3948 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3949 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3950 } |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3951 |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3952 // intra(black) = neighbors' contribution to the current block |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3953 for(i=0; i<3; i++) |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3954 color[i]= get_dc(s, mb_x, mb_y, i); |
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3955 |
5127 | 3956 // get previous score (cannot be cached due to OBMC) |
3057 | 3957 if(pass > 0 && (block->type&BLOCK_INTRA)){ |
3958 int color0[3]= {block->color[0], block->color[1], block->color[2]}; | |
3959 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd); | |
3960 }else | |
3197 | 3961 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd); |
3962 | |
3314 | 3963 ref_b= *block; |
3964 ref_rd= best_rd; | |
3965 for(ref=0; ref < s->ref_frames; ref++){ | |
3966 int16_t (*mvr)[2]= &s->ref_mvs[ref][index]; | |
3967 if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold | |
3968 continue; | |
3969 block->ref= ref; | |
3970 best_rd= INT_MAX; | |
3971 | |
3972 check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd); | |
3973 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd); | |
3324 | 3974 if(tb) |
3314 | 3975 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd); |
3324 | 3976 if(lb) |
3314 | 3977 check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd); |
3324 | 3978 if(rb) |
3314 | 3979 check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd); |
3324 | 3980 if(bb) |
3314 | 3981 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd); |
3982 | |
3983 /* fullpel ME */ | |
6412 | 3984 //FIXME avoid subpel interpolation / round to nearest integer |
3314 | 3985 do{ |
3986 dia_change=0; | |
3987 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){ | |
3988 for(j=0; j<i; j++){ | |
3989 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3990 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3991 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
3992 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
3993 } | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3994 } |
3314 | 3995 }while(dia_change); |
3996 /* subpel ME */ | |
3997 do{ | |
3998 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},}; | |
3999 dia_change=0; | |
4000 for(i=0; i<8; i++) | |
4001 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd); | |
4002 }while(dia_change); | |
4003 //FIXME or try the standard 2 pass qpel or similar | |
4004 | |
4005 mvr[0][0]= block->mx; | |
4006 mvr[0][1]= block->my; | |
4007 if(ref_rd > best_rd){ | |
4008 ref_rd= best_rd; | |
4009 ref_b= *block; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4010 } |
3314 | 4011 } |
4012 best_rd= ref_rd; | |
4013 *block= ref_b; | |
2998 | 4014 #if 1 |
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
4015 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4016 //FIXME RD style color selection |
2998 | 4017 #endif |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4018 if(!same_block(block, &backup)){ |
3324 | 4019 if(tb ) tb ->type &= ~BLOCK_OPT; |
4020 if(lb ) lb ->type &= ~BLOCK_OPT; | |
4021 if(rb ) rb ->type &= ~BLOCK_OPT; | |
4022 if(bb ) bb ->type &= ~BLOCK_OPT; | |
4023 if(tlb) tlb->type &= ~BLOCK_OPT; | |
4024 if(trb) trb->type &= ~BLOCK_OPT; | |
4025 if(blb) blb->type &= ~BLOCK_OPT; | |
4026 if(brb) brb->type &= ~BLOCK_OPT; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4027 change ++; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4028 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4029 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4030 } |
10810 | 4031 av_log(s->avctx, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change); |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4032 if(!change) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4033 break; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4034 } |
3051 | 4035 |
4036 if(s->block_max_depth == 1){ | |
4037 int change= 0; | |
4038 for(mb_y= 0; mb_y<b_height; mb_y+=2){ | |
4039 for(mb_x= 0; mb_x<b_width; mb_x+=2){ | |
3324 | 4040 int i; |
3051 | 4041 int best_rd, init_rd; |
4042 const int index= mb_x + mb_y * b_stride; | |
4043 BlockNode *b[4]; | |
4044 | |
4045 b[0]= &s->block[index]; | |
4046 b[1]= b[0]+1; | |
4047 b[2]= b[0]+b_stride; | |
4048 b[3]= b[2]+1; | |
4049 if(same_block(b[0], b[1]) && | |
4050 same_block(b[0], b[2]) && | |
4051 same_block(b[0], b[3])) | |
4052 continue; | |
4053 | |
4054 if(!s->me_cache_generation) | |
4055 memset(s->me_cache, 0, sizeof(s->me_cache)); | |
4056 s->me_cache_generation += 1<<22; | |
4057 | |
4058 init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0); | |
4059 | |
3314 | 4060 //FIXME more multiref search? |
3051 | 4061 check_4block_inter(s, mb_x, mb_y, |
4062 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2, | |
3314 | 4063 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd); |
3051 | 4064 |
4065 for(i=0; i<4; i++) | |
4066 if(!(b[i]->type&BLOCK_INTRA)) | |
3314 | 4067 check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd); |
3051 | 4068 |
4069 if(init_rd != best_rd) | |
4070 change++; | |
4071 } | |
4072 } | |
10810 | 4073 av_log(s->avctx, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4); |
3051 | 4074 } |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4075 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4076 |
10188
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4077 static void encode_blocks(SnowContext *s, int search){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4078 int x, y; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4079 int w= s->b_width; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4080 int h= s->b_height; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4081 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4082 if(s->avctx->me_method == ME_ITER && !s->keyframe && search) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4083 iterative_me(s); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4084 |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4085 for(y=0; y<h; y++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4086 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4087 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4088 return; |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4089 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4090 for(x=0; x<w; x++){ |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4091 if(s->avctx->me_method == ME_ITER || !search) |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4092 encode_q_branch2(s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4093 else |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4094 encode_q_branch (s, 0, x, y); |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4095 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4096 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4097 } |
404026d9adb5
Reorder functions so that encoding functions are disabled by the preprocessor.
diego
parents:
9808
diff
changeset
|
4098 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4099 static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias){ |
2138 | 4100 const int w= b->width; |
4101 const int h= b->height; | |
4594 | 4102 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
5575 | 4103 const int qmul= qexp[qlog&(QROOT-1)]<<((qlog>>QSHIFT) + ENCODER_EXTRA_BITS); |
2150 | 4104 int x,y, thres1, thres2; |
2138 | 4105 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4106 if(s->qlog == LOSSLESS_QLOG){ |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4107 for(y=0; y<h; y++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4108 for(x=0; x<w; x++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4109 dst[x + y*stride]= src[x + y*stride]; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4110 return; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4111 } |
2967 | 4112 |
2138 | 4113 bias= bias ? 0 : (3*qmul)>>3; |
2150 | 4114 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
4115 thres2= 2*thres1; | |
2967 | 4116 |
2138 | 4117 if(!bias){ |
4118 for(y=0; y<h; y++){ | |
4119 for(x=0; x<w; x++){ | |
2150 | 4120 int i= src[x + y*stride]; |
2967 | 4121 |
2150 | 4122 if((unsigned)(i+thres1) > thres2){ |
4123 if(i>=0){ | |
4124 i<<= QEXPSHIFT; | |
4125 i/= qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4126 dst[x + y*stride]= i; |
2150 | 4127 }else{ |
4128 i= -i; | |
4129 i<<= QEXPSHIFT; | |
4130 i/= qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4131 dst[x + y*stride]= -i; |
2150 | 4132 } |
4133 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4134 dst[x + y*stride]= 0; |
2138 | 4135 } |
4136 } | |
4137 }else{ | |
4138 for(y=0; y<h; y++){ | |
4139 for(x=0; x<w; x++){ | |
2967 | 4140 int i= src[x + y*stride]; |
4141 | |
2150 | 4142 if((unsigned)(i+thres1) > thres2){ |
4143 if(i>=0){ | |
4144 i<<= QEXPSHIFT; | |
4145 i= (i + bias) / qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4146 dst[x + y*stride]= i; |
2150 | 4147 }else{ |
4148 i= -i; | |
4149 i<<= QEXPSHIFT; | |
4150 i= (i + bias) / qmul; //FIXME optimize | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4151 dst[x + y*stride]= -i; |
2150 | 4152 } |
4153 }else | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4154 dst[x + y*stride]= 0; |
2138 | 4155 } |
4156 } | |
4157 } | |
4158 } | |
4159 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4160 static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride){ |
2138 | 4161 const int w= b->width; |
4162 const int h= b->height; | |
4594 | 4163 const int qlog= av_clip(s->qlog + b->qlog, 0, QROOT*16); |
2600 | 4164 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
2138 | 4165 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
4166 int x,y; | |
2967 | 4167 |
2161 | 4168 if(s->qlog == LOSSLESS_QLOG) return; |
2967 | 4169 |
2138 | 4170 for(y=0; y<h; y++){ |
4171 for(x=0; x<w; x++){ | |
4172 int i= src[x + y*stride]; | |
4173 if(i<0){ | |
4174 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
4175 }else if(i>0){ | |
4176 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
4177 } | |
4178 } | |
4179 } | |
4180 } | |
4181 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4182 static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){ |
2138 | 4183 const int w= b->width; |
4184 const int h= b->height; | |
4185 int x,y; | |
2967 | 4186 |
2138 | 4187 for(y=h-1; y>=0; y--){ |
4188 for(x=w-1; x>=0; x--){ | |
4189 int i= x + y*stride; | |
2967 | 4190 |
2138 | 4191 if(x){ |
4192 if(use_median){ | |
4193 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
4194 else src[i] -= src[i - 1]; | |
4195 }else{ | |
4196 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
4197 else src[i] -= src[i - 1]; | |
4198 } | |
4199 }else{ | |
4200 if(y) src[i] -= src[i - stride]; | |
4201 } | |
4202 } | |
4203 } | |
4204 } | |
4205 | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4206 static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median){ |
2138 | 4207 const int w= b->width; |
4208 const int h= b->height; | |
4209 int x,y; | |
2967 | 4210 |
2138 | 4211 for(y=0; y<h; y++){ |
4212 for(x=0; x<w; x++){ | |
4213 int i= x + y*stride; | |
2967 | 4214 |
2138 | 4215 if(x){ |
4216 if(use_median){ | |
4217 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
4218 else src[i] += src[i - 1]; | |
4219 }else{ | |
4220 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
4221 else src[i] += src[i - 1]; | |
4222 } | |
4223 }else{ | |
4224 if(y) src[i] += src[i - stride]; | |
4225 } | |
4226 } | |
4227 } | |
4228 } | |
4229 | |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4230 static void encode_qlogs(SnowContext *s){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4231 int plane_index, level, orientation; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4232 |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4233 for(plane_index=0; plane_index<2; plane_index++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4234 for(level=0; level<s->spatial_decomposition_count; level++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4235 for(orientation=level ? 1:0; orientation<4; orientation++){ |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4236 if(orientation==2) continue; |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4237 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4238 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4239 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4240 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4241 } |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4242 |
2138 | 4243 static void encode_header(SnowContext *s){ |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4244 int plane_index, i; |
2967 | 4245 uint8_t kstate[32]; |
4246 | |
4247 memset(kstate, MID_STATE, sizeof(kstate)); | |
2138 | 4248 |
2335 | 4249 put_rac(&s->c, kstate, s->keyframe); |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4250 if(s->keyframe || s->always_reset){ |
2199 | 4251 reset_contexts(s); |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4252 s->last_spatial_decomposition_type= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4253 s->last_qlog= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4254 s->last_qbias= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4255 s->last_mv_scale= |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4256 s->last_block_max_depth= 0; |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4257 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4258 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4259 p->last_htaps=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4260 p->last_diag_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4261 memset(p->last_hcoeff, 0, sizeof(p->last_hcoeff)); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4262 } |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4263 } |
2138 | 4264 if(s->keyframe){ |
4265 put_symbol(&s->c, s->header_state, s->version, 0); | |
2335 | 4266 put_rac(&s->c, s->header_state, s->always_reset); |
2138 | 4267 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); |
4268 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); | |
4269 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); | |
4270 put_symbol(&s->c, s->header_state, s->colorspace_type, 0); | |
4271 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0); | |
4272 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0); | |
2335 | 4273 put_rac(&s->c, s->header_state, s->spatial_scalability); |
4274 // put_rac(&s->c, s->header_state, s->rate_scalability); | |
3314 | 4275 put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0); |
2138 | 4276 |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4277 encode_qlogs(s); |
2138 | 4278 } |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4279 |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4280 if(!s->keyframe){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4281 int update_mc=0; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4282 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4283 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4284 update_mc |= p->last_htaps != p->htaps; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4285 update_mc |= p->last_diag_mc != p->diag_mc; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4286 update_mc |= !!memcmp(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4287 } |
5667
9242e125395f
do not force the halfpel filter coeffs to be retransmitted on every frame
michael
parents:
5666
diff
changeset
|
4288 put_rac(&s->c, s->header_state, update_mc); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4289 if(update_mc){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4290 for(plane_index=0; plane_index<2; plane_index++){ |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4291 Plane *p= &s->plane[plane_index]; |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4292 put_rac(&s->c, s->header_state, p->diag_mc); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4293 put_symbol(&s->c, s->header_state, p->htaps/2-1, 0); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4294 for(i= p->htaps/2; i; i--) |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4295 put_symbol(&s->c, s->header_state, FFABS(p->hcoeff[i]), 0); |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4296 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4297 } |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4298 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4299 put_rac(&s->c, s->header_state, 1); |
5666
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4300 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); |
b5c137f3f53a
allow changing of the spatial_decomposition_count and quantization tables
michael
parents:
5665
diff
changeset
|
4301 encode_qlogs(s); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4302 }else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4303 put_rac(&s->c, s->header_state, 0); |
5651
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4304 } |
ab023c9f03d0
store halfpel filter coefficients in the header as well as the
michael
parents:
5650
diff
changeset
|
4305 |
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4306 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type - s->last_spatial_decomposition_type, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4307 put_symbol(&s->c, s->header_state, s->qlog - s->last_qlog , 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4308 put_symbol(&s->c, s->header_state, s->mv_scale - s->last_mv_scale, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4309 put_symbol(&s->c, s->header_state, s->qbias - s->last_qbias , 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4310 put_symbol(&s->c, s->header_state, s->block_max_depth - s->last_block_max_depth, 1); |
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
4311 |
6144 | 4312 } |
4313 | |
4314 static void update_last_header_values(SnowContext *s){ | |
4315 int plane_index; | |
4316 | |
4317 if(!s->keyframe){ | |
4318 for(plane_index=0; plane_index<2; plane_index++){ | |
4319 Plane *p= &s->plane[plane_index]; | |
4320 p->last_diag_mc= p->diag_mc; | |
4321 p->last_htaps = p->htaps; | |
4322 memcpy(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); | |
4323 } | |
4324 } | |
4325 | |
6414 | 4326 s->last_spatial_decomposition_type = s->spatial_decomposition_type; |
4327 s->last_qlog = s->qlog; | |
4328 s->last_qbias = s->qbias; | |
4329 s->last_mv_scale = s->mv_scale; | |
4330 s->last_block_max_depth = s->block_max_depth; | |
4331 s->last_spatial_decomposition_count = s->spatial_decomposition_count; | |
2138 | 4332 } |
4333 | |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4334 static int qscale2qlog(int qscale){ |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4335 return rint(QROOT*log(qscale / (float)FF_QP2LAMBDA)/log(2)) |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4336 + 61*QROOT/8; //<64 >60 |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4337 } |
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4338 |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4339 static int ratecontrol_1pass(SnowContext *s, AVFrame *pict) |
3313 | 4340 { |
6412 | 4341 /* Estimate the frame's complexity as a sum of weighted dwt coefficients. |
3313 | 4342 * FIXME we know exact mv bits at this point, |
4343 * but ratecontrol isn't set up to include them. */ | |
4344 uint32_t coef_sum= 0; | |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4345 int level, orientation, delta_qlog; |
3313 | 4346 |
4347 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4348 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4349 SubBand *b= &s->plane[0].band[level][orientation]; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4350 IDWTELEM *buf= b->ibuf; |
3313 | 4351 const int w= b->width; |
4352 const int h= b->height; | |
4353 const int stride= b->stride; | |
4594 | 4354 const int qlog= av_clip(2*QROOT + b->qlog, 0, QROOT*16); |
3313 | 4355 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); |
4356 const int qdiv= (1<<16)/qmul; | |
4357 int x, y; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4358 //FIXME this is ugly |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4359 for(y=0; y<h; y++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4360 for(x=0; x<w; x++) |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4361 buf[x+y*stride]= b->buf[x+y*stride]; |
3313 | 4362 if(orientation==0) |
4363 decorrelate(s, b, buf, stride, 1, 0); | |
4364 for(y=0; y<h; y++) | |
4365 for(x=0; x<w; x++) | |
4366 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16; | |
4367 } | |
4368 } | |
4369 | |
4370 /* ugly, ratecontrol just takes a sqrt again */ | |
4371 coef_sum = (uint64_t)coef_sum * coef_sum >> 16; | |
4372 assert(coef_sum < INT_MAX); | |
4373 | |
6481 | 4374 if(pict->pict_type == FF_I_TYPE){ |
3313 | 4375 s->m.current_picture.mb_var_sum= coef_sum; |
4376 s->m.current_picture.mc_mb_var_sum= 0; | |
4377 }else{ | |
4378 s->m.current_picture.mc_mb_var_sum= coef_sum; | |
4379 s->m.current_picture.mb_var_sum= 0; | |
4380 } | |
4381 | |
4382 pict->quality= ff_rate_estimate_qscale(&s->m, 1); | |
3766 | 4383 if (pict->quality < 0) |
4011
5bce97c30a69
-1 is a valid return value in ratecontrol_1pass() -> 100l for takis
michael
parents:
4001
diff
changeset
|
4384 return INT_MIN; |
3313 | 4385 s->lambda= pict->quality * 3/2; |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4386 delta_qlog= qscale2qlog(pict->quality) - s->qlog; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4387 s->qlog+= delta_qlog; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4388 return delta_qlog; |
3313 | 4389 } |
2138 | 4390 |
5909 | 4391 static void calculate_visual_weight(SnowContext *s, Plane *p){ |
2138 | 4392 int width = p->width; |
4393 int height= p->height; | |
2198 | 4394 int level, orientation, x, y; |
2138 | 4395 |
4396 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4397 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4398 SubBand *b= &p->band[level][orientation]; | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4399 IDWTELEM *ibuf= b->ibuf; |
2138 | 4400 int64_t error=0; |
2967 | 4401 |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4402 memset(s->spatial_idwt_buffer, 0, sizeof(*s->spatial_idwt_buffer)*width*height); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4403 ibuf[b->width/2 + b->height/2*b->stride]= 256*16; |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4404 ff_spatial_idwt(s->spatial_idwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
2138 | 4405 for(y=0; y<height; y++){ |
4406 for(x=0; x<width; x++){ | |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4407 int64_t d= s->spatial_idwt_buffer[x + y*width]*16; |
2138 | 4408 error += d*d; |
4409 } | |
4410 } | |
4411 | |
4412 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
4413 } | |
4414 } | |
4415 } | |
4416 | |
4417 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
4418 SnowContext *s = avctx->priv_data; | |
2335 | 4419 RangeCoder * const c= &s->c; |
2138 | 4420 AVFrame *pict = data; |
4421 const int width= s->avctx->width; | |
4422 const int height= s->avctx->height; | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4423 int level, orientation, plane_index, i, y; |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4424 uint8_t rc_header_bak[sizeof(s->header_state)]; |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4425 uint8_t rc_block_bak[sizeof(s->block_state)]; |
2138 | 4426 |
2335 | 4427 ff_init_range_encoder(c, buf, buf_size); |
4428 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
2967 | 4429 |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4430 for(i=0; i<3; i++){ |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4431 int shift= !!i; |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4432 for(y=0; y<(height>>shift); y++) |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4433 memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]], |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4434 &pict->data[i][y * pict->linesize[i]], |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4435 width>>shift); |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4436 } |
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4437 s->new_picture = *pict; |
2138 | 4438 |
3313 | 4439 s->m.picture_number= avctx->frame_number; |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4440 if(avctx->flags&CODEC_FLAG_PASS2){ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4441 s->m.pict_type = |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4442 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4443 s->keyframe= pict->pict_type==FF_I_TYPE; |
3766 | 4444 if(!(avctx->flags&CODEC_FLAG_QSCALE)) { |
3193 | 4445 pict->quality= ff_rate_estimate_qscale(&s->m, 0); |
3766 | 4446 if (pict->quality < 0) |
4447 return -1; | |
4448 } | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4449 }else{ |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4450 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; |
3313 | 4451 s->m.pict_type= |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4452 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4453 } |
2967 | 4454 |
3313 | 4455 if(s->pass1_rc && avctx->frame_number == 0) |
4456 pict->quality= 2*FF_QP2LAMBDA; | |
2161 | 4457 if(pict->quality){ |
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4458 s->qlog= qscale2qlog(pict->quality); |
3313 | 4459 s->lambda = pict->quality * 3/2; |
4460 } | |
4461 if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){ | |
2161 | 4462 s->qlog= LOSSLESS_QLOG; |
3313 | 4463 s->lambda = 0; |
6412 | 4464 }//else keep previous frame's qlog until after motion estimation |
2138 | 4465 |
4466 frame_start(s); | |
4467 | |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4468 s->m.current_picture_ptr= &s->m.current_picture; |
10625 | 4469 s->m.last_picture.pts= s->m.current_picture.pts; |
4470 s->m.current_picture.pts= pict->pts; | |
6481 | 4471 if(pict->pict_type == FF_P_TYPE){ |
2138 | 4472 int block_width = (width +15)>>4; |
4473 int block_height= (height+15)>>4; | |
4474 int stride= s->current_picture.linesize[0]; | |
2967 | 4475 |
2138 | 4476 assert(s->current_picture.data[0]); |
3314 | 4477 assert(s->last_picture[0].data[0]); |
2967 | 4478 |
2138 | 4479 s->m.avctx= s->avctx; |
4480 s->m.current_picture.data[0]= s->current_picture.data[0]; | |
3314 | 4481 s->m. last_picture.data[0]= s->last_picture[0].data[0]; |
2138 | 4482 s->m. new_picture.data[0]= s-> input_picture.data[0]; |
4483 s->m. last_picture_ptr= &s->m. last_picture; | |
4484 s->m.linesize= | |
4485 s->m. last_picture.linesize[0]= | |
4486 s->m. new_picture.linesize[0]= | |
4487 s->m.current_picture.linesize[0]= stride; | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4488 s->m.uvlinesize= s->current_picture.linesize[1]; |
2138 | 4489 s->m.width = width; |
4490 s->m.height= height; | |
4491 s->m.mb_width = block_width; | |
4492 s->m.mb_height= block_height; | |
4493 s->m.mb_stride= s->m.mb_width+1; | |
4494 s->m.b8_stride= 2*s->m.mb_width+1; | |
4495 s->m.f_code=1; | |
4496 s->m.pict_type= pict->pict_type; | |
4497 s->m.me_method= s->avctx->me_method; | |
4498 s->m.me.scene_change_score=0; | |
4499 s->m.flags= s->avctx->flags; | |
4500 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0; | |
4501 s->m.out_format= FMT_H263; | |
4502 s->m.unrestricted_mv= 1; | |
4503 | |
3313 | 4504 s->m.lambda = s->lambda; |
2138 | 4505 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7); |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4506 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4507 |
2138 | 4508 s->m.dsp= s->dsp; //move |
4509 ff_init_me(&s->m); | |
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4510 s->dsp= s->m.dsp; |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4511 } |
2967 | 4512 |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4513 if(s->pass1_rc){ |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4514 memcpy(rc_header_bak, s->header_state, sizeof(s->header_state)); |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4515 memcpy(rc_block_bak, s->block_state, sizeof(s->block_state)); |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4516 } |
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4517 |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4518 redo_frame: |
2967 | 4519 |
6481 | 4520 if(pict->pict_type == FF_I_TYPE) |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4521 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4522 else |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4523 s->spatial_decomposition_count= 5; |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4524 |
3313 | 4525 s->m.pict_type = pict->pict_type; |
6481 | 4526 s->qbias= pict->pict_type == FF_P_TYPE ? 2 : 0; |
2138 | 4527 |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4528 common_init_after_header(avctx); |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4529 |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4530 if(s->last_spatial_decomposition_count != s->spatial_decomposition_count){ |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4531 for(plane_index=0; plane_index<3; plane_index++){ |
5909 | 4532 calculate_visual_weight(s, &s->plane[plane_index]); |
5670
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4533 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4534 } |
2f3431b34f0f
make changing spatial_decomposition_count per frame work
michael
parents:
5668
diff
changeset
|
4535 |
2138 | 4536 encode_header(s); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4537 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4538 encode_blocks(s, 1); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4539 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits; |
2967 | 4540 |
2138 | 4541 for(plane_index=0; plane_index<3; plane_index++){ |
4542 Plane *p= &s->plane[plane_index]; | |
4543 int w= p->width; | |
4544 int h= p->height; | |
4545 int x, y; | |
2198 | 4546 // int bits= put_bits_count(&s->c.pb); |
2138 | 4547 |
6414 | 4548 if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){ |
4549 //FIXME optimize | |
4550 if(pict->data[plane_index]) //FIXME gray hack | |
4551 for(y=0; y<h; y++){ | |
4552 for(x=0; x<w; x++){ | |
4553 s->spatial_idwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS; | |
4554 } | |
4555 } | |
4556 predict_plane(s, s->spatial_idwt_buffer, plane_index, 0); | |
4557 | |
4558 if( plane_index==0 | |
6481 | 4559 && pict->pict_type == FF_P_TYPE |
6414 | 4560 && !(avctx->flags&CODEC_FLAG_PASS2) |
4561 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){ | |
4562 ff_init_range_encoder(c, buf, buf_size); | |
4563 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
4564 pict->pict_type= FF_I_TYPE; | |
4565 s->keyframe=1; | |
4566 s->current_picture.key_frame=1; | |
4567 goto redo_frame; | |
2138 | 4568 } |
6414 | 4569 |
4570 if(s->qlog == LOSSLESS_QLOG){ | |
4571 for(y=0; y<h; y++){ | |
4572 for(x=0; x<w; x++){ | |
4573 s->spatial_dwt_buffer[y*w + x]= (s->spatial_idwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS; | |
4574 } | |
2161 | 4575 } |
6414 | 4576 }else{ |
4577 for(y=0; y<h; y++){ | |
4578 for(x=0; x<w; x++){ | |
4579 s->spatial_dwt_buffer[y*w + x]=s->spatial_idwt_buffer[y*w + x]<<ENCODER_EXTRA_BITS; | |
4580 } | |
5575 | 4581 } |
4582 } | |
6414 | 4583 |
4584 /* if(QUANTIZE2) | |
4585 dwt_quantize(s, p, s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type); | |
4586 else*/ | |
4587 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4588 | |
4589 if(s->pass1_rc && plane_index==0){ | |
4590 int delta_qlog = ratecontrol_1pass(s, pict); | |
4591 if (delta_qlog <= INT_MIN) | |
4592 return -1; | |
4593 if(delta_qlog){ | |
4594 //reordering qlog in the bitstream would eliminate this reset | |
4595 ff_init_range_encoder(c, buf, buf_size); | |
4596 memcpy(s->header_state, rc_header_bak, sizeof(s->header_state)); | |
4597 memcpy(s->block_state, rc_block_bak, sizeof(s->block_state)); | |
4598 encode_header(s); | |
4599 encode_blocks(s, 0); | |
2161 | 4600 } |
4601 } | |
6414 | 4602 |
4603 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4604 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4605 SubBand *b= &p->band[level][orientation]; | |
4606 | |
4607 if(!QUANTIZE2) | |
4608 quantize(s, b, b->ibuf, b->buf, b->stride, s->qbias); | |
4609 if(orientation==0) | |
6481 | 4610 decorrelate(s, b, b->ibuf, b->stride, pict->pict_type == FF_P_TYPE, 0); |
6414 | 4611 encode_subband(s, b, b->ibuf, b->parent ? b->parent->ibuf : NULL, b->stride, orientation); |
4612 assert(b->parent==NULL || b->parent->stride == b->stride*2); | |
4613 if(orientation==0) | |
4614 correlate(s, b, b->ibuf, b->stride, 1, 0); | |
4615 } | |
4616 } | |
4617 | |
4618 for(level=0; level<s->spatial_decomposition_count; level++){ | |
4619 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4620 SubBand *b= &p->band[level][orientation]; | |
4621 | |
4622 dequantize(s, b, b->ibuf, b->stride); | |
4623 } | |
4624 } | |
4625 | |
4626 ff_spatial_idwt(s->spatial_idwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); | |
4627 if(s->qlog == LOSSLESS_QLOG){ | |
4628 for(y=0; y<h; y++){ | |
4629 for(x=0; x<w; x++){ | |
4630 s->spatial_idwt_buffer[y*w + x]<<=FRAC_BITS; | |
4631 } | |
4632 } | |
4633 } | |
4634 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); | |
4635 }else{ | |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4636 //ME/MC only |
6481 | 4637 if(pict->pict_type == FF_I_TYPE){ |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4638 for(y=0; y<h; y++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4639 for(x=0; x<w; x++){ |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4640 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4641 pict->data[plane_index][y*pict->linesize[plane_index] + x]; |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4642 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4643 } |
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4644 }else{ |
5587
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4645 memset(s->spatial_idwt_buffer, 0, sizeof(IDWTELEM)*w*h); |
3ae03eacbe9f
use 16bit IDWT (a SIMD implementation of it should be >2x faster then with
michael
parents:
5575
diff
changeset
|
4646 predict_plane(s, s->spatial_idwt_buffer, plane_index, 1); |
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4647 } |
6414 | 4648 } |
2138 | 4649 if(s->avctx->flags&CODEC_FLAG_PSNR){ |
4650 int64_t error= 0; | |
2967 | 4651 |
6414 | 4652 if(pict->data[plane_index]) //FIXME gray hack |
4653 for(y=0; y<h; y++){ | |
4654 for(x=0; x<w; x++){ | |
4655 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]; | |
4656 error += d*d; | |
4657 } | |
2138 | 4658 } |
4659 s->avctx->error[plane_index] += error; | |
2232 | 4660 s->current_picture.error[plane_index] = error; |
2138 | 4661 } |
6414 | 4662 |
2138 | 4663 } |
4664 | |
6144 | 4665 update_last_header_values(s); |
4666 | |
9374 | 4667 release_buffer(avctx); |
2138 | 4668 |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4669 s->current_picture.coded_picture_number = avctx->frame_number; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4670 s->current_picture.pict_type = pict->pict_type; |
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4671 s->current_picture.quality = pict->quality; |
3313 | 4672 s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
4673 s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits; | |
4674 s->m.current_picture.display_picture_number = | |
4675 s->m.current_picture.coded_picture_number = avctx->frame_number; | |
4676 s->m.current_picture.quality = pict->quality; | |
4677 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start); | |
4678 if(s->pass1_rc) | |
3766 | 4679 if (ff_rate_estimate_qscale(&s->m, 0) < 0) |
4680 return -1; | |
3313 | 4681 if(avctx->flags&CODEC_FLAG_PASS1) |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4682 ff_write_pass1_stats(&s->m); |
3313 | 4683 s->m.last_pict_type = s->m.pict_type; |
4123
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4684 avctx->frame_bits = s->m.frame_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4685 avctx->mv_bits = s->m.mv_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4686 avctx->misc_bits = s->m.misc_bits; |
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4687 avctx->p_tex_bits = s->m.p_tex_bits; |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4688 |
2138 | 4689 emms_c(); |
2967 | 4690 |
2335 | 4691 return ff_rac_terminate(c); |
2138 | 4692 } |
4693 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
4694 static av_cold int encode_end(AVCodecContext *avctx) |
2138 | 4695 { |
4696 SnowContext *s = avctx->priv_data; | |
4697 | |
4698 common_end(s); | |
10806
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4699 if (s->input_picture.data[0]) |
e58e93f04279
Snow : release buffers allocated using avctx->get_buffer.
jai_menon
parents:
10625
diff
changeset
|
4700 avctx->release_buffer(avctx, &s->input_picture); |
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4701 av_free(avctx->stats_out); |
2138 | 4702 |
4703 return 0; | |
4704 } | |
4705 | |
4706 AVCodec snow_encoder = { | |
4707 "snow", | |
4708 CODEC_TYPE_VIDEO, | |
4709 CODEC_ID_SNOW, | |
4710 sizeof(SnowContext), | |
4711 encode_init, | |
4712 encode_frame, | |
4713 encode_end, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
4714 .long_name = NULL_IF_CONFIG_SMALL("Snow"), |
2138 | 4715 }; |
2408
a6e4da1c28ee
Disable encoders patch by (Gianluigi Tiesi <mplayer netfarm it>)
michael
parents:
2368
diff
changeset
|
4716 #endif |
2138 | 4717 |
4718 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4719 #ifdef TEST |
2138 | 4720 #undef malloc |
4721 #undef free | |
4722 #undef printf | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4723 |
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4724 #include "libavutil/lfg.h" |
2138 | 4725 |
5934 | 4726 int main(void){ |
2138 | 4727 int width=256; |
4728 int height=256; | |
4729 int buffer[2][width*height]; | |
4730 SnowContext s; | |
4731 int i; | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4732 AVLFG prng; |
2138 | 4733 s.spatial_decomposition_count=6; |
4734 s.spatial_decomposition_type=1; | |
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
9197
diff
changeset
|
4735 |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4736 av_lfg_init(&prng, 1); |
2967 | 4737 |
2138 | 4738 printf("testing 5/3 DWT\n"); |
4739 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4740 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4741 |
2951 | 4742 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4743 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4744 |
2138 | 4745 for(i=0; i<width*height; i++) |
9197 | 4746 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2138 | 4747 |
4748 printf("testing 9/7 DWT\n"); | |
4749 s.spatial_decomposition_type=0; | |
4750 for(i=0; i<width*height; i++) | |
9388
2313bf51945b
cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents:
9376
diff
changeset
|
4751 buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345; |
2967 | 4752 |
2951 | 4753 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
4754 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
2967 | 4755 |
2138 | 4756 for(i=0; i<width*height; i++) |
9197 | 4757 if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]); |
2967 | 4758 |
2951 | 4759 #if 0 |
2138 | 4760 printf("testing AC coder\n"); |
4761 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4762 ff_init_range_encoder(&s.c, buffer[0], 256*256); |
2138 | 4763 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4764 |
2138 | 4765 for(i=-256; i<256; i++){ |
4001 | 4766 put_symbol(&s.c, s.header_state, i*i*i/3*FFABS(i), 1); |
2138 | 4767 } |
2335 | 4768 ff_rac_terminate(&s.c); |
2138 | 4769 |
4770 memset(s.header_state, 0, sizeof(s.header_state)); | |
2335 | 4771 ff_init_range_decoder(&s.c, buffer[0], 256*256); |
2138 | 4772 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
2967 | 4773 |
2138 | 4774 for(i=-256; i<256; i++){ |
4775 int j; | |
4776 j= get_symbol(&s.c, s.header_state, 1); | |
4001 | 4777 if(j!=i*i*i/3*FFABS(i)) printf("fsck: %d != %d\n", i, j); |
2138 | 4778 } |
2951 | 4779 #endif |
6414 | 4780 { |
4781 int level, orientation, x, y; | |
4782 int64_t errors[8][4]; | |
4783 int64_t g=0; | |
4784 | |
4785 memset(errors, 0, sizeof(errors)); | |
4786 s.spatial_decomposition_count=3; | |
4787 s.spatial_decomposition_type=0; | |
4788 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4789 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
4790 int w= width >> (s.spatial_decomposition_count-level); | |
4791 int h= height >> (s.spatial_decomposition_count-level); | |
4792 int stride= width << (s.spatial_decomposition_count-level); | |
4793 DWTELEM *buf= buffer[0]; | |
4794 int64_t error=0; | |
4795 | |
4796 if(orientation&1) buf+=w; | |
4797 if(orientation>1) buf+=stride>>1; | |
4798 | |
4799 memset(buffer[0], 0, sizeof(int)*width*height); | |
4800 buf[w/2 + h/2*stride]= 256*256; | |
4801 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
4802 for(y=0; y<height; y++){ | |
4803 for(x=0; x<width; x++){ | |
4804 int64_t d= buffer[0][x + y*width]; | |
4805 error += d*d; | |
4806 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d); | |
4807 } | |
4808 if(FFABS(height/2-y)<9 && level==2) printf("\n"); | |
2138 | 4809 } |
6414 | 4810 error= (int)(sqrt(error)+0.5); |
4811 errors[level][orientation]= error; | |
8611 | 4812 if(g) g=av_gcd(g, error); |
6414 | 4813 else g= error; |
2138 | 4814 } |
4815 } | |
6414 | 4816 printf("static int const visual_weight[][4]={\n"); |
4817 for(level=0; level<s.spatial_decomposition_count; level++){ | |
4818 printf(" {"); | |
4819 for(orientation=0; orientation<4; orientation++){ | |
4820 printf("%8"PRId64",", errors[level][orientation]/g); | |
4821 } | |
4822 printf("},\n"); | |
2138 | 4823 } |
6414 | 4824 printf("};\n"); |
4825 { | |
2138 | 4826 int level=2; |
4827 int w= width >> (s.spatial_decomposition_count-level); | |
6168 | 4828 //int h= height >> (s.spatial_decomposition_count-level); |
2138 | 4829 int stride= width << (s.spatial_decomposition_count-level); |
4830 DWTELEM *buf= buffer[0]; | |
4831 int64_t error=0; | |
4832 | |
4833 buf+=w; | |
4834 buf+=stride>>1; | |
2967 | 4835 |
2138 | 4836 memset(buffer[0], 0, sizeof(int)*width*height); |
4837 #if 1 | |
4838 for(y=0; y<height; y++){ | |
4839 for(x=0; x<width; x++){ | |
4840 int tab[4]={0,2,3,1}; | |
4841 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)]; | |
4842 } | |
4843 } | |
2951 | 4844 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4845 #else |
4846 for(y=0; y<h; y++){ | |
4847 for(x=0; x<w; x++){ | |
4848 buf[x + y*stride ]=169; | |
4849 buf[x + y*stride-w]=64; | |
4850 } | |
4851 } | |
2951 | 4852 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
2138 | 4853 #endif |
4854 for(y=0; y<height; y++){ | |
4855 for(x=0; x<width; x++){ | |
4856 int64_t d= buffer[0][x + y*width]; | |
4857 error += d*d; | |
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4858 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d); |
2138 | 4859 } |
4001 | 4860 if(FFABS(height/2-y)<9) printf("\n"); |
2138 | 4861 } |
6414 | 4862 } |
4863 | |
2138 | 4864 } |
4865 return 0; | |
4866 } | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
6144
diff
changeset
|
4867 #endif /* TEST */ |