annotate vorbis.c @ 3683:dc1e28564bb2 libavcodec

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