2 * copyright (c) 2006 Oded Shimon <ods15@ods15.dyndns.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 * Native Vorbis encoder.
22 * @author Oded Shimon <ods15@ods15.dyndns.org>
56 int * partition_to_class;
58 floor_class_t * classes;
62 floor1_entry_t * list;
94 int blocksize[2]; // in (1<<n) format
100 float * floor; // also used for tmp values for mdct
101 float * coeffs; // also used for residue after floor
105 codebook_t * codebooks;
111 residue_t * residues;
114 mapping_t * mappings;
117 vorbis_mode_t * modes;
127 static const uint8_t codebook0[] = {
128 2, 10, 8, 14, 7, 12, 11, 14, 1, 5, 3, 7, 4, 9, 7,
132 static const uint8_t codebook1[] = {
133 1, 4, 2, 6, 3, 7, 5, 7,
136 static const uint8_t codebook2[] = {
137 1, 5, 7, 21, 5, 8, 9, 21, 10, 9, 12, 20, 20, 16, 20,
138 20, 4, 8, 9, 20, 6, 8, 9, 20, 11, 11, 13, 20, 20, 15,
139 17, 20, 9, 11, 14, 20, 8, 10, 15, 20, 11, 13, 15, 20, 20,
140 20, 20, 20, 20, 20, 20, 20, 13, 20, 20, 20, 18, 18, 20, 20,
141 20, 20, 20, 20, 3, 6, 8, 20, 6, 7, 9, 20, 10, 9, 12,
142 20, 20, 20, 20, 20, 5, 7, 9, 20, 6, 6, 9, 20, 10, 9,
143 12, 20, 20, 20, 20, 20, 8, 10, 13, 20, 8, 9, 12, 20, 11,
144 10, 12, 20, 20, 20, 20, 20, 18, 20, 20, 20, 15, 17, 18, 20,
145 18, 17, 18, 20, 20, 20, 20, 20, 7, 10, 12, 20, 8, 9, 11,
146 20, 14, 13, 14, 20, 20, 20, 20, 20, 6, 9, 12, 20, 7, 8,
147 11, 20, 12, 11, 13, 20, 20, 20, 20, 20, 9, 11, 15, 20, 8,
148 10, 14, 20, 12, 11, 14, 20, 20, 20, 20, 20, 20, 20, 20, 20,
149 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 11, 16, 18,
150 20, 15, 15, 17, 20, 20, 17, 20, 20, 20, 20, 20, 20, 9, 14,
151 16, 20, 12, 12, 15, 20, 17, 15, 18, 20, 20, 20, 20, 20, 16,
152 19, 18, 20, 15, 16, 20, 20, 17, 17, 20, 20, 20, 20, 20, 20,
153 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
157 static const uint8_t codebook3[] = {
158 2, 3, 7, 13, 4, 4, 7, 15, 8, 6, 9, 17, 21, 16, 15,
159 21, 2, 5, 7, 11, 5, 5, 7, 14, 9, 7, 10, 16, 17, 15,
160 16, 21, 4, 7, 10, 17, 7, 7, 9, 15, 11, 9, 11, 16, 21,
161 18, 15, 21, 18, 21, 21, 21, 15, 17, 17, 19, 21, 19, 18, 20,
165 static const uint8_t codebook4[] = {
166 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6,
167 5, 6, 5, 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 5,
168 7, 5, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, 10, 6, 10,
169 6, 11, 6, 11, 7, 11, 7, 12, 7, 12, 7, 12, 7, 12, 7,
170 12, 7, 12, 7, 12, 7, 12, 8, 13, 8, 12, 8, 12, 8, 13,
171 8, 13, 9, 13, 9, 13, 9, 13, 9, 12, 10, 12, 10, 13, 10,
172 14, 11, 14, 12, 14, 13, 14, 13, 14, 14, 15, 16, 15, 15, 15,
173 14, 15, 17, 21, 22, 22, 21, 22, 22, 22, 22, 22, 22, 21, 21,
174 21, 21, 21, 21, 21, 21, 21, 21,
177 static const uint8_t codebook5[] = {
178 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 6, 5, 6, 5, 6,
179 5, 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 6, 9, 6,
183 static const uint8_t codebook6[] = {
184 8, 5, 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9,
185 4, 9, 4, 9, 4, 9, 4, 8, 4, 8, 4, 9, 5, 9, 5,
186 9, 5, 9, 5, 9, 6, 10, 6, 10, 7, 10, 8, 11, 9, 11,
187 11, 12, 13, 12, 14, 13, 15, 13, 15, 14, 16, 14, 17, 15, 17,
188 15, 15, 16, 16, 15, 16, 16, 16, 15, 18, 16, 15, 17, 17, 19,
189 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
190 19, 19, 19, 19, 19, 19,
193 static const uint8_t codebook7[] = {
194 1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6,
195 5, 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 9, 8, 10, 9,
199 static const uint8_t codebook8[] = {
200 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 5, 5, 6, 5, 6,
201 5, 7, 5, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 9, 8,
202 9, 9, 9, 9, 10, 10, 10, 11, 9, 12, 9, 12, 9, 15, 10,
203 14, 9, 13, 10, 13, 10, 12, 10, 12, 10, 13, 10, 12, 11, 13,
204 11, 14, 12, 13, 13, 14, 14, 13, 14, 15, 14, 16, 13, 13, 14,
205 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
206 16, 16, 16, 16, 15, 15,
209 static const uint8_t codebook9[] = {
210 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, 4, 5,
214 static const uint8_t codebook10[] = {
215 3, 3, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 5,
216 7, 5, 8, 6, 8, 6, 9, 7, 10, 7, 10, 8, 10, 8, 11,
220 static const uint8_t codebook11[] = {
221 3, 7, 3, 8, 3, 10, 3, 8, 3, 9, 3, 8, 4, 9, 4,
222 9, 5, 9, 6, 10, 6, 9, 7, 11, 7, 12, 9, 13, 10, 13,
223 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
224 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
225 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
229 static const uint8_t codebook12[] = {
230 4, 5, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4,
234 static const uint8_t codebook13[] = {
235 4, 2, 4, 2, 5, 3, 5, 4, 6, 6, 6, 7, 7, 8, 7,
236 8, 7, 8, 7, 9, 8, 9, 8, 9, 8, 10, 8, 11, 9, 12,
240 static const uint8_t codebook14[] = {
241 2, 5, 2, 6, 3, 6, 4, 7, 4, 7, 5, 9, 5, 11, 6,
242 11, 6, 11, 7, 11, 6, 11, 6, 11, 9, 11, 8, 11, 11, 11,
243 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
244 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
245 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10,
249 static const uint8_t codebook15[] = {
250 5, 6, 11, 11, 11, 11, 10, 10, 12, 11, 5, 2, 11, 5, 6,
251 6, 7, 9, 11, 13, 13, 10, 7, 11, 6, 7, 8, 9, 10, 12,
252 11, 5, 11, 6, 8, 7, 9, 11, 14, 15, 11, 6, 6, 8, 4,
253 5, 7, 8, 10, 13, 10, 5, 7, 7, 5, 5, 6, 8, 10, 11,
254 10, 7, 7, 8, 6, 5, 5, 7, 9, 9, 11, 8, 8, 11, 8,
255 7, 6, 6, 7, 9, 12, 11, 10, 13, 9, 9, 7, 7, 7, 9,
256 11, 13, 12, 15, 12, 11, 9, 8, 8, 8,
259 static const uint8_t codebook16[] = {
260 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0,
261 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0,
266 7, 8, 8, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 0, 0,
267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
269 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
270 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7,
271 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, 0, 0, 0, 0,
272 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
275 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
277 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
285 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
289 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
290 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
291 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
292 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
294 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
297 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
301 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
302 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
303 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
304 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
308 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0,
309 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8,
310 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
314 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0,
315 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
318 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
319 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0,
320 7, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0,
321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
322 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
323 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
324 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
325 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
326 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
327 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
328 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
329 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
330 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
331 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
333 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
339 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
340 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
341 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
342 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
343 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
344 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
345 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
346 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
347 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
348 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
349 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
350 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
351 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
352 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
353 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
354 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
355 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
356 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
357 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8,
358 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0,
359 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
360 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
361 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
362 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, 0,
363 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 7, 8, 9,
364 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
365 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
366 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
367 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
368 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0,
372 static const uint8_t codebook17[] = {
373 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0,
374 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0,
375 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 10, 10, 0, 0,
376 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0,
377 0, 7, 7, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0,
378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
379 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0,
384 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0,
385 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0,
386 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
387 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
388 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
389 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
390 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
391 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0,
392 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0,
393 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0,
394 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
395 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
396 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
397 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
398 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
399 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 10, 0, 0,
400 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, 10, 10, 0, 0,
401 0, 0, 0, 0, 0, 8, 10, 10, 0, 0, 0, 9, 9, 0, 0,
402 0, 9, 9, 0, 0, 0, 10, 10,
405 static const uint8_t codebook18[] = {
406 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
407 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6,
408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
409 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0,
410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
411 6, 6, 6, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
412 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 7, 9, 9,
415 static const uint8_t codebook19[] = {
416 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0,
417 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5,
418 6, 6, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0,
419 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0,
420 0, 0, 0, 0, 0, 0, 9, 9,
423 static const uint8_t codebook20[] = {
424 1, 3, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 7,
425 8, 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7,
426 8, 8, 8, 8, 10, 10, 0, 0, 0, 8, 8, 8, 8, 10, 10,
427 0, 0, 0, 9, 9, 9, 9, 10, 10, 0, 0, 0, 9, 9, 9,
428 9, 10, 10, 0, 0, 0, 10, 10, 10, 10, 11, 11, 0, 0, 0,
429 0, 0, 10, 10, 11, 11,
432 static const uint8_t codebook21[] = {
433 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10,
434 11, 10, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10,
435 10, 10, 11, 11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,
436 10, 10, 10, 10, 11, 11, 0, 6, 6, 7, 7, 8, 8, 9, 9,
437 9, 9, 10, 10, 11, 11, 11, 11, 0, 0, 0, 7, 7, 8, 8,
438 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 0, 0, 0, 8, 8,
439 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 0, 0, 0,
440 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 0,
441 0, 0, 9, 9, 9, 9, 10, 10, 10, 10, 11, 10, 11, 11, 12,
442 12, 0, 0, 0, 0, 0, 9, 9, 10, 10, 10, 10, 11, 11, 11,
443 11, 12, 12, 0, 0, 0, 0, 0, 9, 8, 9, 9, 10, 10, 11,
444 11, 12, 12, 12, 12, 0, 0, 0, 0, 0, 8, 8, 9, 9, 10,
445 10, 11, 11, 12, 11, 12, 12, 0, 0, 0, 0, 0, 9, 10, 10,
446 10, 11, 11, 11, 11, 12, 12, 13, 13, 0, 0, 0, 0, 0, 0,
447 0, 10, 10, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0, 0, 0,
448 0, 0, 0, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 0, 0,
449 0, 0, 0, 0, 0, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13,
450 0, 0, 0, 0, 0, 0, 0, 11, 11, 12, 12, 12, 12, 13, 13,
451 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12,
455 static const uint8_t codebook22[] = {
456 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7, 10, 9, 9,
457 11, 9, 9, 4, 7, 7, 10, 9, 9, 11, 9, 9, 7, 10, 10,
458 11, 11, 10, 12, 11, 11, 6, 9, 9, 11, 10, 10, 11, 10, 10,
459 6, 9, 9, 11, 10, 10, 11, 10, 10, 7, 11, 11, 11, 11, 11,
460 12, 11, 11, 6, 9, 9, 11, 10, 10, 11, 10, 10, 6, 9, 9,
461 11, 10, 10, 11, 10, 10,
464 static const uint8_t codebook23[] = {
465 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 10, 5, 5, 6,
466 6, 7, 7, 8, 8, 8, 8, 10, 5, 5, 6, 6, 7, 7, 8,
467 8, 8, 8, 10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 10,
468 10, 10, 7, 7, 8, 7, 8, 8, 8, 8, 10, 10, 10, 8, 8,
469 8, 8, 8, 8, 8, 8, 10, 10, 10, 7, 8, 8, 8, 8, 8,
470 8, 8, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10,
471 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 9,
472 9, 8, 8, 9, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8,
476 static const uint8_t codebook24[] = {
477 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 6, 5,
478 5, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 7, 5, 5, 7,
479 7, 8, 8, 8, 8, 9, 9, 11, 10, 0, 8, 8, 8, 8, 9,
480 9, 9, 9, 10, 10, 11, 11, 0, 8, 8, 8, 8, 9, 9, 9,
481 9, 10, 10, 11, 11, 0, 12, 12, 9, 9, 10, 10, 10, 10, 11,
482 11, 11, 12, 0, 13, 13, 9, 9, 10, 10, 10, 10, 11, 11, 12,
483 12, 0, 0, 0, 10, 10, 10, 10, 11, 11, 12, 12, 12, 12, 0,
484 0, 0, 10, 10, 10, 10, 11, 11, 12, 12, 12, 12, 0, 0, 0,
485 14, 14, 11, 11, 11, 11, 12, 12, 13, 13, 0, 0, 0, 14, 14,
486 11, 11, 11, 11, 12, 12, 13, 13, 0, 0, 0, 0, 0, 12, 12,
487 12, 12, 13, 13, 14, 13, 0, 0, 0, 0, 0, 13, 13, 12, 12,
491 static const uint8_t codebook25[] = {
492 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5,
493 6, 5, 5, 5, 5, 6, 6, 6, 5, 5,
496 static const uint8_t codebook26[] = {
497 1, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 9,
498 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 9, 7, 12,
499 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
500 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12,
501 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
502 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
503 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
504 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
505 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
506 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
507 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
511 static const uint8_t codebook27[] = {
512 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 9, 10, 10, 10, 10,
513 6, 5, 5, 7, 7, 8, 8, 10, 8, 11, 10, 12, 12, 13, 13,
514 6, 5, 5, 7, 7, 8, 8, 10, 9, 11, 11, 12, 12, 13, 12,
515 18, 8, 8, 8, 8, 9, 9, 10, 9, 11, 10, 12, 12, 13, 13,
516 18, 8, 8, 8, 8, 9, 9, 10, 10, 11, 11, 13, 12, 14, 13,
517 18, 11, 11, 9, 9, 10, 10, 11, 11, 11, 12, 13, 12, 13, 14,
518 18, 11, 11, 9, 8, 11, 10, 11, 11, 11, 11, 12, 12, 14, 13,
519 18, 18, 18, 10, 11, 10, 11, 12, 12, 12, 12, 13, 12, 14, 13,
520 18, 18, 18, 10, 11, 11, 9, 12, 11, 12, 12, 12, 13, 13, 13,
521 18, 18, 17, 14, 14, 11, 11, 12, 12, 13, 12, 14, 12, 14, 13,
522 18, 18, 18, 14, 14, 11, 10, 12, 9, 12, 13, 13, 13, 13, 13,
523 18, 18, 17, 16, 18, 13, 13, 12, 12, 13, 11, 14, 12, 14, 14,
524 17, 18, 18, 17, 18, 13, 12, 13, 10, 12, 11, 14, 14, 14, 14,
525 17, 18, 18, 18, 18, 15, 16, 12, 12, 13, 10, 14, 12, 14, 15,
526 18, 18, 18, 16, 17, 16, 14, 12, 11, 13, 10, 13, 13, 14, 15,
529 static const uint8_t codebook28[] = {
530 2, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
531 8, 8, 10, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 8, 9,
532 9, 9, 9, 9, 10, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
533 9, 9, 9, 9, 9, 9, 10, 7, 7, 7, 7, 8, 8, 8, 8,
534 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 7, 7, 8, 8,
535 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 8, 8,
536 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10,
537 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10,
538 10, 10, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10,
539 9, 10, 10, 10, 11, 11, 9, 9, 9, 9, 9, 9, 9, 9, 9,
540 9, 9, 9, 11, 10, 11, 11, 11, 9, 9, 9, 9, 9, 9, 10,
541 10, 9, 9, 10, 9, 11, 10, 11, 11, 11, 9, 9, 9, 9, 9,
542 9, 9, 9, 10, 10, 10, 9, 11, 11, 11, 11, 11, 9, 9, 9,
543 9, 10, 10, 9, 9, 9, 9, 10, 9, 11, 11, 11, 11, 11, 11,
544 11, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,
545 11, 11, 11, 10, 9, 10, 10, 9, 10, 9, 9, 10, 9, 11, 10,
546 10, 11, 11, 11, 11, 9, 10, 9, 9, 9, 9, 10, 10, 10, 10,
547 11, 11, 11, 11, 11, 11, 10, 10, 10, 9, 9, 10, 9, 10, 9,
548 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 9, 9, 9, 9,
552 static const struct {
556 const uint8_t * clens;
560 const uint8_t * quant;
562 { 2, 16, 16, codebook0, 0 },
563 { 2, 8, 8, codebook1, 0 },
564 { 2, 256, 256, codebook2, 0 },
565 { 2, 64, 64, codebook3, 0 },
566 { 2, 128, 128, codebook4, 0 },
567 { 2, 32, 32, codebook5, 0 },
568 { 2, 96, 96, codebook6, 0 },
569 { 2, 32, 32, codebook7, 0 },
570 { 2, 96, 96, codebook8, 0 },
571 { 2, 17, 17, codebook9, 0 },
572 { 2, 32, 32, codebook10, 0 },
573 { 2, 78, 78, codebook11, 0 },
574 { 2, 17, 17, codebook12, 0 },
575 { 2, 32, 32, codebook13, 0 },
576 { 2, 78, 78, codebook14, 0 },
577 { 2, 100, 100, codebook15, 0 },
578 { 8, 1641, 6561, codebook16, 1, -1.0, 1.0, (const uint8_t[]){ 1, 0, 2, } },
579 { 4, 443, 625, codebook17, 1, -2.0, 1.0, (const uint8_t[]){ 2, 1, 3, 0, 4, } },
580 { 4, 105, 625, codebook18, 1, -2.0, 1.0, (const uint8_t[]){ 2, 1, 3, 0, 4, } },
581 { 2, 68, 81, codebook19, 1, -4.0, 1.0, (const uint8_t[]){ 4, 3, 5, 2, 6, 1, 7, 0, 8, } },
582 { 2, 81, 81, codebook20, 1, -4.0, 1.0, (const uint8_t[]){ 4, 3, 5, 2, 6, 1, 7, 0, 8, } },
583 { 2, 289, 289, codebook21, 1, -8.0, 1.0, (const uint8_t[]){ 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, 0, 16, } },
584 { 4, 81, 81, codebook22, 1, -11.0, 11.0, (const uint8_t[]){ 1, 0, 2, } },
585 { 2, 121, 121, codebook23, 1, -5.0, 1.0, (const uint8_t[]){ 5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10, } },
586 { 2, 169, 169, codebook24, 1, -30.0, 5.0, (const uint8_t[]){ 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12, } },
587 { 2, 25, 25, codebook25, 1, -2.0, 1.0, (const uint8_t[]){ 2, 1, 3, 0, 4, } },
588 { 2, 169, 169, codebook26, 1, -1530.0, 255.0, (const uint8_t[]){ 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12, } },
589 { 2, 225, 225, codebook27, 1, -119.0, 17.0, (const uint8_t[]){ 7, 6, 8, 5, 9, 4, 10, 3, 11, 2, 12, 1, 13, 0, 14, } },
590 { 2, 289, 289, codebook28, 1, -8.0, 1.0, (const uint8_t[]){ 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, 0, 16, } },
593 static inline void init_put_bits(PutBitContext * pb, uint8_t * buf, int buffer_len) {
594 pb->total = buffer_len * 8;
600 static void put_bits(PutBitContext * pb, int bits, uint64_t val) {
601 if ((pb->total_pos += bits) >= pb->total) return;
604 if (pb->pos > bits) {
605 *pb->buf_ptr |= val << (8 - pb->pos);
609 *pb->buf_ptr++ |= (val << (8 - pb->pos)) & 0xFF;
615 for (; bits >= 8; bits -= 8) {
616 *pb->buf_ptr++ = val & 0xFF;
625 static inline void flush_put_bits(PutBitContext * pb) {
628 static inline int put_bits_count(PutBitContext * pb) {
629 return pb->total_pos;
632 static inline void put_codeword(PutBitContext * pb, codebook_t * cb, int entry) {
634 assert(entry < cb->nentries);
635 assert(cb->lens[entry]);
636 put_bits(pb, cb->lens[entry], cb->codewords[entry]);
639 static int cb_lookup_vals(int lookup, int dimentions, int entries) {
640 if (lookup == 1) return ff_vorbis_nth_root(entries, dimentions);
641 else if (lookup == 2) return dimentions * entries;
645 static void ready_codebook(codebook_t * cb) {
648 ff_vorbis_len2vlc(cb->lens, cb->codewords, cb->nentries);
650 if (!cb->lookup) cb->pow2 = cb->dimentions = NULL;
652 int vals = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
653 cb->dimentions = av_malloc(sizeof(float) * cb->nentries * cb->ndimentions);
654 cb->pow2 = av_mallocz(sizeof(float) * cb->nentries);
655 for (i = 0; i < cb->nentries; i++) {
659 for (j = 0; j < cb->ndimentions; j++) {
661 if (cb->lookup == 1) off = (i / div) % vals; // lookup type 1
662 else off = i * cb->ndimentions + j; // lookup type 2
664 cb->dimentions[i * cb->ndimentions + j] = last + cb->min + cb->quantlist[off] * cb->delta;
665 if (cb->seq_p) last = cb->dimentions[i * cb->ndimentions + j];
666 cb->pow2[i] += cb->dimentions[i * cb->ndimentions + j]*cb->dimentions[i * cb->ndimentions + j];
675 static void ready_residue(residue_t * rc, venc_context_t * venc) {
677 assert(rc->type == 2);
678 rc->maxes = av_mallocz(sizeof(float[2]) * rc->classifications);
679 for (i = 0; i < rc->classifications; i++) {
682 for (j = 0; j < 8; j++) if (rc->books[i][j] != -1) break;
683 if (j == 8) continue; // zero
684 cb = &venc->codebooks[rc->books[i][j]];
685 assert(cb->ndimentions >= 2);
688 for (j = 0; j < cb->nentries; j++) {
690 if (!cb->lens[j]) continue;
691 a = fabs(cb->dimentions[j * cb->ndimentions]);
692 if (a > rc->maxes[i][0]) rc->maxes[i][0] = a;
693 a = fabs(cb->dimentions[j * cb->ndimentions + 1]);
694 if (a > rc->maxes[i][1]) rc->maxes[i][1] = a;
698 for (i = 0; i < rc->classifications; i++) {
699 rc->maxes[i][0] += 0.8;
700 rc->maxes[i][1] += 0.8;
704 static void create_vorbis_context(venc_context_t * venc, AVCodecContext * avccontext) {
710 venc->channels = avccontext->channels;
711 venc->sample_rate = avccontext->sample_rate;
712 venc->blocksize[0] = venc->blocksize[1] = 11;
714 venc->ncodebooks = sizeof(cvectors)/sizeof(cvectors[0]);
715 venc->codebooks = av_malloc(sizeof(codebook_t) * venc->ncodebooks);
717 // codebook 0..14 - floor1 book, values 0..255
718 // codebook 15 residue masterbook
719 // codebook 16..29 residue
720 for (book = 0; book < venc->ncodebooks; book++) {
721 codebook_t * cb = &venc->codebooks[book];
723 cb->ndimentions = cvectors[book].dim;
724 cb->nentries = cvectors[book].real_len;
725 cb->min = cvectors[book].min;
726 cb->delta = cvectors[book].delta;
727 cb->lookup = cvectors[book].lookup;
730 cb->lens = av_malloc(sizeof(uint8_t) * cb->nentries);
731 cb->codewords = av_malloc(sizeof(uint32_t) * cb->nentries);
732 memcpy(cb->lens, cvectors[book].clens, cvectors[book].len);
733 memset(cb->lens + cvectors[book].len, 0, cb->nentries - cvectors[book].len);
736 vals = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
737 cb->quantlist = av_malloc(sizeof(int) * vals);
738 for (i = 0; i < vals; i++) cb->quantlist[i] = cvectors[book].quant[i];
740 cb->quantlist = NULL;
746 venc->floors = av_malloc(sizeof(floor_t) * venc->nfloors);
749 fc = &venc->floors[0];
751 fc->partition_to_class = av_malloc(sizeof(int) * fc->partitions);
753 for (i = 0; i < fc->partitions; i++) {
754 int a[] = {0,1,2,2,3,3,4,4};
755 fc->partition_to_class[i] = a[i];
756 fc->nclasses = FFMAX(fc->nclasses, fc->partition_to_class[i]);
759 fc->classes = av_malloc(sizeof(floor_class_t) * fc->nclasses);
760 for (i = 0; i < fc->nclasses; i++) {
761 floor_class_t * c = &fc->classes[i];
763 int dim[] = {3,4,3,4,3};
764 int subclass[] = {0,1,1,2,2};
765 int masterbook[] = {0/*none*/,0,1,2,3};
770 (int[]){ -1, 9, 10, 11 },
771 (int[]){ -1, 12, 13, 14 },
774 c->subclass = subclass[i];
775 c->masterbook = masterbook[i];
776 books = (1 << c->subclass);
777 c->books = av_malloc(sizeof(int) * books);
778 for (j = 0; j < books; j++) c->books[j] = nbooks[i][j];
781 fc->rangebits = venc->blocksize[0] - 1;
784 for (i = 0; i < fc->partitions; i++)
785 fc->values += fc->classes[fc->partition_to_class[i]].dim;
787 fc->list = av_malloc(sizeof(floor1_entry_t) * fc->values);
789 fc->list[1].x = 1 << fc->rangebits;
790 for (i = 2; i < fc->values; i++) {
791 static const int a[] = {
792 93, 23,372, 6, 46,186,750, 14, 33, 65,
793 130,260,556, 3, 10, 18, 28, 39, 55, 79,
794 111,158,220,312,464,650,850
796 fc->list[i].x = a[i - 2];
798 ff_vorbis_ready_floor1_list(fc->list, fc->values);
801 venc->residues = av_malloc(sizeof(residue_t) * venc->nresidues);
804 rc = &venc->residues[0];
808 rc->partition_size = 32;
809 rc->classifications = 10;
811 rc->books = av_malloc(sizeof(*rc->books) * rc->classifications);
813 static const int8_t a[10][8] = {
814 { -1, -1, -1, -1, -1, -1, -1, -1, },
815 { -1, -1, 16, -1, -1, -1, -1, -1, },
816 { -1, -1, 17, -1, -1, -1, -1, -1, },
817 { -1, -1, 18, -1, -1, -1, -1, -1, },
818 { -1, -1, 19, -1, -1, -1, -1, -1, },
819 { -1, -1, 20, -1, -1, -1, -1, -1, },
820 { -1, -1, 21, -1, -1, -1, -1, -1, },
821 { 22, 23, -1, -1, -1, -1, -1, -1, },
822 { 24, 25, -1, -1, -1, -1, -1, -1, },
823 { 26, 27, 28, -1, -1, -1, -1, -1, },
825 memcpy(rc->books, a, sizeof a);
827 ready_residue(rc, venc);
830 venc->mappings = av_malloc(sizeof(mapping_t) * venc->nmappings);
833 mc = &venc->mappings[0];
835 mc->mux = av_malloc(sizeof(int) * venc->channels);
836 for (i = 0; i < venc->channels; i++) mc->mux[i] = 0;
837 mc->floor = av_malloc(sizeof(int) * mc->submaps);
838 mc->residue = av_malloc(sizeof(int) * mc->submaps);
839 for (i = 0; i < mc->submaps; i++) {
843 mc->coupling_steps = venc->channels == 2 ? 1 : 0;
844 mc->magnitude = av_malloc(sizeof(int) * mc->coupling_steps);
845 mc->angle = av_malloc(sizeof(int) * mc->coupling_steps);
846 if (mc->coupling_steps) {
847 mc->magnitude[0] = 0;
852 venc->modes = av_malloc(sizeof(vorbis_mode_t) * venc->nmodes);
855 venc->modes[0].blockflag = 0;
856 venc->modes[0].mapping = 0;
858 venc->have_saved = 0;
859 venc->saved = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2);
860 venc->samples = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]));
861 venc->floor = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2);
862 venc->coeffs = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2);
864 venc->win[0] = ff_vorbis_vwin[venc->blocksize[0] - 6];
865 venc->win[1] = ff_vorbis_vwin[venc->blocksize[1] - 6];
867 ff_mdct_init(&venc->mdct[0], venc->blocksize[0], 0);
868 ff_mdct_init(&venc->mdct[1], venc->blocksize[1], 0);
871 static void put_float(PutBitContext * pb, float f) {
874 mant = (int)ldexp(frexp(f, &exp), 20);
876 if (mant < 0) { res |= (1 << 31); mant = -mant; }
877 res |= mant | (exp << 21);
878 put_bits(pb, 32, res);
881 static void put_codebook_header(PutBitContext * pb, codebook_t * cb) {
885 put_bits(pb, 24, 0x564342); //magic
886 put_bits(pb, 16, cb->ndimentions);
887 put_bits(pb, 24, cb->nentries);
889 for (i = 1; i < cb->nentries; i++) if (cb->lens[i] < cb->lens[i-1]) break;
890 if (i == cb->nentries) ordered = 1;
892 put_bits(pb, 1, ordered);
894 int len = cb->lens[0];
895 put_bits(pb, 5, len - 1);
897 while (i < cb->nentries) {
899 for (j = 0; j+i < cb->nentries; j++) if (cb->lens[j+i] != len) break;
900 put_bits(pb, ilog(cb->nentries - i), j);
906 for (i = 0; i < cb->nentries; i++) if (!cb->lens[i]) break;
907 if (i != cb->nentries) sparse = 1;
908 put_bits(pb, 1, sparse);
910 for (i = 0; i < cb->nentries; i++) {
911 if (sparse) put_bits(pb, 1, !!cb->lens[i]);
912 if (cb->lens[i]) put_bits(pb, 5, cb->lens[i] - 1);
916 put_bits(pb, 4, cb->lookup);
918 int tmp = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
919 int bits = ilog(cb->quantlist[0]);
921 for (i = 1; i < tmp; i++) bits = FFMAX(bits, ilog(cb->quantlist[i]));
923 put_float(pb, cb->min);
924 put_float(pb, cb->delta);
926 put_bits(pb, 4, bits - 1);
927 put_bits(pb, 1, cb->seq_p);
929 for (i = 0; i < tmp; i++) put_bits(pb, bits, cb->quantlist[i]);
933 static void put_floor_header(PutBitContext * pb, floor_t * fc) {
936 put_bits(pb, 16, 1); // type, only floor1 is supported
938 put_bits(pb, 5, fc->partitions);
940 for (i = 0; i < fc->partitions; i++) put_bits(pb, 4, fc->partition_to_class[i]);
942 for (i = 0; i < fc->nclasses; i++) {
945 put_bits(pb, 3, fc->classes[i].dim - 1);
946 put_bits(pb, 2, fc->classes[i].subclass);
948 if (fc->classes[i].subclass) put_bits(pb, 8, fc->classes[i].masterbook);
950 books = (1 << fc->classes[i].subclass);
952 for (j = 0; j < books; j++) put_bits(pb, 8, fc->classes[i].books[j] + 1);
955 put_bits(pb, 2, fc->multiplier - 1);
956 put_bits(pb, 4, fc->rangebits);
958 for (i = 2; i < fc->values; i++) put_bits(pb, fc->rangebits, fc->list[i].x);
961 static void put_residue_header(PutBitContext * pb, residue_t * rc) {
964 put_bits(pb, 16, rc->type);
966 put_bits(pb, 24, rc->begin);
967 put_bits(pb, 24, rc->end);
968 put_bits(pb, 24, rc->partition_size - 1);
969 put_bits(pb, 6, rc->classifications - 1);
970 put_bits(pb, 8, rc->classbook);
972 for (i = 0; i < rc->classifications; i++) {
974 for (j = 0; j < 8; j++) tmp |= (rc->books[i][j] != -1) << j;
976 put_bits(pb, 3, tmp & 7);
977 put_bits(pb, 1, tmp > 7);
979 if (tmp > 7) put_bits(pb, 5, tmp >> 3);
982 for (i = 0; i < rc->classifications; i++) {
984 for (j = 0; j < 8; j++)
985 if (rc->books[i][j] != -1)
986 put_bits(pb, 8, rc->books[i][j]);
990 static int put_main_header(venc_context_t * venc, uint8_t ** out) {
993 uint8_t buffer[50000] = {0}, * p = buffer;
994 int buffer_len = sizeof buffer;
997 // identification header
998 init_put_bits(&pb, p, buffer_len);
999 put_bits(&pb, 8, 1); //magic
1000 for (i = 0; "vorbis"[i]; i++) put_bits(&pb, 8, "vorbis"[i]);
1001 put_bits(&pb, 32, 0); // version
1002 put_bits(&pb, 8, venc->channels);
1003 put_bits(&pb, 32, venc->sample_rate);
1004 put_bits(&pb, 32, 0); // bitrate
1005 put_bits(&pb, 32, 0); // bitrate
1006 put_bits(&pb, 32, 0); // bitrate
1007 put_bits(&pb, 4, venc->blocksize[0]);
1008 put_bits(&pb, 4, venc->blocksize[1]);
1009 put_bits(&pb, 1, 1); // framing
1011 flush_put_bits(&pb);
1012 hlens[0] = (put_bits_count(&pb) + 7) / 8;
1013 buffer_len -= hlens[0];
1017 init_put_bits(&pb, p, buffer_len);
1018 put_bits(&pb, 8, 3); //magic
1019 for (i = 0; "vorbis"[i]; i++) put_bits(&pb, 8, "vorbis"[i]);
1020 put_bits(&pb, 32, 0); // vendor length TODO
1021 put_bits(&pb, 32, 0); // amount of comments
1022 put_bits(&pb, 1, 1); // framing
1024 flush_put_bits(&pb);
1025 hlens[1] = (put_bits_count(&pb) + 7) / 8;
1026 buffer_len -= hlens[1];
1030 init_put_bits(&pb, p, buffer_len);
1031 put_bits(&pb, 8, 5); //magic
1032 for (i = 0; "vorbis"[i]; i++) put_bits(&pb, 8, "vorbis"[i]);
1035 put_bits(&pb, 8, venc->ncodebooks - 1);
1036 for (i = 0; i < venc->ncodebooks; i++) put_codebook_header(&pb, &venc->codebooks[i]);
1038 // time domain, reserved, zero
1039 put_bits(&pb, 6, 0);
1040 put_bits(&pb, 16, 0);
1043 put_bits(&pb, 6, venc->nfloors - 1);
1044 for (i = 0; i < venc->nfloors; i++) put_floor_header(&pb, &venc->floors[i]);
1047 put_bits(&pb, 6, venc->nresidues - 1);
1048 for (i = 0; i < venc->nresidues; i++) put_residue_header(&pb, &venc->residues[i]);
1051 put_bits(&pb, 6, venc->nmappings - 1);
1052 for (i = 0; i < venc->nmappings; i++) {
1053 mapping_t * mc = &venc->mappings[i];
1055 put_bits(&pb, 16, 0); // mapping type
1057 put_bits(&pb, 1, mc->submaps > 1);
1058 if (mc->submaps > 1) put_bits(&pb, 4, mc->submaps - 1);
1060 put_bits(&pb, 1, !!mc->coupling_steps);
1061 if (mc->coupling_steps) {
1062 put_bits(&pb, 8, mc->coupling_steps - 1);
1063 for (j = 0; j < mc->coupling_steps; j++) {
1064 put_bits(&pb, ilog(venc->channels - 1), mc->magnitude[j]);
1065 put_bits(&pb, ilog(venc->channels - 1), mc->angle[j]);
1069 put_bits(&pb, 2, 0); // reserved
1071 if (mc->submaps > 1) for (j = 0; j < venc->channels; j++) put_bits(&pb, 4, mc->mux[j]);
1073 for (j = 0; j < mc->submaps; j++) {
1074 put_bits(&pb, 8, 0); // reserved time configuration
1075 put_bits(&pb, 8, mc->floor[j]);
1076 put_bits(&pb, 8, mc->residue[j]);
1081 put_bits(&pb, 6, venc->nmodes - 1);
1082 for (i = 0; i < venc->nmodes; i++) {
1083 put_bits(&pb, 1, venc->modes[i].blockflag);
1084 put_bits(&pb, 16, 0); // reserved window type
1085 put_bits(&pb, 16, 0); // reserved transform type
1086 put_bits(&pb, 8, venc->modes[i].mapping);
1089 put_bits(&pb, 1, 1); // framing
1091 flush_put_bits(&pb);
1092 hlens[2] = (put_bits_count(&pb) + 7) / 8;
1094 len = hlens[0] + hlens[1] + hlens[2];
1095 p = *out = av_mallocz(64 + len + len/255);
1098 p += av_xiphlacing(p, hlens[0]);
1099 p += av_xiphlacing(p, hlens[1]);
1101 for (i = 0; i < 3; i++) {
1102 memcpy(p, buffer + buffer_len, hlens[i]);
1104 buffer_len += hlens[i];
1110 static float get_floor_average(floor_t * fc, float * coeffs, int i) {
1111 int begin = fc->list[fc->list[FFMAX(i-1, 0)].sort].x;
1112 int end = fc->list[fc->list[FFMIN(i+1, fc->values - 1)].sort].x;
1116 for (j = begin; j < end; j++) average += fabs(coeffs[j]);
1117 return average / (end - begin);
1120 static void floor_fit(venc_context_t * venc, floor_t * fc, float * coeffs, uint_fast16_t * posts, int samples) {
1121 int range = 255 / fc->multiplier + 1;
1123 float tot_average = 0.;
1124 float averages[fc->values];
1125 for (i = 0; i < fc->values; i++) tot_average += averages[i] = get_floor_average(fc, coeffs, i);
1126 tot_average /= fc->values;
1127 tot_average /= venc->quality;
1129 for (i = 0; i < fc->values; i++) {
1130 int position = fc->list[fc->list[i].sort].x;
1131 float average = averages[i];
1134 average /= pow(average, 0.5) / tot_average * pow(0.8, position/200.); // MAGIC!
1135 for (j = 0; j < range - 1; j++) if (ff_vorbis_floor1_inverse_db_table[j * fc->multiplier] > average) break;
1136 posts[fc->list[i].sort] = j;
1140 static int render_point(int x0, int y0, int x1, int y1, int x) {
1141 return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
1144 static void floor_encode(venc_context_t * venc, floor_t * fc, PutBitContext * pb, uint_fast16_t * posts, float * floor, int samples) {
1145 int range = 255 / fc->multiplier + 1;
1146 int coded[fc->values]; // first 2 values are unused
1149 put_bits(pb, 1, 1); // non zero
1150 put_bits(pb, ilog(range - 1), posts[0]);
1151 put_bits(pb, ilog(range - 1), posts[1]);
1152 coded[0] = coded[1] = 1;
1154 for (i = 2; i < fc->values; i++) {
1155 int predicted = render_point(fc->list[fc->list[i].low].x,
1156 posts[fc->list[i].low],
1157 fc->list[fc->list[i].high].x,
1158 posts[fc->list[i].high],
1160 int highroom = range - predicted;
1161 int lowroom = predicted;
1162 int room = FFMIN(highroom, lowroom);
1163 if (predicted == posts[i]) {
1164 coded[i] = 0; // must be used later as flag!
1167 if (!coded[fc->list[i].low]) coded[fc->list[i].low] = -1;
1168 if (!coded[fc->list[i].high]) coded[fc->list[i].high] = -1;
1170 if (posts[i] > predicted) {
1171 if (posts[i] - predicted > room) coded[i] = posts[i] - predicted + lowroom;
1172 else coded[i] = (posts[i] - predicted) << 1;
1174 if (predicted - posts[i] > room) coded[i] = predicted - posts[i] + highroom - 1;
1175 else coded[i] = ((predicted - posts[i]) << 1) - 1;
1180 for (i = 0; i < fc->partitions; i++) {
1181 floor_class_t * c = &fc->classes[fc->partition_to_class[i]];
1182 int k, cval = 0, csub = 1<<c->subclass;
1184 codebook_t * book = &venc->codebooks[c->masterbook];
1186 for (k = 0; k < c->dim; k++) {
1188 for (l = 0; l < csub; l++) {
1190 if (c->books[l] != -1) maxval = venc->codebooks[c->books[l]].nentries;
1191 // coded could be -1, but this still works, cause thats 0
1192 if (coded[counter + k] < maxval) break;
1195 cval |= l << cshift;
1196 cshift += c->subclass;
1198 put_codeword(pb, book, cval);
1200 for (k = 0; k < c->dim; k++) {
1201 int book = c->books[cval & (csub-1)];
1202 int entry = coded[counter++];
1203 cval >>= c->subclass;
1204 if (book == -1) continue;
1205 if (entry == -1) entry = 0;
1206 put_codeword(pb, &venc->codebooks[book], entry);
1210 ff_vorbis_floor1_render_list(fc->list, fc->values, posts, coded, fc->multiplier, floor, samples);
1213 static float * put_vector(codebook_t * book, PutBitContext * pb, float * num) {
1215 float distance = FLT_MAX;
1216 assert(book->dimentions);
1217 for (i = 0; i < book->nentries; i++) {
1218 float * vec = book->dimentions + i * book->ndimentions, d = book->pow2[i];
1220 if (!book->lens[i]) continue;
1221 for (j = 0; j < book->ndimentions; j++) d -= vec[j] * num[j];
1227 put_codeword(pb, book, entry);
1228 return &book->dimentions[entry * book->ndimentions];
1231 static void residue_encode(venc_context_t * venc, residue_t * rc, PutBitContext * pb, float * coeffs, int samples, int real_ch) {
1232 int pass, i, j, p, k;
1233 int psize = rc->partition_size;
1234 int partitions = (rc->end - rc->begin) / psize;
1235 int channels = (rc->type == 2) ? 1 : real_ch;
1236 int classes[channels][partitions];
1237 int classwords = venc->codebooks[rc->classbook].ndimentions;
1239 assert(rc->type == 2);
1240 assert(real_ch == 2);
1241 for (p = 0; p < partitions; p++) {
1242 float max1 = 0., max2 = 0.;
1243 int s = rc->begin + p * psize;
1244 for (k = s; k < s + psize; k += 2) {
1245 max1 = FFMAX(max1, fabs(coeffs[ k / real_ch]));
1246 max2 = FFMAX(max2, fabs(coeffs[samples + k / real_ch]));
1249 for (i = 0; i < rc->classifications - 1; i++) {
1250 if (max1 < rc->maxes[i][0] && max2 < rc->maxes[i][1]) break;
1255 for (pass = 0; pass < 8; pass++) {
1257 while (p < partitions) {
1258 if (pass == 0) for (j = 0; j < channels; j++) {
1259 codebook_t * book = &venc->codebooks[rc->classbook];
1261 for (i = 0; i < classwords; i++) {
1262 entry *= rc->classifications;
1263 entry += classes[j][p + i];
1265 put_codeword(pb, book, entry);
1267 for (i = 0; i < classwords && p < partitions; i++, p++) {
1268 for (j = 0; j < channels; j++) {
1269 int nbook = rc->books[classes[j][p]][pass];
1270 codebook_t * book = &venc->codebooks[nbook];
1271 float * buf = coeffs + samples*j + rc->begin + p*psize;
1272 if (nbook == -1) continue;
1274 assert(rc->type == 0 || rc->type == 2);
1275 assert(!(psize % book->ndimentions));
1277 if (rc->type == 0) {
1278 for (k = 0; k < psize; k += book->ndimentions) {
1279 float * a = put_vector(book, pb, &buf[k]);
1281 for (l = 0; l < book->ndimentions; l++) buf[k + l] -= a[l];
1284 int s = rc->begin + p * psize, a1, b1;
1285 a1 = (s % real_ch) * samples;
1287 s = real_ch * samples;
1288 for (k = 0; k < psize; k += book->ndimentions) {
1289 int dim, a2 = a1, b2 = b1;
1290 float vec[book->ndimentions], * pv = vec;
1291 for (dim = book->ndimentions; dim--; ) {
1292 *pv++ = coeffs[a2 + b2];
1293 if ((a2 += samples) == s) { a2=0; b2++; }
1295 pv = put_vector(book, pb, vec);
1296 for (dim = book->ndimentions; dim--; ) {
1297 coeffs[a1 + b1] -= *pv++;
1298 if ((a1 += samples) == s) { a1=0; b1++; }
1308 static int apply_window_and_mdct(venc_context_t * venc, signed short * audio, int samples) {
1310 const float * win = venc->win[0];
1311 int window_len = 1 << (venc->blocksize[0] - 1);
1312 float n = (float)(1 << venc->blocksize[0]) / 4.;
1315 if (!venc->have_saved && !samples) return 0;
1317 if (venc->have_saved) {
1318 for (channel = 0; channel < venc->channels; channel++) {
1319 memcpy(venc->samples + channel*window_len*2, venc->saved + channel*window_len, sizeof(float)*window_len);
1322 for (channel = 0; channel < venc->channels; channel++) {
1323 memset(venc->samples + channel*window_len*2, 0, sizeof(float)*window_len);
1328 for (channel = 0; channel < venc->channels; channel++) {
1329 float * offset = venc->samples + channel*window_len*2 + window_len;
1331 for (i = 0; i < samples; i++, j += venc->channels)
1332 offset[i] = audio[j] / 32768. / n * win[window_len - i - 1];
1335 for (channel = 0; channel < venc->channels; channel++) {
1336 memset(venc->samples + channel*window_len*2 + window_len, 0, sizeof(float)*window_len);
1340 for (channel = 0; channel < venc->channels; channel++) {
1341 ff_mdct_calc(&venc->mdct[0], venc->coeffs + channel*window_len, venc->samples + channel*window_len*2, venc->floor/*tmp*/);
1345 for (channel = 0; channel < venc->channels; channel++) {
1346 float * offset = venc->saved + channel*window_len;
1348 for (i = 0; i < samples; i++, j += venc->channels)
1349 offset[i] = audio[j] / 32768. / n * win[i];
1351 venc->have_saved = 1;
1353 venc->have_saved = 0;
1358 static int vorbis_encode_init(AVCodecContext * avccontext)
1360 venc_context_t * venc = avccontext->priv_data;
1362 if (avccontext->channels != 2) {
1363 av_log(avccontext, AV_LOG_ERROR, "Current FFmpeg Vorbis encoder only supports 2 channels.\n");
1367 create_vorbis_context(venc, avccontext);
1369 if (avccontext->flags & CODEC_FLAG_QSCALE) venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA / 100.;
1370 else venc->quality = 0.17;
1372 avccontext->extradata_size = put_main_header(venc, (uint8_t**)&avccontext->extradata);
1374 avccontext->frame_size = 1 << (venc->blocksize[0] - 1);
1376 avccontext->coded_frame = avcodec_alloc_frame();
1377 avccontext->coded_frame->key_frame = 1;
1382 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data)
1384 venc_context_t * venc = avccontext->priv_data;
1385 signed short * audio = data;
1386 int samples = data ? avccontext->frame_size : 0;
1387 vorbis_mode_t * mode;
1388 mapping_t * mapping;
1392 if (!apply_window_and_mdct(venc, audio, samples)) return 0;
1393 samples = 1 << (venc->blocksize[0] - 1);
1395 init_put_bits(&pb, packets, buf_size);
1397 put_bits(&pb, 1, 0); // magic bit
1399 put_bits(&pb, ilog(venc->nmodes - 1), 0); // 0 bits, the mode
1401 mode = &venc->modes[0];
1402 mapping = &venc->mappings[mode->mapping];
1403 if (mode->blockflag) {
1404 put_bits(&pb, 1, 0);
1405 put_bits(&pb, 1, 0);
1408 for (i = 0; i < venc->channels; i++) {
1409 floor_t * fc = &venc->floors[mapping->floor[mapping->mux[i]]];
1410 uint_fast16_t posts[fc->values];
1411 floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples);
1412 floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples], samples);
1415 for (i = 0; i < venc->channels * samples; i++) {
1416 venc->coeffs[i] /= venc->floor[i];
1419 for (i = 0; i < mapping->coupling_steps; i++) {
1420 float * mag = venc->coeffs + mapping->magnitude[i] * samples;
1421 float * ang = venc->coeffs + mapping->angle[i] * samples;
1423 for (j = 0; j < samples; j++) {
1426 if (mag[j] > 0) ang[j] = -ang[j];
1427 if (ang[j] < 0) mag[j] = a;
1431 residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]], &pb, venc->coeffs, samples, venc->channels);
1433 flush_put_bits(&pb);
1434 return (put_bits_count(&pb) + 7) / 8;
1438 static int vorbis_encode_close(AVCodecContext * avccontext)
1440 venc_context_t * venc = avccontext->priv_data;
1443 if (venc->codebooks) for (i = 0; i < venc->ncodebooks; i++) {
1444 av_freep(&venc->codebooks[i].lens);
1445 av_freep(&venc->codebooks[i].codewords);
1446 av_freep(&venc->codebooks[i].quantlist);
1447 av_freep(&venc->codebooks[i].dimentions);
1448 av_freep(&venc->codebooks[i].pow2);
1450 av_freep(&venc->codebooks);
1452 if (venc->floors) for (i = 0; i < venc->nfloors; i++) {
1454 av_freep(&venc->floors[i].classes);
1455 if (venc->floors[i].classes)
1456 for (j = 0; j < venc->floors[i].nclasses; j++)
1457 av_freep(&venc->floors[i].classes[j].books);
1458 av_freep(&venc->floors[i].partition_to_class);
1459 av_freep(&venc->floors[i].list);
1461 av_freep(&venc->floors);
1463 if (venc->residues) for (i = 0; i < venc->nresidues; i++) {
1464 av_freep(&venc->residues[i].books);
1465 av_freep(&venc->residues[i].maxes);
1467 av_freep(&venc->residues);
1469 if (venc->mappings) for (i = 0; i < venc->nmappings; i++) {
1470 av_freep(&venc->mappings[i].mux);
1471 av_freep(&venc->mappings[i].floor);
1472 av_freep(&venc->mappings[i].residue);
1474 av_freep(&venc->mappings);
1476 av_freep(&venc->modes);
1478 av_freep(&venc->saved);
1479 av_freep(&venc->samples);
1480 av_freep(&venc->floor);
1481 av_freep(&venc->coeffs);
1483 ff_mdct_end(&venc->mdct[0]);
1484 ff_mdct_end(&venc->mdct[1]);
1486 av_freep(&avccontext->coded_frame);
1487 av_freep(&avccontext->extradata);
1492 AVCodec vorbis_encoder = {
1496 sizeof(venc_context_t),
1498 vorbis_encode_frame,
1499 vorbis_encode_close,
1500 .capabilities= CODEC_CAP_DELAY,