Correct the relation between floors of type 0 and block sizes.
[ffmpeg.git] / libavcodec / vorbis.c
1 /**
2  * @file vorbis.c
3  * Vorbis I decoder
4  * @author Denes Balatoni  ( dbalatoni programozo hu )
5
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
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
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  *
20  */
21
22 #undef V_DEBUG
23
24 #include <math.h>
25
26 #define ALT_BITSTREAM_READER_LE
27 #include "avcodec.h"
28 #include "bitstream.h"
29 #include "dsputil.h"
30
31 #include "vorbis.h"
32
33 #define V_NB_BITS 8
34 #define V_NB_BITS2 11
35 #define V_MAX_VLCS (1<<16)
36
37 #ifndef V_DEBUG
38 #define AV_DEBUG(...)
39 #endif
40
41 #undef NDEBUG
42 #include <assert.h>
43
44 /* Helper functions */
45
46 /**
47  *  reads 0-32 bits when using the ALT_BITSTREAM_READER_LE bitstream reader
48  */
49 static unsigned int get_bits_long_le(GetBitContext *s, int n){
50     if(n<=17) return get_bits(s, n);
51     else{
52         int ret= get_bits(s, 16);
53         return ret | (get_bits(s, n-16) << 16);
54     }
55 }
56
57 #define ilog(i) av_log2(2*(i))
58
59 #define BARK(x) \
60     (13.1f*atan(0.00074f*(x))+2.24f*atan(1.85e-8f*(x)*(x))+1e-4f*(x))
61
62 static unsigned int nth_root(unsigned int x, unsigned int n) {   // x^(1/n)
63     unsigned int ret=0, i, j;
64
65     do {
66         ++ret;
67         for(i=0,j=ret;i<n-1;i++) j*=ret;
68     } while (j<=x);
69
70     return (ret-1);
71 }
72
73 static float vorbisfloat2float(uint_fast32_t val) {
74     double mant=val&0x1fffff;
75     long exp=(val&0x7fe00000L)>>21;
76     if (val&0x80000000) mant=-mant;
77     return(ldexp(mant, exp-20-768));
78 }
79
80
81 // Generate vlc codes from vorbis huffman code lengths
82
83 static int vorbis_len2vlc(vorbis_context *vc, uint_fast8_t *bits, uint_fast32_t *codes, uint_fast32_t num) {
84     uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
85         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
86
87     uint_fast8_t i,j;
88     uint_fast32_t code,p;
89
90 #ifdef V_DEBUG
91     GetBitContext gb;
92 #endif
93
94     for(p=0;(bits[p]==0) && (p<num);++p);
95     if (p==num) {
96 //        av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
97         return 0;
98     }
99
100     codes[p]=0;
101     for(i=0;i<bits[p];++i) {
102         exit_at_level[i+1]=1<<i;
103     }
104
105 #ifdef V_DEBUG
106     av_log(vc->avccontext, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]);
107     init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
108     for(i=0;i<bits[p];++i) {
109         av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
110     }
111     av_log(vc->avccontext, AV_LOG_INFO, "\n");
112 #endif
113
114     ++p;
115
116     for(;p<num;++p) {
117         if (bits[p]==0) continue;
118         // find corresponding exit(node which the tree can grow further from)
119         for(i=bits[p];i>0;--i) {
120             if (exit_at_level[i]) break;
121         }
122         if (!i) return 1; // overspecified tree
123         code=exit_at_level[i];
124         exit_at_level[i]=0;
125         // construct code (append 0s to end) and introduce new exits
126         for(j=i+1;j<=bits[p];++j) {
127             exit_at_level[j]=code+(1<<(j-1));
128         }
129         codes[p]=code;
130
131 #ifdef V_DEBUG
132         av_log(vc->avccontext, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]);
133         init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
134         for(i=0;i<bits[p];++i) {
135             av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
136         }
137         av_log(vc->avccontext, AV_LOG_INFO, "\n");
138 #endif
139
140     }
141
142     //FIXME no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
143
144     return 0;
145 }
146
147 // Free all allocated memory -----------------------------------------
148
149 static void vorbis_free(vorbis_context *vc) {
150     int_fast16_t i;
151
152     av_freep(&vc->channel_residues);
153     av_freep(&vc->channel_floors);
154     av_freep(&vc->saved);
155     av_freep(&vc->ret);
156     av_freep(&vc->buf);
157     av_freep(&vc->buf_tmp);
158
159     av_freep(&vc->residues);
160     av_freep(&vc->modes);
161
162     ff_mdct_end(&vc->mdct0);
163     ff_mdct_end(&vc->mdct1);
164
165     for(i=0;i<vc->codebook_count;++i) {
166         av_free(vc->codebooks[i].codevectors);
167         free_vlc(&vc->codebooks[i].vlc);
168     }
169     av_freep(&vc->codebooks);
170
171     for(i=0;i<vc->floor_count;++i) {
172         if(vc->floors[i].floor_type==0) {
173             av_free(vc->floors[i].data.t0.map[0]);
174             av_free(vc->floors[i].data.t0.map[1]);
175             av_free(vc->floors[i].data.t0.book_list);
176             av_free(vc->floors[i].data.t0.lsp);
177         }
178         else {
179             av_free(vc->floors[i].data.t1.x_list);
180             av_free(vc->floors[i].data.t1.x_list_order);
181             av_free(vc->floors[i].data.t1.low_neighbour);
182             av_free(vc->floors[i].data.t1.high_neighbour);
183         }
184     }
185     av_freep(&vc->floors);
186
187     for(i=0;i<vc->mapping_count;++i) {
188         av_free(vc->mappings[i].magnitude);
189         av_free(vc->mappings[i].angle);
190         av_free(vc->mappings[i].mux);
191     }
192     av_freep(&vc->mappings);
193 }
194
195 // Parse setup header -------------------------------------------------
196
197 // Process codebooks part
198
199 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
200     uint_fast16_t cb;
201     uint_fast8_t *tmp_vlc_bits;
202     uint_fast32_t *tmp_vlc_codes;
203     GetBitContext *gb=&vc->gb;
204
205     vc->codebook_count=get_bits(gb,8)+1;
206
207     AV_DEBUG(" Codebooks: %d \n", vc->codebook_count);
208
209     vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook));
210     tmp_vlc_bits=(uint_fast8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast8_t));
211     tmp_vlc_codes=(uint_fast32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast32_t));
212
213     for(cb=0;cb<vc->codebook_count;++cb) {
214         vorbis_codebook *codebook_setup=&vc->codebooks[cb];
215         uint_fast8_t ordered;
216         uint_fast32_t t, used_entries=0;
217         uint_fast32_t entries;
218
219         AV_DEBUG(" %d. Codebook \n", cb);
220
221         if (get_bits(gb, 24)!=0x564342) {
222             av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook setup data corrupt. \n", cb);
223             goto error;
224         }
225
226         codebook_setup->dimensions=get_bits(gb, 16);
227         if (codebook_setup->dimensions>16) {
228             av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is too large (%d). \n", cb, codebook_setup->dimensions);
229             goto error;
230         }
231         entries=get_bits(gb, 24);
232         if (entries>V_MAX_VLCS) {
233             av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook has too many entries (%"PRIdFAST32"). \n", cb, entries);
234             goto error;
235         }
236
237         ordered=get_bits1(gb);
238
239         AV_DEBUG(" codebook_dimensions %d, codebook_entries %d \n", codebook_setup->dimensions, entries);
240
241         if (!ordered) {
242             uint_fast16_t ce;
243             uint_fast8_t flag;
244             uint_fast8_t sparse=get_bits1(gb);
245
246             AV_DEBUG(" not ordered \n");
247
248             if (sparse) {
249                 AV_DEBUG(" sparse \n");
250
251                 used_entries=0;
252                 for(ce=0;ce<entries;++ce) {
253                     flag=get_bits1(gb);
254                     if (flag) {
255                         tmp_vlc_bits[ce]=get_bits(gb, 5)+1;
256                         ++used_entries;
257                     }
258                     else tmp_vlc_bits[ce]=0;
259                 }
260             } else {
261                 AV_DEBUG(" not sparse \n");
262
263                 used_entries=entries;
264                 for(ce=0;ce<entries;++ce) {
265                     tmp_vlc_bits[ce]=get_bits(gb, 5)+1;
266                 }
267             }
268         } else {
269             uint_fast16_t current_entry=0;
270             uint_fast8_t current_length=get_bits(gb, 5)+1;
271
272             AV_DEBUG(" ordered, current length: %d \n", current_length);  //FIXME
273
274             used_entries=entries;
275             for(;current_entry<used_entries;++current_length) {
276                 uint_fast16_t i, number;
277
278                 AV_DEBUG(" number bits: %d ", ilog(entries - current_entry));
279
280                 number=get_bits(gb, ilog(entries - current_entry));
281
282                 AV_DEBUG(" number: %d \n", number);
283
284                 for(i=current_entry;i<number+current_entry;++i) {
285                     if (i<used_entries) tmp_vlc_bits[i]=current_length;
286                 }
287
288                 current_entry+=number;
289             }
290             if (current_entry>used_entries) {
291                 av_log(vc->avccontext, AV_LOG_ERROR, " More codelengths than codes in codebook. \n");
292                 goto error;
293             }
294         }
295
296         codebook_setup->lookup_type=get_bits(gb, 4);
297
298         AV_DEBUG(" lookup type: %d : %s \n", codebook_setup->lookup_type, codebook_setup->lookup_type ? "vq" : "no lookup" );
299
300 // If the codebook is used for (inverse) VQ, calculate codevectors.
301
302         if (codebook_setup->lookup_type==1) {
303             uint_fast16_t i, j, k;
304             uint_fast16_t codebook_lookup_values=nth_root(entries, codebook_setup->dimensions);
305             uint_fast16_t codebook_multiplicands[codebook_lookup_values];
306
307             float codebook_minimum_value=vorbisfloat2float(get_bits_long_le(gb, 32));
308             float codebook_delta_value=vorbisfloat2float(get_bits_long_le(gb, 32));
309             uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1;
310             uint_fast8_t codebook_sequence_p=get_bits1(gb);
311
312             AV_DEBUG(" We expect %d numbers for building the codevectors. \n", codebook_lookup_values);
313             AV_DEBUG("  delta %f minmum %f \n", codebook_delta_value, codebook_minimum_value);
314
315             for(i=0;i<codebook_lookup_values;++i) {
316                 codebook_multiplicands[i]=get_bits(gb, codebook_value_bits);
317
318                 AV_DEBUG(" multiplicands*delta+minmum : %e \n", (float)codebook_multiplicands[i]*codebook_delta_value+codebook_minimum_value);
319                 AV_DEBUG(" multiplicand %d \n", codebook_multiplicands[i]);
320             }
321
322 // Weed out unused vlcs and build codevector vector
323             codebook_setup->codevectors=(float *)av_mallocz(used_entries*codebook_setup->dimensions * sizeof(float));
324             for(j=0, i=0;i<entries;++i) {
325                 uint_fast8_t dim=codebook_setup->dimensions;
326
327                 if (tmp_vlc_bits[i]) {
328                     float last=0.0;
329                     uint_fast32_t lookup_offset=i;
330
331 #ifdef V_DEBUG
332                     av_log(vc->avccontext, AV_LOG_INFO, "Lookup offset %d ,", i);
333 #endif
334
335                     for(k=0;k<dim;++k) {
336                         uint_fast32_t multiplicand_offset = lookup_offset % codebook_lookup_values;
337                         codebook_setup->codevectors[j*dim+k]=codebook_multiplicands[multiplicand_offset]*codebook_delta_value+codebook_minimum_value+last;
338                         if (codebook_sequence_p) {
339                             last=codebook_setup->codevectors[j*dim+k];
340                         }
341                         lookup_offset/=codebook_lookup_values;
342                     }
343                     tmp_vlc_bits[j]=tmp_vlc_bits[i];
344
345 #ifdef V_DEBUG
346                     av_log(vc->avccontext, AV_LOG_INFO, "real lookup offset %d, vector: ", j);
347                     for(k=0;k<dim;++k) {
348                         av_log(vc->avccontext, AV_LOG_INFO, " %f ", codebook_setup->codevectors[j*dim+k]);
349                     }
350                     av_log(vc->avccontext, AV_LOG_INFO, "\n");
351 #endif
352
353                     ++j;
354                 }
355             }
356             if (j!=used_entries) {
357                 av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n");
358                 goto error;
359             }
360             entries=used_entries;
361         }
362         else if (codebook_setup->lookup_type>=2) {
363             av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n");
364             goto error;
365         }
366
367 // Initialize VLC table
368         if (vorbis_len2vlc(vc, tmp_vlc_bits, tmp_vlc_codes, entries)) {
369             av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n");
370             goto error;
371         }
372         codebook_setup->maxdepth=0;
373         for(t=0;t<entries;++t)
374             if (tmp_vlc_bits[t]>=codebook_setup->maxdepth) codebook_setup->maxdepth=tmp_vlc_bits[t];
375
376         if(codebook_setup->maxdepth > 3*V_NB_BITS) codebook_setup->nb_bits=V_NB_BITS2;
377         else                                       codebook_setup->nb_bits=V_NB_BITS;
378
379         codebook_setup->maxdepth=(codebook_setup->maxdepth+codebook_setup->nb_bits-1)/codebook_setup->nb_bits;
380
381         if (init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) {
382             av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n");
383             goto error;
384         }
385     }
386
387     av_free(tmp_vlc_bits);
388     av_free(tmp_vlc_codes);
389     return 0;
390
391 // Error:
392 error:
393     av_free(tmp_vlc_bits);
394     av_free(tmp_vlc_codes);
395     return 1;
396 }
397
398 // Process time domain transforms part (unused in Vorbis I)
399
400 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) {
401     GetBitContext *gb=&vc->gb;
402     uint_fast8_t i;
403     uint_fast8_t vorbis_time_count=get_bits(gb, 6)+1;
404
405     for(i=0;i<vorbis_time_count;++i) {
406         uint_fast16_t vorbis_tdtransform=get_bits(gb, 16);
407
408         AV_DEBUG(" Vorbis time domain transform %d: %d \n", vorbis_time_count, vorbis_tdtransform);
409
410         if (vorbis_tdtransform) {
411             av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n");
412             return 1;
413         }
414     }
415     return 0;
416 }
417
418 // Process floors part
419
420 static uint_fast8_t vorbis_floor0_decode(vorbis_context *vc,
421                                          vorbis_floor_data *vfu, float *vec);
422 static void create_map( vorbis_context * vc, uint_fast8_t floor_number );
423 static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc,
424                                          vorbis_floor_data *vfu, float *vec);
425 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {
426     GetBitContext *gb=&vc->gb;
427     uint_fast16_t i,j,k;
428
429     vc->floor_count=get_bits(gb, 6)+1;
430
431     vc->floors=(vorbis_floor *)av_mallocz(vc->floor_count * sizeof(vorbis_floor));
432
433     for (i=0;i<vc->floor_count;++i) {
434         vorbis_floor *floor_setup=&vc->floors[i];
435
436         floor_setup->floor_type=get_bits(gb, 16);
437
438         AV_DEBUG(" %d. floor type %d \n", i, floor_setup->floor_type);
439
440         if (floor_setup->floor_type==1) {
441             uint_fast8_t maximum_class=0;
442             uint_fast8_t rangebits;
443             uint_fast16_t floor1_values=2;
444
445             floor_setup->decode=vorbis_floor1_decode;
446
447             floor_setup->data.t1.partitions=get_bits(gb, 5);
448
449             AV_DEBUG(" %d.floor: %d partitions \n", i, floor_setup->data.t1.partitions);
450
451             for(j=0;j<floor_setup->data.t1.partitions;++j) {
452                 floor_setup->data.t1.partition_class[j]=get_bits(gb, 4);
453                 if (floor_setup->data.t1.partition_class[j]>maximum_class) maximum_class=floor_setup->data.t1.partition_class[j];
454
455                 AV_DEBUG(" %d. floor %d partition class %d \n", i, j, floor_setup->data.t1.partition_class[j]);
456
457             }
458
459             AV_DEBUG(" maximum class %d \n", maximum_class);
460
461             floor_setup->data.t1.maximum_class=maximum_class;
462
463             for(j=0;j<=maximum_class;++j) {
464                 floor_setup->data.t1.class_dimensions[j]=get_bits(gb, 3)+1;
465                 floor_setup->data.t1.class_subclasses[j]=get_bits(gb, 2);
466
467                 AV_DEBUG(" %d floor %d class dim: %d subclasses %d \n", i, j, floor_setup->data.t1.class_dimensions[j], floor_setup->data.t1.class_subclasses[j]);
468
469                 if (floor_setup->data.t1.class_subclasses[j]) {
470                     floor_setup->data.t1.class_masterbook[j]=get_bits(gb, 8);
471
472                     AV_DEBUG("   masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]);
473                 }
474
475                 for(k=0;k<(1<<floor_setup->data.t1.class_subclasses[j]);++k) {
476                     floor_setup->data.t1.subclass_books[j][k]=get_bits(gb, 8)-1;
477
478                     AV_DEBUG("    book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]);
479                 }
480             }
481
482             floor_setup->data.t1.multiplier=get_bits(gb, 2)+1;
483             floor_setup->data.t1.x_list_dim=2;
484
485             for(j=0;j<floor_setup->data.t1.partitions;++j) {
486                 floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];
487             }
488
489             floor_setup->data.t1.x_list=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));
490             floor_setup->data.t1.x_list_order=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));
491             floor_setup->data.t1.low_neighbour=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));
492             floor_setup->data.t1.high_neighbour=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));
493
494
495             rangebits=get_bits(gb, 4);
496             floor_setup->data.t1.x_list[0] = 0;
497             floor_setup->data.t1.x_list[1] = (1<<rangebits);
498
499             for(j=0;j<floor_setup->data.t1.partitions;++j) {
500                 for(k=0;k<floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];++k,++floor1_values) {
501                     floor_setup->data.t1.x_list[floor1_values]=get_bits(gb, rangebits);
502
503                     AV_DEBUG(" %d. floor1 Y coord. %d \n", floor1_values, floor_setup->data.t1.x_list[floor1_values]);
504                 }
505             }
506
507 // Precalculate order of x coordinates - needed for decode
508
509             for(k=0;k<floor_setup->data.t1.x_list_dim;++k) {
510                 floor_setup->data.t1.x_list_order[k]=k;
511             }
512
513             for(k=0;k<floor_setup->data.t1.x_list_dim-1;++k) {   // FIXME optimize sorting ?
514                 for(j=k+1;j<floor_setup->data.t1.x_list_dim;++j) {
515                     if(floor_setup->data.t1.x_list[floor_setup->data.t1.x_list_order[k]]>floor_setup->data.t1.x_list[floor_setup->data.t1.x_list_order[j]]) {
516                         uint_fast16_t tmp=floor_setup->data.t1.x_list_order[k];
517                         floor_setup->data.t1.x_list_order[k]=floor_setup->data.t1.x_list_order[j];
518                         floor_setup->data.t1.x_list_order[j]=tmp;
519                     }
520                 }
521             }
522
523 // Precalculate low and high neighbours
524
525             for(k=2;k<floor_setup->data.t1.x_list_dim;++k) {
526                 floor_setup->data.t1.low_neighbour[k]=0;
527                 floor_setup->data.t1.high_neighbour[k]=1;  // correct according to SPEC requirements
528
529                 for (j=0;j<k;++j) {
530                     if ((floor_setup->data.t1.x_list[j]<floor_setup->data.t1.x_list[k]) &&
531                       (floor_setup->data.t1.x_list[j]>floor_setup->data.t1.x_list[floor_setup->data.t1.low_neighbour[k]])) {
532                         floor_setup->data.t1.low_neighbour[k]=j;
533                     }
534                     if ((floor_setup->data.t1.x_list[j]>floor_setup->data.t1.x_list[k]) &&
535                       (floor_setup->data.t1.x_list[j]<floor_setup->data.t1.x_list[floor_setup->data.t1.high_neighbour[k]])) {
536                         floor_setup->data.t1.high_neighbour[k]=j;
537                     }
538                 }
539             }
540         }
541         else if(floor_setup->floor_type==0) {
542             uint_fast8_t max_codebook_dim=0;
543
544             floor_setup->decode=vorbis_floor0_decode;
545
546             floor_setup->data.t0.order=get_bits(gb, 8);
547             floor_setup->data.t0.rate=get_bits(gb, 16);
548             floor_setup->data.t0.bark_map_size=get_bits(gb, 16);
549             floor_setup->data.t0.amplitude_bits=get_bits(gb, 6);
550             /* zero would result in a div by zero later *
551              * 2^0 - 1 == 0                             */
552             if (floor_setup->data.t0.amplitude_bits == 0) {
553               av_log(vc->avccontext, AV_LOG_ERROR,
554                      "Floor 0 amplitude bits is 0.\n");
555               return 1;
556             }
557             floor_setup->data.t0.amplitude_offset=get_bits(gb, 8);
558             floor_setup->data.t0.num_books=get_bits(gb, 4)+1;
559
560             /* allocate mem for booklist */
561             floor_setup->data.t0.book_list=
562                 av_malloc(floor_setup->data.t0.num_books);
563             if(!floor_setup->data.t0.book_list) { return 1; }
564             /* read book indexes */
565             {
566                 int idx;
567                 uint_fast8_t book_idx;
568                 for (idx=0;idx<floor_setup->data.t0.num_books;++idx) {
569                     book_idx=get_bits(gb, 8);
570                     floor_setup->data.t0.book_list[idx]=book_idx;
571                     if (vc->codebooks[book_idx].dimensions > max_codebook_dim)
572                         max_codebook_dim=vc->codebooks[book_idx].dimensions;
573
574                     if (floor_setup->data.t0.book_list[idx]>vc->codebook_count)
575                         return 1;
576                 }
577             }
578
579             create_map( vc, i );
580
581             /* allocate mem for lsp coefficients */
582             {
583                 /* codebook dim is for padding if codebook dim doesn't *
584                  * divide order+1 then we need to read more data       */
585                 floor_setup->data.t0.lsp=
586                     av_malloc((floor_setup->data.t0.order+1 + max_codebook_dim)
587                               * sizeof(float));
588                 if(!floor_setup->data.t0.lsp) { return 1; }
589             }
590
591 #ifdef V_DEBUG /* debug output parsed headers */
592             AV_DEBUG("floor0 order: %u\n", floor_setup->data.t0.order);
593             AV_DEBUG("floor0 rate: %u\n", floor_setup->data.t0.rate);
594             AV_DEBUG("floor0 bark map size: %u\n",
595               floor_setup->data.t0.bark_map_size);
596             AV_DEBUG("floor0 amplitude bits: %u\n",
597               floor_setup->data.t0.amplitude_bits);
598             AV_DEBUG("floor0 amplitude offset: %u\n",
599               floor_setup->data.t0.amplitude_offset);
600             AV_DEBUG("floor0 number of books: %u\n",
601               floor_setup->data.t0.num_books);
602             AV_DEBUG("floor0 book list pointer: %p\n",
603               floor_setup->data.t0.book_list);
604             {
605               int idx;
606               for (idx=0;idx<floor_setup->data.t0.num_books;++idx) {
607                 AV_DEBUG( "  Book %d: %u\n",
608                   idx+1,
609                   floor_setup->data.t0.book_list[idx] );
610               }
611             }
612 #endif
613         }
614         else {
615             av_log(vc->avccontext, AV_LOG_ERROR, "Invalid floor type!\n");
616             return 1;
617         }
618     }
619     return 0;
620 }
621
622 // Process residues part
623
624 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc){
625     GetBitContext *gb=&vc->gb;
626     uint_fast8_t i, j, k;
627
628     vc->residue_count=get_bits(gb, 6)+1;
629     vc->residues=(vorbis_residue *)av_mallocz(vc->residue_count * sizeof(vorbis_residue));
630
631     AV_DEBUG(" There are %d residues. \n", vc->residue_count);
632
633     for(i=0;i<vc->residue_count;++i) {
634         vorbis_residue *res_setup=&vc->residues[i];
635         uint_fast8_t cascade[64];
636         uint_fast8_t high_bits;
637         uint_fast8_t low_bits;
638
639         res_setup->type=get_bits(gb, 16);
640
641         AV_DEBUG(" %d. residue type %d \n", i, res_setup->type);
642
643         res_setup->begin=get_bits(gb, 24);
644         res_setup->end=get_bits(gb, 24);
645         res_setup->partition_size=get_bits(gb, 24)+1;
646         res_setup->classifications=get_bits(gb, 6)+1;
647         res_setup->classbook=get_bits(gb, 8);
648
649         AV_DEBUG("    begin %d end %d part.size %d classif.s %d classbook %d \n", res_setup->begin, res_setup->end, res_setup->partition_size,
650           res_setup->classifications, res_setup->classbook);
651
652         for(j=0;j<res_setup->classifications;++j) {
653             high_bits=0;
654             low_bits=get_bits(gb, 3);
655             if (get_bits1(gb)) {
656                 high_bits=get_bits(gb, 5);
657             }
658             cascade[j]=(high_bits<<3)+low_bits;
659
660             AV_DEBUG("     %d class casscade depth: %d \n", j, ilog(cascade[j]));
661         }
662
663         res_setup->maxpass=0;
664         for(j=0;j<res_setup->classifications;++j) {
665             for(k=0;k<8;++k) {
666                 if (cascade[j]&(1<<k)) {
667                         res_setup->books[j][k]=get_bits(gb, 8);
668
669                     AV_DEBUG("     %d class casscade depth %d book: %d \n", j, k, res_setup->books[j][k]);
670
671                     if (k>res_setup->maxpass) {
672                         res_setup->maxpass=k;
673                     }
674                 } else {
675                     res_setup->books[j][k]=-1;
676                 }
677             }
678         }
679     }
680     return 0;
681 }
682
683 // Process mappings part
684
685 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) {
686     GetBitContext *gb=&vc->gb;
687     uint_fast8_t i, j;
688
689     vc->mapping_count=get_bits(gb, 6)+1;
690     vc->mappings=(vorbis_mapping *)av_mallocz(vc->mapping_count * sizeof(vorbis_mapping));
691
692     AV_DEBUG(" There are %d mappings. \n", vc->mapping_count);
693
694     for(i=0;i<vc->mapping_count;++i) {
695         vorbis_mapping *mapping_setup=&vc->mappings[i];
696
697         if (get_bits(gb, 16)) {
698             av_log(vc->avccontext, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n");
699             return 1;
700         }
701         if (get_bits1(gb)) {
702             mapping_setup->submaps=get_bits(gb, 4)+1;
703         } else {
704             mapping_setup->submaps=1;
705         }
706
707         if (get_bits1(gb)) {
708             mapping_setup->coupling_steps=get_bits(gb, 8)+1;
709             mapping_setup->magnitude=(uint_fast8_t *)av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t));
710             mapping_setup->angle=(uint_fast8_t *)av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t));
711             for(j=0;j<mapping_setup->coupling_steps;++j) {
712                 mapping_setup->magnitude[j]=get_bits(gb, ilog(vc->audio_channels-1));
713                 mapping_setup->angle[j]=get_bits(gb, ilog(vc->audio_channels-1));
714                 // FIXME: sanity checks
715             }
716         } else {
717             mapping_setup->coupling_steps=0;
718         }
719
720         AV_DEBUG("   %d mapping coupling steps: %d \n", i, mapping_setup->coupling_steps);
721
722         if(get_bits(gb, 2)) {
723             av_log(vc->avccontext, AV_LOG_ERROR, "%d. mapping setup data invalid. \n", i);
724             return 1; // following spec.
725         }
726
727         if (mapping_setup->submaps>1) {
728             mapping_setup->mux=(uint_fast8_t *)av_mallocz(vc->audio_channels * sizeof(uint_fast8_t));
729             for(j=0;j<vc->audio_channels;++j) {
730                 mapping_setup->mux[j]=get_bits(gb, 4);
731             }
732         }
733
734         for(j=0;j<mapping_setup->submaps;++j) {
735             get_bits(gb, 8); // FIXME check?
736             mapping_setup->submap_floor[j]=get_bits(gb, 8);
737             mapping_setup->submap_residue[j]=get_bits(gb, 8);
738
739             AV_DEBUG("   %d mapping %d submap : floor %d, residue %d \n", i, j, mapping_setup->submap_floor[j], mapping_setup->submap_residue[j]);
740         }
741     }
742     return 0;
743 }
744
745 // Process modes part
746
747 static void create_map( vorbis_context * vc, uint_fast8_t floor_number )
748 {
749     vorbis_floor * floors=vc->floors;
750     vorbis_floor0 * vf;
751     int idx;
752     int_fast8_t blockflag;
753     int_fast32_t * map;
754     int_fast32_t n; //TODO: could theoretically be smaller?
755
756     for (blockflag=0;blockflag<2;++blockflag)
757     {
758     n=(blockflag ? vc->blocksize_1 : vc->blocksize_0) / 2;
759     floors[floor_number].data.t0.map[blockflag]=
760         av_malloc((n+1) * sizeof(int_fast32_t)); // n+sentinel
761
762     map=floors[floor_number].data.t0.map[blockflag];
763     vf=&floors[floor_number].data.t0;
764
765     for (idx=0; idx<n;++idx) {
766         map[idx]=floor( BARK((vf->rate*idx)/(2.0f*n)) *
767                               ((vf->bark_map_size)/
768                                BARK(vf->rate/2.0f )) );
769         if (vf->bark_map_size-1 < map[idx]) {
770             map[idx]=vf->bark_map_size-1;
771         }
772     }
773     map[n]=-1;
774     vf->map_size[blockflag]=n;
775     }
776
777 #   ifdef V_DEBUG
778     for(idx=0;idx<=n;++idx) {
779         AV_DEBUG("floor0 map: map at pos %d is %d\n",
780                  idx, map[idx]);
781     }
782 #   endif
783 }
784
785 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) {
786     GetBitContext *gb=&vc->gb;
787     uint_fast8_t i;
788
789     vc->mode_count=get_bits(gb, 6)+1;
790     vc->modes=(vorbis_mode *)av_mallocz(vc->mode_count * sizeof(vorbis_mode));
791
792     AV_DEBUG(" There are %d modes.\n", vc->mode_count);
793
794     for(i=0;i<vc->mode_count;++i) {
795         vorbis_mode *mode_setup=&vc->modes[i];
796
797         mode_setup->blockflag=get_bits(gb, 1);
798         mode_setup->windowtype=get_bits(gb, 16); //FIXME check
799         mode_setup->transformtype=get_bits(gb, 16); //FIXME check
800         mode_setup->mapping=get_bits(gb, 8); //FIXME check
801
802         AV_DEBUG(" %d mode: blockflag %d, windowtype %d, transformtype %d, mapping %d \n", i, mode_setup->blockflag, mode_setup->windowtype, mode_setup->transformtype, mode_setup->mapping);
803     }
804     return 0;
805 }
806
807 // Process the whole setup header using the functions above
808
809 static int vorbis_parse_setup_hdr(vorbis_context *vc) {
810     GetBitContext *gb=&vc->gb;
811
812     if ((get_bits(gb, 8)!='v') || (get_bits(gb, 8)!='o') ||
813     (get_bits(gb, 8)!='r') || (get_bits(gb, 8)!='b') ||
814     (get_bits(gb, 8)!='i') || (get_bits(gb, 8)!='s')) {
815         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n");
816         return 1;
817     }
818
819     if (vorbis_parse_setup_hdr_codebooks(vc)) {
820         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (codebooks). \n");
821         return 2;
822     }
823     if (vorbis_parse_setup_hdr_tdtransforms(vc)) {
824         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n");
825         return 3;
826     }
827     if (vorbis_parse_setup_hdr_floors(vc)) {
828         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n");
829         return 4;
830     }
831     if (vorbis_parse_setup_hdr_residues(vc)) {
832         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n");
833         return 5;
834     }
835     if (vorbis_parse_setup_hdr_mappings(vc)) {
836         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n");
837         return 6;
838     }
839     if (vorbis_parse_setup_hdr_modes(vc)) {
840         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n");
841         return 7;
842     }
843     if (!get_bits1(gb)) {
844         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n");
845         return 8; // framing flag bit unset error
846     }
847
848     return 0;
849 }
850
851 // Process the identification header
852
853 static int vorbis_parse_id_hdr(vorbis_context *vc){
854     GetBitContext *gb=&vc->gb;
855     uint_fast8_t bl0, bl1;
856     const float *vwin[8]={ vwin64, vwin128, vwin256, vwin512, vwin1024, vwin2048, vwin4096, vwin8192 };
857
858     if ((get_bits(gb, 8)!='v') || (get_bits(gb, 8)!='o') ||
859     (get_bits(gb, 8)!='r') || (get_bits(gb, 8)!='b') ||
860     (get_bits(gb, 8)!='i') || (get_bits(gb, 8)!='s')) {
861         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n");
862         return 1;
863     }
864
865     vc->version=get_bits_long_le(gb, 32);    //FIXME check 0
866     vc->audio_channels=get_bits(gb, 8);   //FIXME check >0
867     vc->audio_samplerate=get_bits_long_le(gb, 32);   //FIXME check >0
868     vc->bitrate_maximum=get_bits_long_le(gb, 32);
869     vc->bitrate_nominal=get_bits_long_le(gb, 32);
870     vc->bitrate_minimum=get_bits_long_le(gb, 32);
871     bl0=get_bits(gb, 4);
872     bl1=get_bits(gb, 4);
873     vc->blocksize_0=(1<<bl0);
874     vc->blocksize_1=(1<<bl1);
875     if (bl0>13 || bl0<6 || bl1>13 || bl1<6) {
876         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n");
877         return 3;
878     }
879     vc->swin=vwin[bl0-6];
880     vc->lwin=vwin[bl1-6];
881
882     if ((get_bits1(gb)) == 0) {
883         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n");
884         return 2;
885     }
886
887     vc->channel_residues=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
888     vc->channel_floors=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
889     vc->saved=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
890     vc->ret=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
891     vc->buf=(float *)av_malloc(vc->blocksize_1 * sizeof(float));
892     vc->buf_tmp=(float *)av_malloc(vc->blocksize_1 * sizeof(float));
893     vc->saved_start=0;
894
895     ff_mdct_init(&vc->mdct0, bl0, 1);
896     ff_mdct_init(&vc->mdct1, bl1, 1);
897
898     AV_DEBUG(" vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ",
899             vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize_0, vc->blocksize_1);
900
901 /*
902     BLK=vc->blocksize_0;
903     for(i=0;i<BLK/2;++i) {
904         vc->swin[i]=sin(0.5*3.14159265358*(sin(((float)i+0.5)/(float)BLK*3.14159265358))*(sin(((float)i+0.5)/(float)BLK*3.14159265358)));
905     }
906 */
907
908     return 0;
909 }
910
911 // Process the extradata using the functions above (identification header, setup header)
912
913 static int vorbis_decode_init(AVCodecContext *avccontext) {
914     vorbis_context *vc = avccontext->priv_data ;
915     uint8_t *headers = avccontext->extradata;
916     int headers_len=avccontext->extradata_size;
917     uint8_t *header_start[3];
918     int header_len[3];
919     GetBitContext *gb = &(vc->gb);
920     int i, j, hdr_type;
921
922     vc->avccontext = avccontext;
923
924     if (!headers_len) {
925         av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
926         return -1;
927     }
928
929     if(headers[0] == 0 && headers[1] == 30) {
930         for(i = 0; i < 3; i++){
931             header_len[i] = *headers++ << 8;
932             header_len[i] += *headers++;
933             header_start[i] = headers;
934             headers += header_len[i];
935         }
936     } else if(headers[0] == 2) {
937         for(j=1,i=0;i<2;++i, ++j) {
938             header_len[i]=0;
939             while(j<headers_len && headers[j]==0xff) {
940                 header_len[i]+=0xff;
941                 ++j;
942             }
943             if (j>=headers_len) {
944                 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
945                 return -1;
946             }
947             header_len[i]+=headers[j];
948         }
949         header_len[2]=headers_len-header_len[0]-header_len[1]-j;
950         headers+=j;
951         header_start[0] = headers;
952         header_start[1] = header_start[0] + header_len[0];
953         header_start[2] = header_start[1] + header_len[1];
954     } else {
955         av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
956         return -1;
957     }
958
959     init_get_bits(gb, header_start[0], header_len[0]*8);
960     hdr_type=get_bits(gb, 8);
961     if (hdr_type!=1) {
962         av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n");
963         return -1;
964     }
965     if (vorbis_parse_id_hdr(vc)) {
966         av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n");
967         vorbis_free(vc);
968         return -1;
969     }
970
971     init_get_bits(gb, header_start[2], header_len[2]*8);
972     hdr_type=get_bits(gb, 8);
973     if (hdr_type!=5) {
974         av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n");
975         return -1;
976     }
977     if (vorbis_parse_setup_hdr(vc)) {
978         av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n");
979         vorbis_free(vc);
980         return -1;
981     }
982
983     avccontext->channels = vc->audio_channels;
984     avccontext->sample_rate = vc->audio_samplerate;
985
986     return 0 ;
987 }
988
989 // Decode audiopackets -------------------------------------------------
990
991 // Read and decode floor
992
993 static uint_fast8_t vorbis_floor0_decode(vorbis_context *vc,
994                                          vorbis_floor_data *vfu, float *vec) {
995     vorbis_floor0 * vf=&vfu->t0;
996     float * lsp=vf->lsp;
997     uint_fast32_t amplitude;
998     uint_fast32_t book_idx;
999     uint_fast8_t blockflag=vc->modes[vc->mode_number].blockflag;
1000
1001     amplitude=get_bits(&vc->gb, vf->amplitude_bits);
1002     if (amplitude>0) {
1003         float last = 0;
1004         uint_fast16_t lsp_len = 0;
1005         uint_fast16_t idx;
1006         vorbis_codebook codebook;
1007
1008         book_idx=get_bits(&vc->gb, ilog(vf->num_books));
1009         if ( book_idx >= vf->num_books ) {
1010             av_log( vc->avccontext, AV_LOG_ERROR,
1011                     "floor0 dec: booknumber too high!\n" );
1012             //FIXME: look above
1013         }
1014         AV_DEBUG( "floor0 dec: booknumber: %u\n", book_idx );
1015         codebook=vc->codebooks[vf->book_list[book_idx]];
1016
1017         while (lsp_len<vf->order) {
1018             int vec_off;
1019
1020             AV_DEBUG( "floor0 dec: book dimension: %d\n", codebook.dimensions );
1021             AV_DEBUG( "floor0 dec: maximum depth: %d\n", codebook.maxdepth );
1022             /* read temp vector */
1023             vec_off=get_vlc2(&vc->gb,
1024                              codebook.vlc.table,
1025                              codebook.nb_bits,
1026                              codebook.maxdepth ) *
1027                              codebook.dimensions;
1028             AV_DEBUG( "floor0 dec: vector offset: %d\n", vec_off );
1029             /* copy each vector component and add last to it */
1030             for (idx=0; idx<codebook.dimensions; ++idx) {
1031                 lsp[lsp_len+idx]=codebook.codevectors[vec_off+idx]+last;
1032             }
1033             last=lsp[lsp_len+idx-1]; /* set last to last vector component */
1034
1035             lsp_len += codebook.dimensions;
1036         }
1037 #ifdef V_DEBUG
1038         /* DEBUG: output lsp coeffs */
1039         {
1040             int idx;
1041             for ( idx = 0; idx < lsp_len; ++idx )
1042                 AV_DEBUG("floor0 dec: coeff at %d is %f\n", idx, lsp[idx] );
1043         }
1044 #endif
1045
1046         /* synthesize floor output vector */
1047         {
1048             int i;
1049             int order=vf->order;
1050             float wstep=M_PI/vf->bark_map_size;
1051
1052             for(i=0;i<order;i++) { lsp[i]=2.0f*cos(lsp[i]); }
1053
1054             AV_DEBUG("floor0 synth: map_size=%d; m=%d; wstep=%f\n",
1055                      vf->map_size, order, wstep);
1056
1057             i=0;
1058             while(i<vf->map_size[blockflag]) {
1059                 int j, iter_cond=vf->map[blockflag][i];
1060                 float p=0.5f;
1061                 float q=0.5f;
1062                 float two_cos_w=2.0f*cos(wstep*iter_cond); // needed all times
1063
1064                 /* similar part for the q and p products */
1065                 for(j=0;j<order;j+=2) {
1066                     q *= lsp[j]  -two_cos_w;
1067                     p *= lsp[j+1]-two_cos_w;
1068                 }
1069                 if(j==order) { // even order
1070                     p *= p*(2.0f-two_cos_w);
1071                     q *= q*(2.0f+two_cos_w);
1072                 }
1073                 else { // odd order
1074                     q *= two_cos_w-lsp[j]; // one more time for q
1075
1076                     /* final step and square */
1077                     p *= p*(4.f-two_cos_w*two_cos_w);
1078                     q *= q;
1079                 }
1080
1081                 /* calculate linear floor value */
1082                 {
1083                     q=exp( (
1084                              ( (amplitude*vf->amplitude_offset)/
1085                                (((1<<vf->amplitude_bits)-1) * sqrt(p+q)) )
1086                              - vf->amplitude_offset ) * .11512925f
1087                          );
1088                 }
1089
1090                 /* fill vector */
1091                 do { vec[i]=q; ++i; }while(vf->map[blockflag][i]==iter_cond);
1092             }
1093         }
1094     }
1095     else {
1096         /* this channel is unused */
1097         return 1;
1098     }
1099
1100     AV_DEBUG(" Floor0 decoded\n");
1101
1102     return 0;
1103 }
1104 static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec) {
1105     vorbis_floor1 * vf=&vfu->t1;
1106     GetBitContext *gb=&vc->gb;
1107     uint_fast16_t range_v[4]={ 256, 128, 86, 64 };
1108     uint_fast16_t range=range_v[vf->multiplier-1];
1109     uint_fast16_t floor1_Y[vf->x_list_dim];
1110     uint_fast16_t floor1_Y_final[vf->x_list_dim];
1111     uint_fast8_t floor1_flag[vf->x_list_dim];
1112     uint_fast8_t class_;
1113     uint_fast8_t cdim;
1114     uint_fast8_t cbits;
1115     uint_fast8_t csub;
1116     uint_fast8_t cval;
1117     int_fast16_t book;
1118     uint_fast16_t offset;
1119     uint_fast16_t i,j;
1120     uint_fast16_t *floor_x_sort=vf->x_list_order;
1121     /*u*/int_fast16_t adx, ady, off, predicted; // WTF ? dy/adx= (unsigned)dy/adx ?
1122     int_fast16_t dy, err;
1123     uint_fast16_t lx,hx, ly, hy=0;
1124
1125
1126     if (!get_bits1(gb)) return 1; // silence
1127
1128 // Read values (or differences) for the floor's points
1129
1130     floor1_Y[0]=get_bits(gb, ilog(range-1));
1131     floor1_Y[1]=get_bits(gb, ilog(range-1));
1132
1133     AV_DEBUG("floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]);
1134
1135     offset=2;
1136     for(i=0;i<vf->partitions;++i) {
1137         class_=vf->partition_class[i];
1138         cdim=vf->class_dimensions[class_];
1139         cbits=vf->class_subclasses[class_];
1140         csub=(1<<cbits)-1;
1141         cval=0;
1142
1143         AV_DEBUG("Cbits %d \n", cbits);
1144
1145         if (cbits) { // this reads all subclasses for this partition's class
1146             cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table,
1147             vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3);
1148         }
1149
1150         for(j=0;j<cdim;++j) {
1151             book=vf->subclass_books[class_][cval & csub];
1152
1153             AV_DEBUG("book %d Cbits %d cval %d  bits:%d \n", book, cbits, cval, get_bits_count(gb));
1154
1155             cval=cval>>cbits;
1156             if (book>0) {
1157                 floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table,
1158                 vc->codebooks[book].nb_bits, 3);
1159             } else {
1160                 floor1_Y[offset+j]=0;
1161             }
1162
1163             AV_DEBUG(" floor(%d) = %d \n", vf->x_list[offset+j], floor1_Y[offset+j]);
1164         }
1165         offset+=cdim;
1166     }
1167
1168 // Amplitude calculation from the differences
1169
1170     floor1_flag[0]=1;
1171     floor1_flag[1]=1;
1172     floor1_Y_final[0]=floor1_Y[0];
1173     floor1_Y_final[1]=floor1_Y[1];
1174
1175     for(i=2;i<vf->x_list_dim;++i) {
1176         uint_fast16_t val, highroom, lowroom, room;
1177         uint_fast16_t high_neigh_offs;
1178         uint_fast16_t low_neigh_offs;
1179
1180         low_neigh_offs=vf->low_neighbour[i];
1181         high_neigh_offs=vf->high_neighbour[i];
1182         dy=floor1_Y_final[high_neigh_offs]-floor1_Y_final[low_neigh_offs];  // render_point begin
1183         adx=vf->x_list[high_neigh_offs]-vf->x_list[low_neigh_offs];
1184         ady= ABS(dy);
1185         err=ady*(vf->x_list[i]-vf->x_list[low_neigh_offs]);
1186         off=err/adx;
1187         if (dy<0) {
1188             predicted=floor1_Y_final[low_neigh_offs]-off;
1189         } else {
1190             predicted=floor1_Y_final[low_neigh_offs]+off;
1191         } // render_point end
1192
1193         val=floor1_Y[i];
1194         highroom=range-predicted;
1195         lowroom=predicted;
1196         if (highroom < lowroom) {
1197             room=highroom*2;
1198         } else {
1199             room=lowroom*2;   // SPEC mispelling
1200         }
1201         if (val) {
1202             floor1_flag[low_neigh_offs]=1;
1203             floor1_flag[high_neigh_offs]=1;
1204             floor1_flag[i]=1;
1205             if (val>=room) {
1206                 if (highroom > lowroom) {
1207                     floor1_Y_final[i]=val-lowroom+predicted;
1208                 } else {
1209                     floor1_Y_final[i]=predicted-val+highroom-1;
1210                 }
1211             } else {
1212                 if (val & 1) {
1213                     floor1_Y_final[i]=predicted-(val+1)/2;
1214                 } else {
1215                     floor1_Y_final[i]=predicted+val/2;
1216                 }
1217             }
1218         } else {
1219             floor1_flag[i]=0;
1220             floor1_Y_final[i]=predicted;
1221         }
1222
1223         AV_DEBUG(" Decoded floor(%d) = %d / val %d \n", vf->x_list[i], floor1_Y_final[i], val);
1224     }
1225
1226 // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ?
1227
1228     hx=0;
1229     lx=0;
1230     ly=floor1_Y_final[0]*vf->multiplier;  // conforms to SPEC
1231
1232     vec[0]=floor1_inverse_db_table[ly];
1233
1234     for(i=1;i<vf->x_list_dim;++i) {
1235         AV_DEBUG(" Looking at post %d \n", i);
1236
1237         if (floor1_flag[floor_x_sort[i]]) {   // SPEC mispelled
1238             int_fast16_t x, y, dy, base, sy; // if uncommented: dy = -32 adx = 2  base = 2blablabla ?????
1239
1240             hy=floor1_Y_final[floor_x_sort[i]]*vf->multiplier;
1241             hx=vf->x_list[floor_x_sort[i]];
1242
1243             dy=hy-ly;
1244             adx=hx-lx;
1245             ady= (dy<0) ? -dy:dy;//ABS(dy);
1246             base=dy/adx;
1247
1248             AV_DEBUG(" dy %d  adx %d base %d = %d \n", dy, adx, base, dy/adx);
1249
1250             x=lx;
1251             y=ly;
1252             err=0;
1253             if (dy<0) {
1254                 sy=base-1;
1255             } else {
1256                 sy=base+1;
1257             }
1258             ady=ady-(base<0 ? -base : base)*adx;
1259             vec[x]=floor1_inverse_db_table[y];
1260
1261             AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1262
1263             for(x=lx+1;(x<hx) && (x<vf->x_list[1]);++x) {
1264                 err+=ady;
1265                 if (err>=adx) {
1266                     err-=adx;
1267                     y+=sy;
1268                 } else {
1269                     y+=base;
1270                 }
1271                 vec[x]=floor1_inverse_db_table[y];
1272
1273                 AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1274             }
1275
1276 /*            for(j=1;j<hx-lx+1;++j) {  // iterating render_point
1277                 dy=hy-ly;
1278                 adx=hx-lx;
1279                 ady= dy<0 ? -dy : dy;
1280                 err=ady*j;
1281                 off=err/adx;
1282                 if (dy<0) {
1283                     predicted=ly-off;
1284                 } else {
1285                     predicted=ly+off;
1286                 }
1287                 if (lx+j < vf->x_list[1]) {
1288                     vec[lx+j]=floor1_inverse_db_table[predicted];
1289                 }
1290             }*/
1291
1292             lx=hx;
1293             ly=hy;
1294         }
1295     }
1296
1297     if (hx<vf->x_list[1]) {
1298         for(i=hx;i<vf->x_list[1];++i) {
1299             vec[i]=floor1_inverse_db_table[hy];
1300         }
1301     }
1302
1303     AV_DEBUG(" Floor decoded\n");
1304
1305     return 0;
1306 }
1307
1308 // Read and decode residue
1309
1310 static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fast8_t ch, uint_fast8_t *do_not_decode, float *vec, uint_fast16_t vlen) {
1311     GetBitContext *gb=&vc->gb;
1312     uint_fast8_t c_p_c=vc->codebooks[vr->classbook].dimensions;
1313     uint_fast16_t n_to_read=vr->end-vr->begin;
1314     uint_fast16_t ptns_to_read=n_to_read/vr->partition_size;
1315     uint_fast8_t classifs[ptns_to_read*vc->audio_channels];
1316     uint_fast8_t pass;
1317     uint_fast8_t ch_used;
1318     uint_fast8_t i,j,l;
1319     uint_fast16_t k;
1320
1321     if (vr->type==2) {
1322         for(j=1;j<ch;++j) {
1323                 do_not_decode[0]&=do_not_decode[j];  // FIXME - clobbering input
1324         }
1325         if (do_not_decode[0]) return 0;
1326         ch_used=1;
1327     } else {
1328         ch_used=ch;
1329     }
1330
1331     AV_DEBUG(" residue type 0/1/2 decode begin, ch: %d  cpc %d  \n", ch, c_p_c);
1332
1333     for(pass=0;pass<=vr->maxpass;++pass) { // FIXME OPTIMIZE?
1334         uint_fast16_t voffset;
1335         uint_fast16_t partition_count;
1336         uint_fast16_t j_times_ptns_to_read;
1337
1338         voffset=vr->begin;
1339         for(partition_count=0;partition_count<ptns_to_read;) {  // SPEC        error
1340             if (!pass) {
1341                 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) {
1342                     if (!do_not_decode[j]) {
1343                         uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table,
1344                         vc->codebooks[vr->classbook].nb_bits, 3);
1345
1346                         AV_DEBUG("Classword: %d \n", temp);
1347
1348                         assert(vr->classifications > 1 && vr->classifications<256 && temp<=65536); //needed for inverse[]
1349                         for(i=0;i<c_p_c;++i) {
1350                             uint_fast32_t temp2;
1351
1352                             temp2=(((uint_fast64_t)temp) * inverse[vr->classifications])>>32;
1353                             classifs[j_times_ptns_to_read+partition_count+c_p_c-1-i]=temp-temp2*vr->classifications;
1354                             temp=temp2;
1355                         }
1356                     }
1357                     j_times_ptns_to_read+=ptns_to_read;
1358                 }
1359             }
1360             for(i=0;(i<c_p_c) && (partition_count<ptns_to_read);++i) {
1361                 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) {
1362                     uint_fast16_t voffs;
1363
1364                     if (!do_not_decode[j]) {
1365                         uint_fast8_t vqclass=classifs[j_times_ptns_to_read+partition_count];
1366                         int_fast16_t vqbook=vr->books[vqclass][pass];
1367
1368                         if (vqbook>=0) {
1369                             uint_fast16_t coffs;
1370                             uint_fast16_t step=vr->partition_size/vc->codebooks[vqbook].dimensions;
1371                             vorbis_codebook codebook= vc->codebooks[vqbook];
1372
1373                             if (vr->type==0) {
1374
1375                                 voffs=voffset+j*vlen;
1376                                 for(k=0;k<step;++k) {
1377                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1378                                     for(l=0;l<codebook.dimensions;++l) {
1379                                         vec[voffs+k+l*step]+=codebook.codevectors[coffs+l];  // FPMATH
1380                                     }
1381                                 }
1382                             }
1383                             else if (vr->type==1) {
1384                                 voffs=voffset+j*vlen;
1385                                 for(k=0;k<step;++k) {
1386                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1387                                     for(l=0;l<codebook.dimensions;++l, ++voffs) {
1388                                         vec[voffs]+=codebook.codevectors[coffs+l];  // FPMATH
1389
1390                                         AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d  \n", pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs);
1391                                     }
1392                                 }
1393                             }
1394                             else if (vr->type==2 && ch==2 && (voffset&1)==0 && (codebook.dimensions&1)==0) { // most frequent case optimized
1395                                 voffs=voffset>>1;
1396
1397                                 for(k=0;k<step;++k) {
1398                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1399                                     for(l=0;l<codebook.dimensions;l+=2, voffs++) {
1400                                         vec[voffs     ]+=codebook.codevectors[coffs+l  ];  // FPMATH
1401                                         vec[voffs+vlen]+=codebook.codevectors[coffs+l+1];  // FPMATH
1402
1403                                         AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d  \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l);
1404                                     }
1405                                 }
1406
1407                             }
1408                             else if (vr->type==2) {
1409                                 voffs=voffset;
1410
1411                                 for(k=0;k<step;++k) {
1412                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1413                                     for(l=0;l<codebook.dimensions;++l, ++voffs) {
1414                                         vec[voffs/ch+(voffs%ch)*vlen]+=codebook.codevectors[coffs+l];  // FPMATH FIXME use if and counter instead of / and %
1415
1416                                         AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d  \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l);
1417                                     }
1418                                 }
1419                             } else {
1420                                 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n");
1421                                 return 1;
1422                             }
1423                         }
1424                     }
1425                     j_times_ptns_to_read+=ptns_to_read;
1426                 }
1427                 ++partition_count;
1428                 voffset+=vr->partition_size;
1429             }
1430         }
1431     }
1432     return 0;
1433 }
1434
1435 // Decode the audio packet using the functions above
1436 #define BIAS 385
1437
1438 static int vorbis_parse_audio_packet(vorbis_context *vc) {
1439     GetBitContext *gb=&vc->gb;
1440
1441     uint_fast8_t previous_window=0,next_window=0;
1442     uint_fast8_t mode_number;
1443     uint_fast16_t blocksize;
1444     int_fast32_t i,j;
1445     uint_fast8_t no_residue[vc->audio_channels];
1446     uint_fast8_t do_not_decode[vc->audio_channels];
1447     vorbis_mapping *mapping;
1448     float *ch_res_ptr=vc->channel_residues;
1449     float *ch_floor_ptr=vc->channel_floors;
1450     uint_fast8_t res_chan[vc->audio_channels];
1451     uint_fast8_t res_num=0;
1452     int_fast16_t retlen=0;
1453     uint_fast16_t saved_start=0;
1454
1455     if (get_bits1(gb)) {
1456         av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
1457         return -1; // packet type not audio
1458     }
1459
1460     if (vc->mode_count==1) {
1461         mode_number=0;
1462     } else {
1463         mode_number=get_bits(gb, ilog(vc->mode_count-1));
1464     }
1465     vc->mode_number=mode_number;
1466     mapping=&vc->mappings[vc->modes[mode_number].mapping];
1467
1468     AV_DEBUG(" Mode number: %d , mapping: %d , blocktype %d \n", mode_number, vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag);
1469
1470     if (vc->modes[mode_number].blockflag) {
1471         previous_window=get_bits1(gb);
1472         next_window=get_bits1(gb);
1473     }
1474
1475     blocksize=vc->modes[mode_number].blockflag ? vc->blocksize_1 : vc->blocksize_0;
1476     memset(ch_res_ptr, 0, sizeof(float)*vc->audio_channels*blocksize/2); //FIXME can this be removed ?
1477     memset(ch_floor_ptr, 0, sizeof(float)*vc->audio_channels*blocksize/2); //FIXME can this be removed ?
1478
1479 // Decode floor
1480
1481     for(i=0;i<vc->audio_channels;++i) {
1482         vorbis_floor *floor;
1483         if (mapping->submaps>1) {
1484             floor=&vc->floors[mapping->submap_floor[mapping->mux[i]]];
1485         } else {
1486             floor=&vc->floors[mapping->submap_floor[0]];
1487         }
1488
1489         no_residue[i]=floor->decode(vc, &floor->data, ch_floor_ptr);
1490         ch_floor_ptr+=blocksize/2;
1491     }
1492
1493 // Nonzero vector propagate
1494
1495     for(i=mapping->coupling_steps-1;i>=0;--i) {
1496         if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) {
1497             no_residue[mapping->magnitude[i]]=0;
1498             no_residue[mapping->angle[i]]=0;
1499         }
1500     }
1501
1502 // Decode residue
1503
1504     for(i=0;i<mapping->submaps;++i) {
1505         vorbis_residue *residue;
1506         uint_fast8_t ch=0;
1507
1508         for(j=0;j<vc->audio_channels;++j) {
1509             if ((mapping->submaps==1) || (i=mapping->mux[j])) {
1510                 res_chan[j]=res_num;
1511                 if (no_residue[j]) {
1512                     do_not_decode[ch]=1;
1513                 } else {
1514                     do_not_decode[ch]=0;
1515                 }
1516                 ++ch;
1517                 ++res_num;
1518             }
1519         }
1520         residue=&vc->residues[mapping->submap_residue[i]];
1521         vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocksize/2);
1522
1523         ch_res_ptr+=ch*blocksize/2;
1524     }
1525
1526 // Inverse coupling
1527
1528     for(i=mapping->coupling_steps-1;i>=0;--i) { //warning: i has to be signed
1529         float *mag, *ang;
1530
1531         mag=vc->channel_residues+res_chan[mapping->magnitude[i]]*blocksize/2;
1532         ang=vc->channel_residues+res_chan[mapping->angle[i]]*blocksize/2;
1533         for(j=0;j<blocksize/2;++j) {
1534             float temp;
1535             if (mag[j]>0.0) {
1536                 if (ang[j]>0.0) {
1537                     ang[j]=mag[j]-ang[j];
1538                 } else {
1539                     temp=ang[j];
1540                     ang[j]=mag[j];
1541                     mag[j]+=temp;
1542                 }
1543             } else {
1544                 if (ang[j]>0.0) {
1545                     ang[j]+=mag[j];
1546                 } else {
1547                     temp=ang[j];
1548                     ang[j]=mag[j];
1549                     mag[j]-=temp;
1550                 }
1551             }
1552         }
1553     }
1554
1555 // Dotproduct
1556
1557     for(j=0, ch_floor_ptr=vc->channel_floors;j<vc->audio_channels;++j,ch_floor_ptr+=blocksize/2) {
1558         ch_res_ptr=vc->channel_residues+res_chan[j]*blocksize/2;
1559
1560         for(i=0;i<blocksize/2;++i) {
1561             ch_floor_ptr[i]*=ch_res_ptr[i]; //FPMATH
1562         }
1563     }
1564
1565 // MDCT, overlap/add, save data for next overlapping  FPMATH
1566
1567     for(j=0;j<vc->audio_channels;++j) {
1568         uint_fast8_t step=vc->audio_channels;
1569         uint_fast16_t k;
1570         float *saved=vc->saved+j*vc->blocksize_1/2;
1571         float *ret=vc->ret;
1572         const float *lwin=vc->lwin;
1573         const float *swin=vc->swin;
1574         float *buf=vc->buf;
1575         float *buf_tmp=vc->buf_tmp;
1576
1577         ch_floor_ptr=vc->channel_floors+j*blocksize/2;
1578
1579         saved_start=vc->saved_start;
1580
1581         ff_imdct_calc(vc->modes[mode_number].blockflag ? &vc->mdct1 : &vc->mdct0, buf, ch_floor_ptr, buf_tmp);
1582
1583         if (vc->modes[mode_number].blockflag) {
1584             // -- overlap/add
1585             if (previous_window) {
1586                 for(k=j, i=0;i<vc->blocksize_1/2;++i, k+=step) {
1587                     ret[k]=saved[i]+buf[i]*lwin[i]+BIAS;
1588                 }
1589                 retlen=vc->blocksize_1/2;
1590             } else {
1591                 buf += (vc->blocksize_1-vc->blocksize_0)/4;
1592                 for(k=j, i=0;i<vc->blocksize_0/2;++i, k+=step) {
1593                     ret[k]=saved[i]+buf[i]*swin[i]+BIAS;
1594                 }
1595                 buf += vc->blocksize_0/2;
1596                 for(i=0;i<(vc->blocksize_1-vc->blocksize_0)/4;++i, k+=step) {
1597                     ret[k]=buf[i]+BIAS;
1598                 }
1599                 buf=vc->buf;
1600                 retlen=vc->blocksize_0/2+(vc->blocksize_1-vc->blocksize_0)/4;
1601             }
1602             // -- save
1603             if (next_window) {
1604                 buf += vc->blocksize_1/2;
1605                 lwin += vc->blocksize_1/2-1;
1606                 for(i=0;i<vc->blocksize_1/2;++i) {
1607                     saved[i]=buf[i]*lwin[-i];
1608                 }
1609                 saved_start=0;
1610             } else {
1611                 saved_start=(vc->blocksize_1-vc->blocksize_0)/4;
1612                 buf += vc->blocksize_1/2;
1613                 for(i=0;i<saved_start;++i) {
1614                     saved[i]=buf[i];
1615                 }
1616                 swin += vc->blocksize_0/2-1;
1617                 for(i=0;i<vc->blocksize_0/2;++i) {
1618                     saved[saved_start+i]=buf[saved_start+i]*swin[-i];
1619                 }
1620             }
1621         } else {
1622             // --overlap/add
1623             for(k=j, i=0;i<saved_start;++i, k+=step) {
1624                 ret[k]=saved[i]+BIAS;
1625             }
1626             for(i=0;i<vc->blocksize_0/2;++i, k+=step) {
1627                 ret[k]=saved[saved_start+i]+buf[i]*swin[i]+BIAS;
1628             }
1629             retlen=saved_start+vc->blocksize_0/2;
1630             // -- save
1631             buf += vc->blocksize_0/2;
1632             swin += vc->blocksize_0/2-1;
1633             for(i=0;i<vc->blocksize_0/2;++i) {
1634                 saved[i]=buf[i]*swin[-i];
1635             }
1636             saved_start=0;
1637         }
1638     }
1639     vc->saved_start=saved_start;
1640
1641     return retlen*vc->audio_channels;
1642 }
1643
1644 // Return the decoded audio packet through the standard api
1645
1646 static int vorbis_decode_frame(AVCodecContext *avccontext,
1647                         void *data, int *data_size,
1648                         uint8_t *buf, int buf_size)
1649 {
1650     vorbis_context *vc = avccontext->priv_data ;
1651     GetBitContext *gb = &(vc->gb);
1652
1653     int_fast16_t i, len;
1654
1655     if(!buf_size){
1656         return 0;
1657     }
1658
1659     AV_DEBUG("packet length %d \n", buf_size);
1660
1661     init_get_bits(gb, buf, buf_size*8);
1662
1663     len=vorbis_parse_audio_packet(vc);
1664
1665     if (len<=0) {
1666         *data_size=0;
1667         return buf_size;
1668     }
1669
1670     if (!vc->first_frame) {
1671         vc->first_frame=1;
1672         *data_size=0;
1673         return buf_size ;
1674     }
1675
1676     AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len);
1677
1678     for(i=0;i<len;++i) {
1679         int_fast32_t tmp= ((int32_t*)vc->ret)[i];
1680         if(tmp & 0xf0000){
1681 //            tmp= (0x43c0ffff - tmp)>>31; //ask gcc devs why this is slower
1682             if(tmp > 0x43c0ffff) tmp= 0xFFFF;
1683             else                 tmp= 0;
1684         }
1685         ((int16_t*)data)[i]=tmp - 0x8000;
1686     }
1687
1688     *data_size=len*2;
1689
1690     return buf_size ;
1691 }
1692
1693 // Close decoder
1694
1695 static int vorbis_decode_close(AVCodecContext *avccontext) {
1696     vorbis_context *vc = avccontext->priv_data;
1697
1698     vorbis_free(vc);
1699
1700     return 0 ;
1701 }
1702
1703 AVCodec vorbis_decoder = {
1704     "vorbis",
1705     CODEC_TYPE_AUDIO,
1706     CODEC_ID_VORBIS,
1707     sizeof(vorbis_context),
1708     vorbis_decode_init,
1709     NULL,
1710     vorbis_decode_close,
1711     vorbis_decode_frame,
1712 };
1713