Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
[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 || bl1<bl0) {
876         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n");
877         return 3;
878     }
879     // output format int16
880     if (vc->blocksize_1/2 * vc->audio_channels * 2 >
881                                              AVCODEC_MAX_AUDIO_FRAME_SIZE) {
882         av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis channel count makes "
883                "output packets too large.\n");
884         return 4;
885     }
886     vc->swin=vwin[bl0-6];
887     vc->lwin=vwin[bl1-6];
888
889     if ((get_bits1(gb)) == 0) {
890         av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n");
891         return 2;
892     }
893
894     vc->channel_residues=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
895     vc->channel_floors=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
896     vc->saved=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
897     vc->ret=(float *)av_malloc((vc->blocksize_1/2)*vc->audio_channels * sizeof(float));
898     vc->buf=(float *)av_malloc(vc->blocksize_1 * sizeof(float));
899     vc->buf_tmp=(float *)av_malloc(vc->blocksize_1 * sizeof(float));
900     vc->saved_start=0;
901
902     ff_mdct_init(&vc->mdct0, bl0, 1);
903     ff_mdct_init(&vc->mdct1, bl1, 1);
904
905     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 ",
906             vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize_0, vc->blocksize_1);
907
908 /*
909     BLK=vc->blocksize_0;
910     for(i=0;i<BLK/2;++i) {
911         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)));
912     }
913 */
914
915     return 0;
916 }
917
918 // Process the extradata using the functions above (identification header, setup header)
919
920 static int vorbis_decode_init(AVCodecContext *avccontext) {
921     vorbis_context *vc = avccontext->priv_data ;
922     uint8_t *headers = avccontext->extradata;
923     int headers_len=avccontext->extradata_size;
924     uint8_t *header_start[3];
925     int header_len[3];
926     GetBitContext *gb = &(vc->gb);
927     int i, j, hdr_type;
928
929     vc->avccontext = avccontext;
930
931     if (!headers_len) {
932         av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
933         return -1;
934     }
935
936     if(headers[0] == 0 && headers[1] == 30) {
937         for(i = 0; i < 3; i++){
938             header_len[i] = *headers++ << 8;
939             header_len[i] += *headers++;
940             header_start[i] = headers;
941             headers += header_len[i];
942         }
943     } else if(headers[0] == 2) {
944         for(j=1,i=0;i<2;++i, ++j) {
945             header_len[i]=0;
946             while(j<headers_len && headers[j]==0xff) {
947                 header_len[i]+=0xff;
948                 ++j;
949             }
950             if (j>=headers_len) {
951                 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
952                 return -1;
953             }
954             header_len[i]+=headers[j];
955         }
956         header_len[2]=headers_len-header_len[0]-header_len[1]-j;
957         headers+=j;
958         header_start[0] = headers;
959         header_start[1] = header_start[0] + header_len[0];
960         header_start[2] = header_start[1] + header_len[1];
961     } else {
962         av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
963         return -1;
964     }
965
966     init_get_bits(gb, header_start[0], header_len[0]*8);
967     hdr_type=get_bits(gb, 8);
968     if (hdr_type!=1) {
969         av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n");
970         return -1;
971     }
972     if (vorbis_parse_id_hdr(vc)) {
973         av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n");
974         vorbis_free(vc);
975         return -1;
976     }
977
978     init_get_bits(gb, header_start[2], header_len[2]*8);
979     hdr_type=get_bits(gb, 8);
980     if (hdr_type!=5) {
981         av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n");
982         return -1;
983     }
984     if (vorbis_parse_setup_hdr(vc)) {
985         av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n");
986         vorbis_free(vc);
987         return -1;
988     }
989
990     avccontext->channels = vc->audio_channels;
991     avccontext->sample_rate = vc->audio_samplerate;
992
993     return 0 ;
994 }
995
996 // Decode audiopackets -------------------------------------------------
997
998 // Read and decode floor
999
1000 static uint_fast8_t vorbis_floor0_decode(vorbis_context *vc,
1001                                          vorbis_floor_data *vfu, float *vec) {
1002     vorbis_floor0 * vf=&vfu->t0;
1003     float * lsp=vf->lsp;
1004     uint_fast32_t amplitude;
1005     uint_fast32_t book_idx;
1006     uint_fast8_t blockflag=vc->modes[vc->mode_number].blockflag;
1007
1008     amplitude=get_bits(&vc->gb, vf->amplitude_bits);
1009     if (amplitude>0) {
1010         float last = 0;
1011         uint_fast16_t lsp_len = 0;
1012         uint_fast16_t idx;
1013         vorbis_codebook codebook;
1014
1015         book_idx=get_bits(&vc->gb, ilog(vf->num_books));
1016         if ( book_idx >= vf->num_books ) {
1017             av_log( vc->avccontext, AV_LOG_ERROR,
1018                     "floor0 dec: booknumber too high!\n" );
1019             //FIXME: look above
1020         }
1021         AV_DEBUG( "floor0 dec: booknumber: %u\n", book_idx );
1022         codebook=vc->codebooks[vf->book_list[book_idx]];
1023
1024         while (lsp_len<vf->order) {
1025             int vec_off;
1026
1027             AV_DEBUG( "floor0 dec: book dimension: %d\n", codebook.dimensions );
1028             AV_DEBUG( "floor0 dec: maximum depth: %d\n", codebook.maxdepth );
1029             /* read temp vector */
1030             vec_off=get_vlc2(&vc->gb,
1031                              codebook.vlc.table,
1032                              codebook.nb_bits,
1033                              codebook.maxdepth ) *
1034                              codebook.dimensions;
1035             AV_DEBUG( "floor0 dec: vector offset: %d\n", vec_off );
1036             /* copy each vector component and add last to it */
1037             for (idx=0; idx<codebook.dimensions; ++idx) {
1038                 lsp[lsp_len+idx]=codebook.codevectors[vec_off+idx]+last;
1039             }
1040             last=lsp[lsp_len+idx-1]; /* set last to last vector component */
1041
1042             lsp_len += codebook.dimensions;
1043         }
1044 #ifdef V_DEBUG
1045         /* DEBUG: output lsp coeffs */
1046         {
1047             int idx;
1048             for ( idx = 0; idx < lsp_len; ++idx )
1049                 AV_DEBUG("floor0 dec: coeff at %d is %f\n", idx, lsp[idx] );
1050         }
1051 #endif
1052
1053         /* synthesize floor output vector */
1054         {
1055             int i;
1056             int order=vf->order;
1057             float wstep=M_PI/vf->bark_map_size;
1058
1059             for(i=0;i<order;i++) { lsp[i]=2.0f*cos(lsp[i]); }
1060
1061             AV_DEBUG("floor0 synth: map_size=%d; m=%d; wstep=%f\n",
1062                      vf->map_size, order, wstep);
1063
1064             i=0;
1065             while(i<vf->map_size[blockflag]) {
1066                 int j, iter_cond=vf->map[blockflag][i];
1067                 float p=0.5f;
1068                 float q=0.5f;
1069                 float two_cos_w=2.0f*cos(wstep*iter_cond); // needed all times
1070
1071                 /* similar part for the q and p products */
1072                 for(j=0;j<order;j+=2) {
1073                     q *= lsp[j]  -two_cos_w;
1074                     p *= lsp[j+1]-two_cos_w;
1075                 }
1076                 if(j==order) { // even order
1077                     p *= p*(2.0f-two_cos_w);
1078                     q *= q*(2.0f+two_cos_w);
1079                 }
1080                 else { // odd order
1081                     q *= two_cos_w-lsp[j]; // one more time for q
1082
1083                     /* final step and square */
1084                     p *= p*(4.f-two_cos_w*two_cos_w);
1085                     q *= q;
1086                 }
1087
1088                 /* calculate linear floor value */
1089                 {
1090                     q=exp( (
1091                              ( (amplitude*vf->amplitude_offset)/
1092                                (((1<<vf->amplitude_bits)-1) * sqrt(p+q)) )
1093                              - vf->amplitude_offset ) * .11512925f
1094                          );
1095                 }
1096
1097                 /* fill vector */
1098                 do { vec[i]=q; ++i; }while(vf->map[blockflag][i]==iter_cond);
1099             }
1100         }
1101     }
1102     else {
1103         /* this channel is unused */
1104         return 1;
1105     }
1106
1107     AV_DEBUG(" Floor0 decoded\n");
1108
1109     return 0;
1110 }
1111 static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec) {
1112     vorbis_floor1 * vf=&vfu->t1;
1113     GetBitContext *gb=&vc->gb;
1114     uint_fast16_t range_v[4]={ 256, 128, 86, 64 };
1115     uint_fast16_t range=range_v[vf->multiplier-1];
1116     uint_fast16_t floor1_Y[vf->x_list_dim];
1117     uint_fast16_t floor1_Y_final[vf->x_list_dim];
1118     uint_fast8_t floor1_flag[vf->x_list_dim];
1119     uint_fast8_t class_;
1120     uint_fast8_t cdim;
1121     uint_fast8_t cbits;
1122     uint_fast8_t csub;
1123     uint_fast8_t cval;
1124     int_fast16_t book;
1125     uint_fast16_t offset;
1126     uint_fast16_t i,j;
1127     uint_fast16_t *floor_x_sort=vf->x_list_order;
1128     /*u*/int_fast16_t adx, ady, off, predicted; // WTF ? dy/adx= (unsigned)dy/adx ?
1129     int_fast16_t dy, err;
1130     uint_fast16_t lx,hx, ly, hy=0;
1131
1132
1133     if (!get_bits1(gb)) return 1; // silence
1134
1135 // Read values (or differences) for the floor's points
1136
1137     floor1_Y[0]=get_bits(gb, ilog(range-1));
1138     floor1_Y[1]=get_bits(gb, ilog(range-1));
1139
1140     AV_DEBUG("floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]);
1141
1142     offset=2;
1143     for(i=0;i<vf->partitions;++i) {
1144         class_=vf->partition_class[i];
1145         cdim=vf->class_dimensions[class_];
1146         cbits=vf->class_subclasses[class_];
1147         csub=(1<<cbits)-1;
1148         cval=0;
1149
1150         AV_DEBUG("Cbits %d \n", cbits);
1151
1152         if (cbits) { // this reads all subclasses for this partition's class
1153             cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table,
1154             vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3);
1155         }
1156
1157         for(j=0;j<cdim;++j) {
1158             book=vf->subclass_books[class_][cval & csub];
1159
1160             AV_DEBUG("book %d Cbits %d cval %d  bits:%d \n", book, cbits, cval, get_bits_count(gb));
1161
1162             cval=cval>>cbits;
1163             if (book>0) {
1164                 floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table,
1165                 vc->codebooks[book].nb_bits, 3);
1166             } else {
1167                 floor1_Y[offset+j]=0;
1168             }
1169
1170             AV_DEBUG(" floor(%d) = %d \n", vf->x_list[offset+j], floor1_Y[offset+j]);
1171         }
1172         offset+=cdim;
1173     }
1174
1175 // Amplitude calculation from the differences
1176
1177     floor1_flag[0]=1;
1178     floor1_flag[1]=1;
1179     floor1_Y_final[0]=floor1_Y[0];
1180     floor1_Y_final[1]=floor1_Y[1];
1181
1182     for(i=2;i<vf->x_list_dim;++i) {
1183         uint_fast16_t val, highroom, lowroom, room;
1184         uint_fast16_t high_neigh_offs;
1185         uint_fast16_t low_neigh_offs;
1186
1187         low_neigh_offs=vf->low_neighbour[i];
1188         high_neigh_offs=vf->high_neighbour[i];
1189         dy=floor1_Y_final[high_neigh_offs]-floor1_Y_final[low_neigh_offs];  // render_point begin
1190         adx=vf->x_list[high_neigh_offs]-vf->x_list[low_neigh_offs];
1191         ady= ABS(dy);
1192         err=ady*(vf->x_list[i]-vf->x_list[low_neigh_offs]);
1193         off=err/adx;
1194         if (dy<0) {
1195             predicted=floor1_Y_final[low_neigh_offs]-off;
1196         } else {
1197             predicted=floor1_Y_final[low_neigh_offs]+off;
1198         } // render_point end
1199
1200         val=floor1_Y[i];
1201         highroom=range-predicted;
1202         lowroom=predicted;
1203         if (highroom < lowroom) {
1204             room=highroom*2;
1205         } else {
1206             room=lowroom*2;   // SPEC mispelling
1207         }
1208         if (val) {
1209             floor1_flag[low_neigh_offs]=1;
1210             floor1_flag[high_neigh_offs]=1;
1211             floor1_flag[i]=1;
1212             if (val>=room) {
1213                 if (highroom > lowroom) {
1214                     floor1_Y_final[i]=val-lowroom+predicted;
1215                 } else {
1216                     floor1_Y_final[i]=predicted-val+highroom-1;
1217                 }
1218             } else {
1219                 if (val & 1) {
1220                     floor1_Y_final[i]=predicted-(val+1)/2;
1221                 } else {
1222                     floor1_Y_final[i]=predicted+val/2;
1223                 }
1224             }
1225         } else {
1226             floor1_flag[i]=0;
1227             floor1_Y_final[i]=predicted;
1228         }
1229
1230         AV_DEBUG(" Decoded floor(%d) = %d / val %d \n", vf->x_list[i], floor1_Y_final[i], val);
1231     }
1232
1233 // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ?
1234
1235     hx=0;
1236     lx=0;
1237     ly=floor1_Y_final[0]*vf->multiplier;  // conforms to SPEC
1238
1239     vec[0]=floor1_inverse_db_table[ly];
1240
1241     for(i=1;i<vf->x_list_dim;++i) {
1242         AV_DEBUG(" Looking at post %d \n", i);
1243
1244         if (floor1_flag[floor_x_sort[i]]) {   // SPEC mispelled
1245             int_fast16_t x, y, dy, base, sy; // if uncommented: dy = -32 adx = 2  base = 2blablabla ?????
1246
1247             hy=floor1_Y_final[floor_x_sort[i]]*vf->multiplier;
1248             hx=vf->x_list[floor_x_sort[i]];
1249
1250             dy=hy-ly;
1251             adx=hx-lx;
1252             ady= (dy<0) ? -dy:dy;//ABS(dy);
1253             base=dy/adx;
1254
1255             AV_DEBUG(" dy %d  adx %d base %d = %d \n", dy, adx, base, dy/adx);
1256
1257             x=lx;
1258             y=ly;
1259             err=0;
1260             if (dy<0) {
1261                 sy=base-1;
1262             } else {
1263                 sy=base+1;
1264             }
1265             ady=ady-(base<0 ? -base : base)*adx;
1266             vec[x]=floor1_inverse_db_table[y];
1267
1268             AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1269
1270             for(x=lx+1;(x<hx) && (x<vf->x_list[1]);++x) {
1271                 err+=ady;
1272                 if (err>=adx) {
1273                     err-=adx;
1274                     y+=sy;
1275                 } else {
1276                     y+=base;
1277                 }
1278                 vec[x]=floor1_inverse_db_table[y];
1279
1280                 AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1281             }
1282
1283 /*            for(j=1;j<hx-lx+1;++j) {  // iterating render_point
1284                 dy=hy-ly;
1285                 adx=hx-lx;
1286                 ady= dy<0 ? -dy : dy;
1287                 err=ady*j;
1288                 off=err/adx;
1289                 if (dy<0) {
1290                     predicted=ly-off;
1291                 } else {
1292                     predicted=ly+off;
1293                 }
1294                 if (lx+j < vf->x_list[1]) {
1295                     vec[lx+j]=floor1_inverse_db_table[predicted];
1296                 }
1297             }*/
1298
1299             lx=hx;
1300             ly=hy;
1301         }
1302     }
1303
1304     if (hx<vf->x_list[1]) {
1305         for(i=hx;i<vf->x_list[1];++i) {
1306             vec[i]=floor1_inverse_db_table[hy];
1307         }
1308     }
1309
1310     AV_DEBUG(" Floor decoded\n");
1311
1312     return 0;
1313 }
1314
1315 // Read and decode residue
1316
1317 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) {
1318     GetBitContext *gb=&vc->gb;
1319     uint_fast8_t c_p_c=vc->codebooks[vr->classbook].dimensions;
1320     uint_fast16_t n_to_read=vr->end-vr->begin;
1321     uint_fast16_t ptns_to_read=n_to_read/vr->partition_size;
1322     uint_fast8_t classifs[ptns_to_read*vc->audio_channels];
1323     uint_fast8_t pass;
1324     uint_fast8_t ch_used;
1325     uint_fast8_t i,j,l;
1326     uint_fast16_t k;
1327
1328     if (vr->type==2) {
1329         for(j=1;j<ch;++j) {
1330                 do_not_decode[0]&=do_not_decode[j];  // FIXME - clobbering input
1331         }
1332         if (do_not_decode[0]) return 0;
1333         ch_used=1;
1334     } else {
1335         ch_used=ch;
1336     }
1337
1338     AV_DEBUG(" residue type 0/1/2 decode begin, ch: %d  cpc %d  \n", ch, c_p_c);
1339
1340     for(pass=0;pass<=vr->maxpass;++pass) { // FIXME OPTIMIZE?
1341         uint_fast16_t voffset;
1342         uint_fast16_t partition_count;
1343         uint_fast16_t j_times_ptns_to_read;
1344
1345         voffset=vr->begin;
1346         for(partition_count=0;partition_count<ptns_to_read;) {  // SPEC        error
1347             if (!pass) {
1348                 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) {
1349                     if (!do_not_decode[j]) {
1350                         uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table,
1351                         vc->codebooks[vr->classbook].nb_bits, 3);
1352
1353                         AV_DEBUG("Classword: %d \n", temp);
1354
1355                         assert(vr->classifications > 1 && temp<=65536); //needed for inverse[]
1356                         for(i=0;i<c_p_c;++i) {
1357                             uint_fast32_t temp2;
1358
1359                             temp2=(((uint_fast64_t)temp) * inverse[vr->classifications])>>32;
1360                             classifs[j_times_ptns_to_read+partition_count+c_p_c-1-i]=temp-temp2*vr->classifications;
1361                             temp=temp2;
1362                         }
1363                     }
1364                     j_times_ptns_to_read+=ptns_to_read;
1365                 }
1366             }
1367             for(i=0;(i<c_p_c) && (partition_count<ptns_to_read);++i) {
1368                 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) {
1369                     uint_fast16_t voffs;
1370
1371                     if (!do_not_decode[j]) {
1372                         uint_fast8_t vqclass=classifs[j_times_ptns_to_read+partition_count];
1373                         int_fast16_t vqbook=vr->books[vqclass][pass];
1374
1375                         if (vqbook>=0) {
1376                             uint_fast16_t coffs;
1377                             uint_fast16_t step=vr->partition_size/vc->codebooks[vqbook].dimensions;
1378                             vorbis_codebook codebook= vc->codebooks[vqbook];
1379
1380                             if (vr->type==0) {
1381
1382                                 voffs=voffset+j*vlen;
1383                                 for(k=0;k<step;++k) {
1384                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1385                                     for(l=0;l<codebook.dimensions;++l) {
1386                                         vec[voffs+k+l*step]+=codebook.codevectors[coffs+l];  // FPMATH
1387                                     }
1388                                 }
1389                             }
1390                             else if (vr->type==1) {
1391                                 voffs=voffset+j*vlen;
1392                                 for(k=0;k<step;++k) {
1393                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1394                                     for(l=0;l<codebook.dimensions;++l, ++voffs) {
1395                                         vec[voffs]+=codebook.codevectors[coffs+l];  // FPMATH
1396
1397                                         AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d  \n", pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs);
1398                                     }
1399                                 }
1400                             }
1401                             else if (vr->type==2 && ch==2 && (voffset&1)==0 && (codebook.dimensions&1)==0) { // most frequent case optimized
1402                                 voffs=voffset>>1;
1403
1404                                 for(k=0;k<step;++k) {
1405                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1406                                     for(l=0;l<codebook.dimensions;l+=2, voffs++) {
1407                                         vec[voffs     ]+=codebook.codevectors[coffs+l  ];  // FPMATH
1408                                         vec[voffs+vlen]+=codebook.codevectors[coffs+l+1];  // FPMATH
1409
1410                                         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);
1411                                     }
1412                                 }
1413
1414                             }
1415                             else if (vr->type==2) {
1416                                 voffs=voffset;
1417
1418                                 for(k=0;k<step;++k) {
1419                                     coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions;
1420                                     for(l=0;l<codebook.dimensions;++l, ++voffs) {
1421                                         vec[voffs/ch+(voffs%ch)*vlen]+=codebook.codevectors[coffs+l];  // FPMATH FIXME use if and counter instead of / and %
1422
1423                                         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);
1424                                     }
1425                                 }
1426                             } else {
1427                                 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n");
1428                                 return 1;
1429                             }
1430                         }
1431                     }
1432                     j_times_ptns_to_read+=ptns_to_read;
1433                 }
1434                 ++partition_count;
1435                 voffset+=vr->partition_size;
1436             }
1437         }
1438     }
1439     return 0;
1440 }
1441
1442 // Decode the audio packet using the functions above
1443 #define BIAS 385
1444
1445 static int vorbis_parse_audio_packet(vorbis_context *vc) {
1446     GetBitContext *gb=&vc->gb;
1447
1448     uint_fast8_t previous_window=0,next_window=0;
1449     uint_fast8_t mode_number;
1450     uint_fast16_t blocksize;
1451     int_fast32_t i,j;
1452     uint_fast8_t no_residue[vc->audio_channels];
1453     uint_fast8_t do_not_decode[vc->audio_channels];
1454     vorbis_mapping *mapping;
1455     float *ch_res_ptr=vc->channel_residues;
1456     float *ch_floor_ptr=vc->channel_floors;
1457     uint_fast8_t res_chan[vc->audio_channels];
1458     uint_fast8_t res_num=0;
1459     int_fast16_t retlen=0;
1460     uint_fast16_t saved_start=0;
1461
1462     if (get_bits1(gb)) {
1463         av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
1464         return -1; // packet type not audio
1465     }
1466
1467     if (vc->mode_count==1) {
1468         mode_number=0;
1469     } else {
1470         mode_number=get_bits(gb, ilog(vc->mode_count-1));
1471     }
1472     vc->mode_number=mode_number;
1473     mapping=&vc->mappings[vc->modes[mode_number].mapping];
1474
1475     AV_DEBUG(" Mode number: %d , mapping: %d , blocktype %d \n", mode_number, vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag);
1476
1477     if (vc->modes[mode_number].blockflag) {
1478         previous_window=get_bits1(gb);
1479         next_window=get_bits1(gb);
1480     }
1481
1482     blocksize=vc->modes[mode_number].blockflag ? vc->blocksize_1 : vc->blocksize_0;
1483     memset(ch_res_ptr, 0, sizeof(float)*vc->audio_channels*blocksize/2); //FIXME can this be removed ?
1484     memset(ch_floor_ptr, 0, sizeof(float)*vc->audio_channels*blocksize/2); //FIXME can this be removed ?
1485
1486 // Decode floor
1487
1488     for(i=0;i<vc->audio_channels;++i) {
1489         vorbis_floor *floor;
1490         if (mapping->submaps>1) {
1491             floor=&vc->floors[mapping->submap_floor[mapping->mux[i]]];
1492         } else {
1493             floor=&vc->floors[mapping->submap_floor[0]];
1494         }
1495
1496         no_residue[i]=floor->decode(vc, &floor->data, ch_floor_ptr);
1497         ch_floor_ptr+=blocksize/2;
1498     }
1499
1500 // Nonzero vector propagate
1501
1502     for(i=mapping->coupling_steps-1;i>=0;--i) {
1503         if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) {
1504             no_residue[mapping->magnitude[i]]=0;
1505             no_residue[mapping->angle[i]]=0;
1506         }
1507     }
1508
1509 // Decode residue
1510
1511     for(i=0;i<mapping->submaps;++i) {
1512         vorbis_residue *residue;
1513         uint_fast8_t ch=0;
1514
1515         for(j=0;j<vc->audio_channels;++j) {
1516             if ((mapping->submaps==1) || (i=mapping->mux[j])) {
1517                 res_chan[j]=res_num;
1518                 if (no_residue[j]) {
1519                     do_not_decode[ch]=1;
1520                 } else {
1521                     do_not_decode[ch]=0;
1522                 }
1523                 ++ch;
1524                 ++res_num;
1525             }
1526         }
1527         residue=&vc->residues[mapping->submap_residue[i]];
1528         vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocksize/2);
1529
1530         ch_res_ptr+=ch*blocksize/2;
1531     }
1532
1533 // Inverse coupling
1534
1535     for(i=mapping->coupling_steps-1;i>=0;--i) { //warning: i has to be signed
1536         float *mag, *ang;
1537
1538         mag=vc->channel_residues+res_chan[mapping->magnitude[i]]*blocksize/2;
1539         ang=vc->channel_residues+res_chan[mapping->angle[i]]*blocksize/2;
1540         for(j=0;j<blocksize/2;++j) {
1541             float temp;
1542             if (mag[j]>0.0) {
1543                 if (ang[j]>0.0) {
1544                     ang[j]=mag[j]-ang[j];
1545                 } else {
1546                     temp=ang[j];
1547                     ang[j]=mag[j];
1548                     mag[j]+=temp;
1549                 }
1550             } else {
1551                 if (ang[j]>0.0) {
1552                     ang[j]+=mag[j];
1553                 } else {
1554                     temp=ang[j];
1555                     ang[j]=mag[j];
1556                     mag[j]-=temp;
1557                 }
1558             }
1559         }
1560     }
1561
1562 // Dotproduct
1563
1564     for(j=0, ch_floor_ptr=vc->channel_floors;j<vc->audio_channels;++j,ch_floor_ptr+=blocksize/2) {
1565         ch_res_ptr=vc->channel_residues+res_chan[j]*blocksize/2;
1566
1567         for(i=0;i<blocksize/2;++i) {
1568             ch_floor_ptr[i]*=ch_res_ptr[i]; //FPMATH
1569         }
1570     }
1571
1572 // MDCT, overlap/add, save data for next overlapping  FPMATH
1573
1574     for(j=0;j<vc->audio_channels;++j) {
1575         uint_fast8_t step=vc->audio_channels;
1576         uint_fast16_t k;
1577         float *saved=vc->saved+j*vc->blocksize_1/2;
1578         float *ret=vc->ret;
1579         const float *lwin=vc->lwin;
1580         const float *swin=vc->swin;
1581         float *buf=vc->buf;
1582         float *buf_tmp=vc->buf_tmp;
1583
1584         ch_floor_ptr=vc->channel_floors+j*blocksize/2;
1585
1586         saved_start=vc->saved_start;
1587
1588         ff_imdct_calc(vc->modes[mode_number].blockflag ? &vc->mdct1 : &vc->mdct0, buf, ch_floor_ptr, buf_tmp);
1589
1590         if (vc->modes[mode_number].blockflag) {
1591             // -- overlap/add
1592             if (previous_window) {
1593                 for(k=j, i=0;i<vc->blocksize_1/2;++i, k+=step) {
1594                     ret[k]=saved[i]+buf[i]*lwin[i]+BIAS;
1595                 }
1596                 retlen=vc->blocksize_1/2;
1597             } else {
1598                 buf += (vc->blocksize_1-vc->blocksize_0)/4;
1599                 for(k=j, i=0;i<vc->blocksize_0/2;++i, k+=step) {
1600                     ret[k]=saved[i]+buf[i]*swin[i]+BIAS;
1601                 }
1602                 buf += vc->blocksize_0/2;
1603                 for(i=0;i<(vc->blocksize_1-vc->blocksize_0)/4;++i, k+=step) {
1604                     ret[k]=buf[i]+BIAS;
1605                 }
1606                 buf=vc->buf;
1607                 retlen=vc->blocksize_0/2+(vc->blocksize_1-vc->blocksize_0)/4;
1608             }
1609             // -- save
1610             if (next_window) {
1611                 buf += vc->blocksize_1/2;
1612                 lwin += vc->blocksize_1/2-1;
1613                 for(i=0;i<vc->blocksize_1/2;++i) {
1614                     saved[i]=buf[i]*lwin[-i];
1615                 }
1616                 saved_start=0;
1617             } else {
1618                 saved_start=(vc->blocksize_1-vc->blocksize_0)/4;
1619                 buf += vc->blocksize_1/2;
1620                 for(i=0;i<saved_start;++i) {
1621                     saved[i]=buf[i];
1622                 }
1623                 swin += vc->blocksize_0/2-1;
1624                 for(i=0;i<vc->blocksize_0/2;++i) {
1625                     saved[saved_start+i]=buf[saved_start+i]*swin[-i];
1626                 }
1627             }
1628         } else {
1629             // --overlap/add
1630             for(k=j, i=0;i<saved_start;++i, k+=step) {
1631                 ret[k]=saved[i]+BIAS;
1632             }
1633             for(i=0;i<vc->blocksize_0/2;++i, k+=step) {
1634                 ret[k]=saved[saved_start+i]+buf[i]*swin[i]+BIAS;
1635             }
1636             retlen=saved_start+vc->blocksize_0/2;
1637             // -- save
1638             buf += vc->blocksize_0/2;
1639             swin += vc->blocksize_0/2-1;
1640             for(i=0;i<vc->blocksize_0/2;++i) {
1641                 saved[i]=buf[i]*swin[-i];
1642             }
1643             saved_start=0;
1644         }
1645     }
1646     vc->saved_start=saved_start;
1647
1648     return retlen*vc->audio_channels;
1649 }
1650
1651 // Return the decoded audio packet through the standard api
1652
1653 static int vorbis_decode_frame(AVCodecContext *avccontext,
1654                         void *data, int *data_size,
1655                         uint8_t *buf, int buf_size)
1656 {
1657     vorbis_context *vc = avccontext->priv_data ;
1658     GetBitContext *gb = &(vc->gb);
1659
1660     int_fast16_t i, len;
1661
1662     if(!buf_size){
1663         return 0;
1664     }
1665
1666     AV_DEBUG("packet length %d \n", buf_size);
1667
1668     init_get_bits(gb, buf, buf_size*8);
1669
1670     len=vorbis_parse_audio_packet(vc);
1671
1672     if (len<=0) {
1673         *data_size=0;
1674         return buf_size;
1675     }
1676
1677     if (!vc->first_frame) {
1678         vc->first_frame=1;
1679         *data_size=0;
1680         return buf_size ;
1681     }
1682
1683     AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len);
1684
1685     for(i=0;i<len;++i) {
1686         int_fast32_t tmp= ((int32_t*)vc->ret)[i];
1687         if(tmp & 0xf0000){
1688 //            tmp= (0x43c0ffff - tmp)>>31; //ask gcc devs why this is slower
1689             if(tmp > 0x43c0ffff) tmp= 0xFFFF;
1690             else                 tmp= 0;
1691         }
1692         ((int16_t*)data)[i]=tmp - 0x8000;
1693     }
1694
1695     *data_size=len*2;
1696
1697     return buf_size ;
1698 }
1699
1700 // Close decoder
1701
1702 static int vorbis_decode_close(AVCodecContext *avccontext) {
1703     vorbis_context *vc = avccontext->priv_data;
1704
1705     vorbis_free(vc);
1706
1707     return 0 ;
1708 }
1709
1710 AVCodec vorbis_decoder = {
1711     "vorbis",
1712     CODEC_TYPE_AUDIO,
1713     CODEC_ID_VORBIS,
1714     sizeof(vorbis_context),
1715     vorbis_decode_init,
1716     NULL,
1717     vorbis_decode_close,
1718     vorbis_decode_frame,
1719 };
1720