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