Mercurial > libavcodec.hg
annotate vorbis_dec.c @ 6018:9d1654835629 libavcodec
Ensure that our total reference frame count does not exceed the SPS
max frame count, which is limited to less than the size of the
reference buffers, thereby preventing overflow.
Part of fix for issue 281.
author | heydowns |
---|---|
date | Fri, 14 Dec 2007 06:25:23 +0000 |
parents | ed05a3d964fa |
children | 2b0d16689147 |
rev | line source |
---|---|
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1 /** |
4972
c443ed30f430
rename vorbis.c to vorbis_dec.c and vorbis_common.c to vorbis.c
aurel
parents:
4971
diff
changeset
|
2 * @file vorbis_dec.c |
2697
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 | 5 |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
2720 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
2720 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
2720 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3805
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2697
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
23 #undef V_DEBUG |
3301 | 24 //#define V_DEBUG |
25 //#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
|
26 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
27 #include <math.h> |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
28 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
29 #define ALT_BITSTREAM_READER_LE |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
30 #include "avcodec.h" |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
31 #include "bitstream.h" |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
32 #include "dsputil.h" |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
33 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
34 #include "vorbis.h" |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
35 #include "xiph.h" |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
36 |
2744 | 37 #define V_NB_BITS 8 |
38 #define V_NB_BITS2 11 | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
39 #define V_MAX_VLCS (1<<16) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
40 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
41 #ifndef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
42 #define AV_DEBUG(...) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
43 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
44 |
2743 | 45 #undef NDEBUG |
46 #include <assert.h> | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
47 |
3798 | 48 typedef struct { |
49 uint_fast8_t dimensions; | |
50 uint_fast8_t lookup_type; | |
51 uint_fast8_t maxdepth; | |
52 VLC vlc; | |
53 float *codevectors; | |
54 unsigned int nb_bits; | |
55 } vorbis_codebook; | |
56 | |
57 typedef union vorbis_floor_u vorbis_floor_data; | |
58 typedef struct vorbis_floor0_s vorbis_floor0; | |
59 typedef struct vorbis_floor1_s vorbis_floor1; | |
60 struct vorbis_context_s; | |
61 typedef | |
62 uint_fast8_t (* vorbis_floor_decode_func) | |
63 (struct vorbis_context_s *, vorbis_floor_data *, float *); | |
64 typedef struct { | |
65 uint_fast8_t floor_type; | |
66 vorbis_floor_decode_func decode; | |
67 union vorbis_floor_u | |
68 { | |
69 struct vorbis_floor0_s | |
70 { | |
71 uint_fast8_t order; | |
72 uint_fast16_t rate; | |
73 uint_fast16_t bark_map_size; | |
74 int_fast32_t * map[2]; | |
75 uint_fast32_t map_size[2]; | |
76 uint_fast8_t amplitude_bits; | |
77 uint_fast8_t amplitude_offset; | |
78 uint_fast8_t num_books; | |
79 uint_fast8_t * book_list; | |
80 float * lsp; | |
81 } t0; | |
82 struct vorbis_floor1_s | |
83 { | |
84 uint_fast8_t partitions; | |
85 uint_fast8_t maximum_class; | |
86 uint_fast8_t partition_class[32]; | |
87 uint_fast8_t class_dimensions[16]; | |
88 uint_fast8_t class_subclasses[16]; | |
89 uint_fast8_t class_masterbook[16]; | |
90 int_fast16_t subclass_books[16][8]; | |
91 uint_fast8_t multiplier; | |
92 uint_fast16_t x_list_dim; | |
3801 | 93 floor1_entry_t * list; |
3798 | 94 } t1; |
95 } data; | |
96 } vorbis_floor; | |
97 | |
98 typedef struct { | |
99 uint_fast16_t type; | |
100 uint_fast32_t begin; | |
101 uint_fast32_t end; | |
102 uint_fast32_t partition_size; | |
103 uint_fast8_t classifications; | |
104 uint_fast8_t classbook; | |
105 int_fast16_t books[64][8]; | |
106 uint_fast8_t maxpass; | |
107 } vorbis_residue; | |
108 | |
109 typedef struct { | |
110 uint_fast8_t submaps; | |
111 uint_fast16_t coupling_steps; | |
112 uint_fast8_t *magnitude; | |
113 uint_fast8_t *angle; | |
114 uint_fast8_t *mux; | |
115 uint_fast8_t submap_floor[16]; | |
116 uint_fast8_t submap_residue[16]; | |
117 } vorbis_mapping; | |
118 | |
119 typedef struct { | |
120 uint_fast8_t blockflag; | |
121 uint_fast16_t windowtype; | |
122 uint_fast16_t transformtype; | |
123 uint_fast8_t mapping; | |
124 } vorbis_mode; | |
125 | |
126 typedef struct vorbis_context_s { | |
127 AVCodecContext *avccontext; | |
128 GetBitContext gb; | |
129 DSPContext dsp; | |
130 | |
131 MDCTContext mdct[2]; | |
132 uint_fast8_t first_frame; | |
133 uint_fast32_t version; | |
134 uint_fast8_t audio_channels; | |
135 uint_fast32_t audio_samplerate; | |
136 uint_fast32_t bitrate_maximum; | |
137 uint_fast32_t bitrate_nominal; | |
138 uint_fast32_t bitrate_minimum; | |
139 uint_fast32_t blocksize[2]; | |
140 const float * win[2]; | |
141 uint_fast16_t codebook_count; | |
142 vorbis_codebook *codebooks; | |
143 uint_fast8_t floor_count; | |
144 vorbis_floor *floors; | |
145 uint_fast8_t residue_count; | |
146 vorbis_residue *residues; | |
147 uint_fast8_t mapping_count; | |
148 vorbis_mapping *mappings; | |
149 uint_fast8_t mode_count; | |
150 vorbis_mode *modes; | |
151 uint_fast8_t mode_number; // mode number for the current packet | |
152 float *channel_residues; | |
153 float *channel_floors; | |
154 float *saved; | |
155 uint_fast16_t saved_start; | |
156 float *ret; | |
157 float *buf; | |
158 float *buf_tmp; | |
159 uint_fast32_t add_bias; // for float->int conversion | |
160 uint_fast32_t exp_bias; | |
161 } vorbis_context; | |
162 | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
163 /* Helper functions */ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
164 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
165 #define BARK(x) \ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
166 (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
|
167 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
168 static float vorbisfloat2float(uint_fast32_t val) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
169 double mant=val&0x1fffff; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
170 long exp=(val&0x7fe00000L)>>21; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
171 if (val&0x80000000) mant=-mant; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
172 return(ldexp(mant, exp-20-768)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
173 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
174 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
175 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
176 // Free all allocated memory ----------------------------------------- |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
177 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
178 static void vorbis_free(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
179 int_fast16_t i; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
180 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
181 av_freep(&vc->channel_residues); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
182 av_freep(&vc->channel_floors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
183 av_freep(&vc->saved); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
184 av_freep(&vc->ret); |
2737
b37add61897a
Vorbis sse fix by (Balatoni Denes: dbalatoni, programozo hu)
michael
parents:
2720
diff
changeset
|
185 av_freep(&vc->buf); |
b37add61897a
Vorbis sse fix by (Balatoni Denes: dbalatoni, programozo hu)
michael
parents:
2720
diff
changeset
|
186 av_freep(&vc->buf_tmp); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
187 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
188 av_freep(&vc->residues); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
189 av_freep(&vc->modes); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
190 |
3571 | 191 ff_mdct_end(&vc->mdct[0]); |
192 ff_mdct_end(&vc->mdct[1]); | |
2697
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 for(i=0;i<vc->codebook_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
195 av_free(vc->codebooks[i].codevectors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
196 free_vlc(&vc->codebooks[i].vlc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
197 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
198 av_freep(&vc->codebooks); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
199 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
200 for(i=0;i<vc->floor_count;++i) { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
201 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
|
202 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
|
203 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
|
204 av_free(vc->floors[i].data.t0.book_list); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
205 av_free(vc->floors[i].data.t0.lsp); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
206 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
207 else { |
3801 | 208 av_free(vc->floors[i].data.t1.list); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
209 } |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
210 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
211 av_freep(&vc->floors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
212 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
213 for(i=0;i<vc->mapping_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
214 av_free(vc->mappings[i].magnitude); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
215 av_free(vc->mappings[i].angle); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
216 av_free(vc->mappings[i].mux); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
217 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
218 av_freep(&vc->mappings); |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
219 |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
220 if(vc->exp_bias){ |
3571 | 221 av_freep(&vc->win[0]); |
222 av_freep(&vc->win[1]); | |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
223 } |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
224 } |
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 // Parse setup header ------------------------------------------------- |
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 // Process codebooks part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
229 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
230 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
231 uint_fast16_t cb; |
3802
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
232 uint8_t *tmp_vlc_bits; |
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
233 uint32_t *tmp_vlc_codes; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
234 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
235 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
236 vc->codebook_count=get_bits(gb,8)+1; |
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 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
239 |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
240 vc->codebooks=av_mallocz(vc->codebook_count * sizeof(vorbis_codebook)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
241 tmp_vlc_bits =av_mallocz(V_MAX_VLCS * sizeof(uint8_t)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
242 tmp_vlc_codes=av_mallocz(V_MAX_VLCS * sizeof(uint32_t)); |
2697
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 for(cb=0;cb<vc->codebook_count;++cb) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
245 vorbis_codebook *codebook_setup=&vc->codebooks[cb]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
246 uint_fast8_t ordered; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
247 uint_fast32_t t, used_entries=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
248 uint_fast32_t entries; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
249 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
250 AV_DEBUG(" %d. Codebook \n", cb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
251 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
252 if (get_bits(gb, 24)!=0x564342) { |
2962 | 253 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook setup data corrupt. \n", cb); |
2720 | 254 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
255 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
256 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
257 codebook_setup->dimensions=get_bits(gb, 16); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
258 if (codebook_setup->dimensions>16) { |
2962 | 259 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is too large (%d). \n", cb, codebook_setup->dimensions); |
2720 | 260 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
261 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
262 entries=get_bits(gb, 24); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
263 if (entries>V_MAX_VLCS) { |
2962 | 264 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook has too many entries (%"PRIdFAST32"). \n", cb, entries); |
2720 | 265 goto error; |
2697
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
268 ordered=get_bits1(gb); |
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 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
|
271 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
272 if (!ordered) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
273 uint_fast16_t ce; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
274 uint_fast8_t flag; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
275 uint_fast8_t sparse=get_bits1(gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
276 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
277 AV_DEBUG(" not ordered \n"); |
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 if (sparse) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
280 AV_DEBUG(" sparse \n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
281 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
282 used_entries=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
283 for(ce=0;ce<entries;++ce) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
284 flag=get_bits1(gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
285 if (flag) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
286 tmp_vlc_bits[ce]=get_bits(gb, 5)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
287 ++used_entries; |
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 else tmp_vlc_bits[ce]=0; |
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 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
292 AV_DEBUG(" not sparse \n"); |
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 used_entries=entries; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
295 for(ce=0;ce<entries;++ce) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
296 tmp_vlc_bits[ce]=get_bits(gb, 5)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
297 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
298 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
299 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
300 uint_fast16_t current_entry=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
301 uint_fast8_t current_length=get_bits(gb, 5)+1; |
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 AV_DEBUG(" ordered, current length: %d \n", current_length); //FIXME |
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 used_entries=entries; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
306 for(;current_entry<used_entries;++current_length) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
307 uint_fast16_t i, number; |
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 AV_DEBUG(" number bits: %d ", ilog(entries - current_entry)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
310 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
311 number=get_bits(gb, ilog(entries - current_entry)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
312 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
313 AV_DEBUG(" number: %d \n", number); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
314 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
315 for(i=current_entry;i<number+current_entry;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
316 if (i<used_entries) tmp_vlc_bits[i]=current_length; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
317 } |
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 current_entry+=number; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
320 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
321 if (current_entry>used_entries) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
322 av_log(vc->avccontext, AV_LOG_ERROR, " More codelengths than codes in codebook. \n"); |
2720 | 323 goto error; |
2697
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
326 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
327 codebook_setup->lookup_type=get_bits(gb, 4); |
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 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
|
330 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
331 // If the codebook is used for (inverse) VQ, calculate codevectors. |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
332 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
333 if (codebook_setup->lookup_type==1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
334 uint_fast16_t i, j, k; |
3802
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
335 uint_fast16_t codebook_lookup_values=ff_vorbis_nth_root(entries, codebook_setup->dimensions); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
336 uint_fast16_t codebook_multiplicands[codebook_lookup_values]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
337 |
3762
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
338 float codebook_minimum_value=vorbisfloat2float(get_bits_long(gb, 32)); |
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
339 float codebook_delta_value=vorbisfloat2float(get_bits_long(gb, 32)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
340 uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
341 uint_fast8_t codebook_sequence_p=get_bits1(gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
342 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
343 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
|
344 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
|
345 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
346 for(i=0;i<codebook_lookup_values;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
347 codebook_multiplicands[i]=get_bits(gb, codebook_value_bits); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
348 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
349 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
|
350 AV_DEBUG(" multiplicand %d \n", codebook_multiplicands[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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
353 // Weed out unused vlcs and build codevector vector |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
354 codebook_setup->codevectors=used_entries ? av_mallocz(used_entries*codebook_setup->dimensions * sizeof(float)) : NULL; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
355 for(j=0, i=0;i<entries;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
356 uint_fast8_t dim=codebook_setup->dimensions; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
357 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
358 if (tmp_vlc_bits[i]) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
359 float last=0.0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
360 uint_fast32_t lookup_offset=i; |
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 #ifdef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
363 av_log(vc->avccontext, AV_LOG_INFO, "Lookup offset %d ,", i); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
364 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
365 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
366 for(k=0;k<dim;++k) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
367 uint_fast32_t multiplicand_offset = lookup_offset % codebook_lookup_values; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
368 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
|
369 if (codebook_sequence_p) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
370 last=codebook_setup->codevectors[j*dim+k]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
371 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
372 lookup_offset/=codebook_lookup_values; |
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 tmp_vlc_bits[j]=tmp_vlc_bits[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
375 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
376 #ifdef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
377 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
|
378 for(k=0;k<dim;++k) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
379 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
|
380 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
381 av_log(vc->avccontext, AV_LOG_INFO, "\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
382 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
383 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
384 ++j; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
385 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
386 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
387 if (j!=used_entries) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
388 av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n"); |
2720 | 389 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
390 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
391 entries=used_entries; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
392 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
393 else if (codebook_setup->lookup_type>=2) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
394 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); |
2720 | 395 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
396 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
397 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
398 // Initialize VLC table |
3802
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
399 if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
400 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); |
2720 | 401 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
402 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
403 codebook_setup->maxdepth=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
404 for(t=0;t<entries;++t) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
405 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
|
406 |
2744 | 407 if(codebook_setup->maxdepth > 3*V_NB_BITS) codebook_setup->nb_bits=V_NB_BITS2; |
408 else codebook_setup->nb_bits=V_NB_BITS; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
409 |
2744 | 410 codebook_setup->maxdepth=(codebook_setup->maxdepth+codebook_setup->nb_bits-1)/codebook_setup->nb_bits; |
2967 | 411 |
2744 | 412 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
|
413 av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); |
2720 | 414 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
415 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
416 } |
2720 | 417 |
418 av_free(tmp_vlc_bits); | |
419 av_free(tmp_vlc_codes); | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
420 return 0; |
2720 | 421 |
422 // Error: | |
423 error: | |
424 av_free(tmp_vlc_bits); | |
425 av_free(tmp_vlc_codes); | |
426 return 1; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
427 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
428 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
429 // Process time domain transforms part (unused in Vorbis I) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
430 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
431 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
432 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
433 uint_fast8_t i; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
434 uint_fast8_t vorbis_time_count=get_bits(gb, 6)+1; |
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 for(i=0;i<vorbis_time_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
437 uint_fast16_t vorbis_tdtransform=get_bits(gb, 16); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
438 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
439 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
|
440 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
441 if (vorbis_tdtransform) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
442 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
|
443 return 1; |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
446 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
447 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
448 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
449 // Process floors part |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
450 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
451 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
|
452 vorbis_floor_data *vfu, float *vec); |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
453 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
|
454 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
|
455 vorbis_floor_data *vfu, float *vec); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
456 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
457 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
458 uint_fast16_t i,j,k; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
459 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
460 vc->floor_count=get_bits(gb, 6)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
461 |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
462 vc->floors=av_mallocz(vc->floor_count * sizeof(vorbis_floor)); |
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 for (i=0;i<vc->floor_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
465 vorbis_floor *floor_setup=&vc->floors[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
466 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
467 floor_setup->floor_type=get_bits(gb, 16); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
468 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
469 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
|
470 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
471 if (floor_setup->floor_type==1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
472 uint_fast8_t maximum_class=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
473 uint_fast8_t rangebits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
474 uint_fast16_t floor1_values=2; |
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 floor_setup->decode=vorbis_floor1_decode; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
477 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
478 floor_setup->data.t1.partitions=get_bits(gb, 5); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
479 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
480 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
|
481 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
482 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
|
483 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
|
484 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
|
485 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
486 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
|
487 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
488 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
489 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
490 AV_DEBUG(" maximum class %d \n", maximum_class); |
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 floor_setup->data.t1.maximum_class=maximum_class; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
493 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
494 for(j=0;j<=maximum_class;++j) { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
495 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
|
496 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
|
497 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
498 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
|
499 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
500 if (floor_setup->data.t1.class_subclasses[j]) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
501 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
|
502 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
503 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
|
504 } |
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(k=0;k<(1<<floor_setup->data.t1.class_subclasses[j]);++k) { |
3300 | 507 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
|
508 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
509 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
|
510 } |
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 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
513 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
|
514 floor_setup->data.t1.x_list_dim=2; |
2697
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(j=0;j<floor_setup->data.t1.partitions;++j) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
517 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
|
518 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
519 |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
520 floor_setup->data.t1.list=av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(floor1_entry_t)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
521 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
522 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
523 rangebits=get_bits(gb, 4); |
3801 | 524 floor_setup->data.t1.list[0].x = 0; |
525 floor_setup->data.t1.list[1].x = (1<<rangebits); | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
526 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
527 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
|
528 for(k=0;k<floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];++k,++floor1_values) { |
3801 | 529 floor_setup->data.t1.list[floor1_values].x=get_bits(gb, rangebits); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
530 |
3801 | 531 AV_DEBUG(" %d. floor1 Y coord. %d \n", floor1_values, floor_setup->data.t1.list[floor1_values].x); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
532 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
533 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
534 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
535 // Precalculate order of x coordinates - needed for decode |
3801 | 536 ff_vorbis_ready_floor1_list(floor_setup->data.t1.list, floor_setup->data.t1.x_list_dim); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
537 } |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
538 else if(floor_setup->floor_type==0) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
539 uint_fast8_t max_codebook_dim=0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
540 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
541 floor_setup->decode=vorbis_floor0_decode; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
542 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
543 floor_setup->data.t0.order=get_bits(gb, 8); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
544 floor_setup->data.t0.rate=get_bits(gb, 16); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
545 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
|
546 floor_setup->data.t0.amplitude_bits=get_bits(gb, 6); |
3084 | 547 /* zero would result in a div by zero later * |
548 * 2^0 - 1 == 0 */ | |
549 if (floor_setup->data.t0.amplitude_bits == 0) { | |
550 av_log(vc->avccontext, AV_LOG_ERROR, | |
551 "Floor 0 amplitude bits is 0.\n"); | |
552 return 1; | |
553 } | |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
554 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
|
555 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
|
556 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
557 /* allocate mem for booklist */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
558 floor_setup->data.t0.book_list= |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
559 av_malloc(floor_setup->data.t0.num_books); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
560 if(!floor_setup->data.t0.book_list) { return 1; } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
561 /* read book indexes */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
562 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
563 int idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
564 uint_fast8_t book_idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
565 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
|
566 book_idx=get_bits(gb, 8); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
567 floor_setup->data.t0.book_list[idx]=book_idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
568 if (vc->codebooks[book_idx].dimensions > max_codebook_dim) |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
569 max_codebook_dim=vc->codebooks[book_idx].dimensions; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
570 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
571 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
|
572 return 1; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
573 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
574 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
575 |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
576 create_map( vc, i ); |
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
577 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
578 /* allocate mem for lsp coefficients */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
579 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
580 /* 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
|
581 * 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
|
582 floor_setup->data.t0.lsp= |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
583 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
|
584 * sizeof(float)); |
3084 | 585 if(!floor_setup->data.t0.lsp) { return 1; } |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
586 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
587 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
588 #ifdef V_DEBUG /* debug output parsed headers */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
589 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
|
590 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
|
591 AV_DEBUG("floor0 bark map size: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
592 floor_setup->data.t0.bark_map_size); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
593 AV_DEBUG("floor0 amplitude bits: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
594 floor_setup->data.t0.amplitude_bits); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
595 AV_DEBUG("floor0 amplitude offset: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
596 floor_setup->data.t0.amplitude_offset); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
597 AV_DEBUG("floor0 number of books: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
598 floor_setup->data.t0.num_books); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
599 AV_DEBUG("floor0 book list pointer: %p\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
600 floor_setup->data.t0.book_list); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
601 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
602 int idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
603 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
|
604 AV_DEBUG( " Book %d: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
605 idx+1, |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
606 floor_setup->data.t0.book_list[idx] ); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
607 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
608 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
609 #endif |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
610 } |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
611 else { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
612 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
|
613 return 1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
614 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
615 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
616 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
617 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
618 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
619 // Process residues part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
620 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
621 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc){ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
622 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
623 uint_fast8_t i, j, k; |
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 vc->residue_count=get_bits(gb, 6)+1; |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
626 vc->residues=av_mallocz(vc->residue_count * sizeof(vorbis_residue)); |
2697
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 AV_DEBUG(" There are %d residues. \n", vc->residue_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
629 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
630 for(i=0;i<vc->residue_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
631 vorbis_residue *res_setup=&vc->residues[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
632 uint_fast8_t cascade[64]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
633 uint_fast8_t high_bits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
634 uint_fast8_t low_bits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
635 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
636 res_setup->type=get_bits(gb, 16); |
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(" %d. residue type %d \n", i, res_setup->type); |
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 res_setup->begin=get_bits(gb, 24); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
641 res_setup->end=get_bits(gb, 24); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
642 res_setup->partition_size=get_bits(gb, 24)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
643 res_setup->classifications=get_bits(gb, 6)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
644 res_setup->classbook=get_bits(gb, 8); |
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 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
|
647 res_setup->classifications, res_setup->classbook); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
648 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
649 for(j=0;j<res_setup->classifications;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
650 high_bits=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
651 low_bits=get_bits(gb, 3); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
652 if (get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
653 high_bits=get_bits(gb, 5); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
654 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
655 cascade[j]=(high_bits<<3)+low_bits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
656 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
657 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
|
658 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
659 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
660 res_setup->maxpass=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
661 for(j=0;j<res_setup->classifications;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
662 for(k=0;k<8;++k) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
663 if (cascade[j]&(1<<k)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
664 res_setup->books[j][k]=get_bits(gb, 8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
665 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
666 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
|
667 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
668 if (k>res_setup->maxpass) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
669 res_setup->maxpass=k; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
670 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
671 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
672 res_setup->books[j][k]=-1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
673 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
674 } |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
677 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
678 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
679 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
680 // Process mappings part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
681 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
682 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
683 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
684 uint_fast8_t i, j; |
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 vc->mapping_count=get_bits(gb, 6)+1; |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
687 vc->mappings=av_mallocz(vc->mapping_count * sizeof(vorbis_mapping)); |
2697
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 AV_DEBUG(" There are %d mappings. \n", vc->mapping_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
690 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
691 for(i=0;i<vc->mapping_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
692 vorbis_mapping *mapping_setup=&vc->mappings[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
693 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
694 if (get_bits(gb, 16)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
695 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
|
696 return 1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
697 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
698 if (get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
699 mapping_setup->submaps=get_bits(gb, 4)+1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
700 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
701 mapping_setup->submaps=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
702 } |
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_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
705 mapping_setup->coupling_steps=get_bits(gb, 8)+1; |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
706 mapping_setup->magnitude=av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
707 mapping_setup->angle =av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
708 for(j=0;j<mapping_setup->coupling_steps;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
709 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
|
710 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
|
711 // FIXME: sanity checks |
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 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
714 mapping_setup->coupling_steps=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
715 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
716 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
717 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
|
718 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
719 if(get_bits(gb, 2)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
720 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
|
721 return 1; // following spec. |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
724 if (mapping_setup->submaps>1) { |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
725 mapping_setup->mux=av_mallocz(vc->audio_channels * sizeof(uint_fast8_t)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
726 for(j=0;j<vc->audio_channels;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
727 mapping_setup->mux[j]=get_bits(gb, 4); |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
730 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
731 for(j=0;j<mapping_setup->submaps;++j) { |
5518 | 732 skip_bits(gb, 8); // FIXME check? |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
733 mapping_setup->submap_floor[j]=get_bits(gb, 8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
734 mapping_setup->submap_residue[j]=get_bits(gb, 8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
735 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
736 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
|
737 } |
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 return 0; |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
742 // Process modes part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
743 |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
744 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
|
745 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
746 vorbis_floor * floors=vc->floors; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
747 vorbis_floor0 * vf; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
748 int idx; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
749 int_fast8_t blockflag; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
750 int_fast32_t * map; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
751 int_fast32_t n; //TODO: could theoretically be smaller? |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
752 |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
753 for (blockflag=0;blockflag<2;++blockflag) |
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
754 { |
3574 | 755 n=vc->blocksize[blockflag]/2; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
756 floors[floor_number].data.t0.map[blockflag]= |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
757 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
|
758 |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
759 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
|
760 vf=&floors[floor_number].data.t0; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
761 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
762 for (idx=0; idx<n;++idx) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
763 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
|
764 ((vf->bark_map_size)/ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
765 BARK(vf->rate/2.0f )) ); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
766 if (vf->bark_map_size-1 < map[idx]) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
767 map[idx]=vf->bark_map_size-1; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
768 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
769 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
770 map[n]=-1; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
771 vf->map_size[blockflag]=n; |
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
772 } |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
773 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
774 # ifdef V_DEBUG |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
775 for(idx=0;idx<=n;++idx) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
776 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
|
777 idx, map[idx]); |
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 # endif |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
780 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
781 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
782 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
783 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
784 uint_fast8_t i; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
785 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
786 vc->mode_count=get_bits(gb, 6)+1; |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
787 vc->modes=av_mallocz(vc->mode_count * sizeof(vorbis_mode)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
788 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
789 AV_DEBUG(" There are %d modes.\n", vc->mode_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
790 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
791 for(i=0;i<vc->mode_count;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
792 vorbis_mode *mode_setup=&vc->modes[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
793 |
5513 | 794 mode_setup->blockflag=get_bits1(gb); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
795 mode_setup->windowtype=get_bits(gb, 16); //FIXME check |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
796 mode_setup->transformtype=get_bits(gb, 16); //FIXME check |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
797 mode_setup->mapping=get_bits(gb, 8); //FIXME check |
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(" %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
|
800 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
801 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
802 } |
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 // Process the whole setup header using the functions above |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
805 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
806 static int vorbis_parse_setup_hdr(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
807 GetBitContext *gb=&vc->gb; |
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 if ((get_bits(gb, 8)!='v') || (get_bits(gb, 8)!='o') || |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
810 (get_bits(gb, 8)!='r') || (get_bits(gb, 8)!='b') || |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
811 (get_bits(gb, 8)!='i') || (get_bits(gb, 8)!='s')) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
812 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
|
813 return 1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
814 } |
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 if (vorbis_parse_setup_hdr_codebooks(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
817 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
|
818 return 2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
819 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
820 if (vorbis_parse_setup_hdr_tdtransforms(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
821 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
|
822 return 3; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
823 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
824 if (vorbis_parse_setup_hdr_floors(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
825 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
|
826 return 4; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
827 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
828 if (vorbis_parse_setup_hdr_residues(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
829 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
|
830 return 5; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
831 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
832 if (vorbis_parse_setup_hdr_mappings(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
833 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
|
834 return 6; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
835 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
836 if (vorbis_parse_setup_hdr_modes(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
837 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
|
838 return 7; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
839 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
840 if (!get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
841 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
|
842 return 8; // framing flag bit unset error |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
843 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
844 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
845 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
846 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
847 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
848 // Process the identification header |
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 static int vorbis_parse_id_hdr(vorbis_context *vc){ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
851 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
852 uint_fast8_t bl0, bl1; |
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 if ((get_bits(gb, 8)!='v') || (get_bits(gb, 8)!='o') || |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
855 (get_bits(gb, 8)!='r') || (get_bits(gb, 8)!='b') || |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
856 (get_bits(gb, 8)!='i') || (get_bits(gb, 8)!='s')) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
857 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
|
858 return 1; |
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 |
3762
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
861 vc->version=get_bits_long(gb, 32); //FIXME check 0 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
862 vc->audio_channels=get_bits(gb, 8); //FIXME check >0 |
3762
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
863 vc->audio_samplerate=get_bits_long(gb, 32); //FIXME check >0 |
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
864 vc->bitrate_maximum=get_bits_long(gb, 32); |
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
865 vc->bitrate_nominal=get_bits_long(gb, 32); |
f1e4ea591eb6
Get rid of get_bits_long_le, get_bits_long was fixed and now behaves the same way.
reimar
parents:
3757
diff
changeset
|
866 vc->bitrate_minimum=get_bits_long(gb, 32); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
867 bl0=get_bits(gb, 4); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
868 bl1=get_bits(gb, 4); |
3571 | 869 vc->blocksize[0]=(1<<bl0); |
870 vc->blocksize[1]=(1<<bl1); | |
3270
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
871 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
|
872 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
|
873 return 3; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
874 } |
3270
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
875 // output format int16 |
3571 | 876 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
|
877 AVCODEC_MAX_AUDIO_FRAME_SIZE) { |
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
878 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
|
879 "output packets too large.\n"); |
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
880 return 4; |
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
881 } |
3798 | 882 vc->win[0]=ff_vorbis_vwin[bl0-6]; |
883 vc->win[1]=ff_vorbis_vwin[bl1-6]; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
884 |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
885 if(vc->exp_bias){ |
3571 | 886 int i, j; |
887 for(j=0; j<2; j++){ | |
888 float *win = av_malloc(vc->blocksize[j]/2 * sizeof(float)); | |
889 for(i=0; i<vc->blocksize[j]/2; i++) | |
890 win[i] = vc->win[j][i] * (1<<15); | |
891 vc->win[j] = win; | |
892 } | |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
893 } |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
894 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
895 if ((get_bits1(gb)) == 0) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
896 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
|
897 return 2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
898 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
899 |
5958
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
900 vc->channel_residues= av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
901 vc->channel_floors = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
902 vc->saved = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
903 vc->ret = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
904 vc->buf = av_malloc( vc->blocksize[1] * sizeof(float)); |
ed05a3d964fa
stupid code (casting of void*) found by checktree.sh
michael
parents:
5855
diff
changeset
|
905 vc->buf_tmp = av_malloc( vc->blocksize[1] * sizeof(float)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
906 vc->saved_start=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
907 |
3571 | 908 ff_mdct_init(&vc->mdct[0], bl0, 1); |
909 ff_mdct_init(&vc->mdct[1], bl1, 1); | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
910 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
911 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 | 912 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
|
913 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
914 /* |
3571 | 915 BLK=vc->blocksize[0]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
916 for(i=0;i<BLK/2;++i) { |
3571 | 917 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
|
918 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
919 */ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
920 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
921 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
922 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
923 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
924 // Process the extradata using the functions above (identification header, setup header) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
925 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
926 static int vorbis_decode_init(AVCodecContext *avccontext) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
927 vorbis_context *vc = avccontext->priv_data ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
928 uint8_t *headers = avccontext->extradata; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
929 int headers_len=avccontext->extradata_size; |
2716 | 930 uint8_t *header_start[3]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
931 int header_len[3]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
932 GetBitContext *gb = &(vc->gb); |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
933 int hdr_type; |
2697
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 vc->avccontext = avccontext; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
936 dsputil_init(&vc->dsp, avccontext); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
937 |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
938 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
|
939 vc->add_bias = 385; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
940 vc->exp_bias = 0; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
941 } else { |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
942 vc->add_bias = 0; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
943 vc->exp_bias = 15<<23; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
944 } |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
945 |
2716 | 946 if (!headers_len) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
947 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
948 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
949 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
950 |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
951 if (ff_split_xiph_headers(headers, headers_len, 30, header_start, header_len) < 0) { |
2716 | 952 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
953 return -1; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
954 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
955 |
2716 | 956 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
|
957 hdr_type=get_bits(gb, 8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
958 if (hdr_type!=1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
959 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
|
960 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
961 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
962 if (vorbis_parse_id_hdr(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
963 av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
964 vorbis_free(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
965 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
966 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
967 |
2716 | 968 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
|
969 hdr_type=get_bits(gb, 8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
970 if (hdr_type!=5) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
971 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
|
972 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
973 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
974 if (vorbis_parse_setup_hdr(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
975 av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
976 vorbis_free(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
977 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
978 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
979 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
980 avccontext->channels = vc->audio_channels; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
981 avccontext->sample_rate = vc->audio_samplerate; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
982 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
983 return 0 ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
984 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
985 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
986 // Decode audiopackets ------------------------------------------------- |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
987 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
988 // Read and decode floor |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
989 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
990 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
|
991 vorbis_floor_data *vfu, float *vec) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
992 vorbis_floor0 * vf=&vfu->t0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
993 float * lsp=vf->lsp; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
994 uint_fast32_t amplitude; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
995 uint_fast32_t book_idx; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
996 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
|
997 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
998 amplitude=get_bits(&vc->gb, vf->amplitude_bits); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
999 if (amplitude>0) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1000 float last = 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1001 uint_fast16_t lsp_len = 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1002 uint_fast16_t idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1003 vorbis_codebook codebook; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1004 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1005 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
|
1006 if ( book_idx >= vf->num_books ) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1007 av_log( vc->avccontext, AV_LOG_ERROR, |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1008 "floor0 dec: booknumber too high!\n" ); |
5855 | 1009 book_idx= 0; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1010 //FIXME: look above |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1011 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1012 AV_DEBUG( "floor0 dec: booknumber: %u\n", book_idx ); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1013 codebook=vc->codebooks[vf->book_list[book_idx]]; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1014 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1015 while (lsp_len<vf->order) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1016 int vec_off; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1017 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1018 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
|
1019 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
|
1020 /* read temp vector */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1021 vec_off=get_vlc2(&vc->gb, |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1022 codebook.vlc.table, |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1023 codebook.nb_bits, |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1024 codebook.maxdepth ) * |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1025 codebook.dimensions; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1026 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
|
1027 /* copy each vector component and add last to it */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1028 for (idx=0; idx<codebook.dimensions; ++idx) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1029 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
|
1030 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1031 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
|
1032 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1033 lsp_len += codebook.dimensions; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1034 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1035 #ifdef V_DEBUG |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1036 /* DEBUG: output lsp coeffs */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1037 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1038 int idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1039 for ( idx = 0; idx < lsp_len; ++idx ) |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1040 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
|
1041 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1042 #endif |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1043 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1044 /* synthesize floor output vector */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1045 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1046 int i; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1047 int order=vf->order; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1048 float wstep=M_PI/vf->bark_map_size; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1049 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1050 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
|
1051 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1052 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
|
1053 vf->map_size, order, wstep); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1054 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1055 i=0; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
1056 while(i<vf->map_size[blockflag]) { |
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
1057 int j, iter_cond=vf->map[blockflag][i]; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1058 float p=0.5f; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1059 float q=0.5f; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1060 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
|
1061 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1062 /* similar part for the q and p products */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1063 for(j=0;j<order;j+=2) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1064 q *= lsp[j] -two_cos_w; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1065 p *= lsp[j+1]-two_cos_w; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1066 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1067 if(j==order) { // even order |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1068 p *= p*(2.0f-two_cos_w); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1069 q *= q*(2.0f+two_cos_w); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1070 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1071 else { // odd order |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1072 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
|
1073 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1074 /* final step and square */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1075 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
|
1076 q *= q; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1077 } |
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 /* calculate linear floor value */ |
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 q=exp( ( |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1082 ( (amplitude*vf->amplitude_offset)/ |
3084 | 1083 (((1<<vf->amplitude_bits)-1) * sqrt(p+q)) ) |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1084 - vf->amplitude_offset ) * .11512925f |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1085 ); |
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 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1088 /* fill vector */ |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
1089 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
|
1090 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1091 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1092 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1093 else { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1094 /* this channel is unused */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1095 return 1; |
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 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1098 AV_DEBUG(" Floor0 decoded\n"); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1099 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1100 return 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1101 } |
3805
5ad55a4e42c2
remove render_line from vorbis.h, add ff_vorbis_floor1_render_list instead
ods15
parents:
3802
diff
changeset
|
1102 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1103 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
|
1104 vorbis_floor1 * vf=&vfu->t1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1105 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1106 uint_fast16_t range_v[4]={ 256, 128, 86, 64 }; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1107 uint_fast16_t range=range_v[vf->multiplier-1]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1108 uint_fast16_t floor1_Y[vf->x_list_dim]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1109 uint_fast16_t floor1_Y_final[vf->x_list_dim]; |
3805
5ad55a4e42c2
remove render_line from vorbis.h, add ff_vorbis_floor1_render_list instead
ods15
parents:
3802
diff
changeset
|
1110 int floor1_flag[vf->x_list_dim]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1111 uint_fast8_t class_; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1112 uint_fast8_t cdim; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1113 uint_fast8_t cbits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1114 uint_fast8_t csub; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1115 uint_fast8_t cval; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1116 int_fast16_t book; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1117 uint_fast16_t offset; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1118 uint_fast16_t i,j; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1119 /*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
|
1120 int_fast16_t dy, err; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1121 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1122 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1123 if (!get_bits1(gb)) return 1; // silence |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1124 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1125 // Read values (or differences) for the floor's points |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1126 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1127 floor1_Y[0]=get_bits(gb, ilog(range-1)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1128 floor1_Y[1]=get_bits(gb, ilog(range-1)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1129 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1130 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
|
1131 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1132 offset=2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1133 for(i=0;i<vf->partitions;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1134 class_=vf->partition_class[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1135 cdim=vf->class_dimensions[class_]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1136 cbits=vf->class_subclasses[class_]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1137 csub=(1<<cbits)-1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1138 cval=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1139 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1140 AV_DEBUG("Cbits %d \n", cbits); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1141 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1142 if (cbits) { // this reads all subclasses for this partition's class |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1143 cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table, |
2744 | 1144 vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1145 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1146 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1147 for(j=0;j<cdim;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1148 book=vf->subclass_books[class_][cval & csub]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1149 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1150 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
|
1151 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1152 cval=cval>>cbits; |
3757 | 1153 if (book>-1) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1154 floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table, |
2744 | 1155 vc->codebooks[book].nb_bits, 3); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1156 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1157 floor1_Y[offset+j]=0; |
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 |
3801 | 1160 AV_DEBUG(" floor(%d) = %d \n", vf->list[offset+j].x, floor1_Y[offset+j]); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1161 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1162 offset+=cdim; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1163 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1164 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1165 // Amplitude calculation from the differences |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1166 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1167 floor1_flag[0]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1168 floor1_flag[1]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1169 floor1_Y_final[0]=floor1_Y[0]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1170 floor1_Y_final[1]=floor1_Y[1]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1171 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1172 for(i=2;i<vf->x_list_dim;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1173 uint_fast16_t val, highroom, lowroom, room; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1174 uint_fast16_t high_neigh_offs; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1175 uint_fast16_t low_neigh_offs; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1176 |
3801 | 1177 low_neigh_offs=vf->list[i].low; |
1178 high_neigh_offs=vf->list[i].high; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1179 dy=floor1_Y_final[high_neigh_offs]-floor1_Y_final[low_neigh_offs]; // render_point begin |
3801 | 1180 adx=vf->list[high_neigh_offs].x-vf->list[low_neigh_offs].x; |
4001 | 1181 ady= FFABS(dy); |
3801 | 1182 err=ady*(vf->list[i].x-vf->list[low_neigh_offs].x); |
3535 | 1183 off=(int16_t)err/(int16_t)adx; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1184 if (dy<0) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1185 predicted=floor1_Y_final[low_neigh_offs]-off; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1186 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1187 predicted=floor1_Y_final[low_neigh_offs]+off; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1188 } // render_point end |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1189 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1190 val=floor1_Y[i]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1191 highroom=range-predicted; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1192 lowroom=predicted; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1193 if (highroom < lowroom) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1194 room=highroom*2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1195 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1196 room=lowroom*2; // SPEC mispelling |
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 if (val) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1199 floor1_flag[low_neigh_offs]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1200 floor1_flag[high_neigh_offs]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1201 floor1_flag[i]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1202 if (val>=room) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1203 if (highroom > lowroom) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1204 floor1_Y_final[i]=val-lowroom+predicted; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1205 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1206 floor1_Y_final[i]=predicted-val+highroom-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 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1209 if (val & 1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1210 floor1_Y_final[i]=predicted-(val+1)/2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1211 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1212 floor1_Y_final[i]=predicted+val/2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1213 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1214 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1215 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1216 floor1_flag[i]=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1217 floor1_Y_final[i]=predicted; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1218 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1219 |
3801 | 1220 AV_DEBUG(" Decoded floor(%d) = %d / val %d \n", vf->list[i].x, floor1_Y_final[i], val); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1221 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1222 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1223 // 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
|
1224 |
3805
5ad55a4e42c2
remove render_line from vorbis.h, add ff_vorbis_floor1_render_list instead
ods15
parents:
3802
diff
changeset
|
1225 ff_vorbis_floor1_render_list(vf->list, vf->x_list_dim, floor1_Y_final, floor1_flag, vf->multiplier, vec, vf->list[1].x); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1226 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1227 AV_DEBUG(" Floor decoded\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1228 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1229 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1230 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1231 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1232 // Read and decode residue |
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 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
|
1235 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1236 uint_fast8_t c_p_c=vc->codebooks[vr->classbook].dimensions; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1237 uint_fast16_t n_to_read=vr->end-vr->begin; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1238 uint_fast16_t ptns_to_read=n_to_read/vr->partition_size; |
2715 | 1239 uint_fast8_t classifs[ptns_to_read*vc->audio_channels]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1240 uint_fast8_t pass; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1241 uint_fast8_t ch_used; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1242 uint_fast8_t i,j,l; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1243 uint_fast16_t k; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1244 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1245 if (vr->type==2) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1246 for(j=1;j<ch;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1247 do_not_decode[0]&=do_not_decode[j]; // FIXME - clobbering input |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1248 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1249 if (do_not_decode[0]) return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1250 ch_used=1; |
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 ch_used=ch; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1253 } |
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 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
|
1256 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1257 for(pass=0;pass<=vr->maxpass;++pass) { // FIXME OPTIMIZE? |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1258 uint_fast16_t voffset; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1259 uint_fast16_t partition_count; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1260 uint_fast16_t j_times_ptns_to_read; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1261 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1262 voffset=vr->begin; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1263 for(partition_count=0;partition_count<ptns_to_read;) { // SPEC error |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1264 if (!pass) { |
4174 | 1265 uint_fast32_t inverse_class = ff_inverse[vr->classifications]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1266 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
|
1267 if (!do_not_decode[j]) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1268 uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table, |
2744 | 1269 vc->codebooks[vr->classbook].nb_bits, 3); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1270 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1271 AV_DEBUG("Classword: %d \n", temp); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1272 |
3145 | 1273 assert(vr->classifications > 1 && temp<=65536); //needed for inverse[] |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1274 for(i=0;i<c_p_c;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1275 uint_fast32_t temp2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1276 |
3570 | 1277 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
|
1278 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
|
1279 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
|
1280 } |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1281 temp=temp2; |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1284 j_times_ptns_to_read+=ptns_to_read; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1285 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1286 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1287 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
|
1288 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
|
1289 uint_fast16_t voffs; |
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 if (!do_not_decode[j]) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1292 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
|
1293 int_fast16_t vqbook=vr->books[vqclass][pass]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1294 |
5352 | 1295 if (vqbook>=0 && vc->codebooks[vqbook].codevectors) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1296 uint_fast16_t coffs; |
3570 | 1297 unsigned dim= vc->codebooks[vqbook].dimensions; // not uint_fast8_t: 64bit is slower here on amd64 |
3540 | 1298 uint_fast16_t step= dim==1 ? vr->partition_size |
1299 : FASTDIV(vr->partition_size, dim); | |
2743 | 1300 vorbis_codebook codebook= vc->codebooks[vqbook]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1301 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1302 if (vr->type==0) { |
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 voffs=voffset+j*vlen; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1305 for(k=0;k<step;++k) { |
3570 | 1306 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
1307 for(l=0;l<dim;++l) { | |
2743 | 1308 vec[voffs+k+l*step]+=codebook.codevectors[coffs+l]; // FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1309 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1310 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1311 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1312 else if (vr->type==1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1313 voffs=voffset+j*vlen; |
2743 | 1314 for(k=0;k<step;++k) { |
3570 | 1315 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
1316 for(l=0;l<dim;++l, ++voffs) { | |
2743 | 1317 vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1318 |
2743 | 1319 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
|
1320 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1321 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1322 } |
3570 | 1323 else if (vr->type==2 && ch==2 && (voffset&1)==0 && (dim&1)==0) { // most frequent case optimized |
2743 | 1324 voffs=voffset>>1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1325 |
3570 | 1326 if(dim==2) { |
1327 for(k=0;k<step;++k) { | |
1328 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 2; | |
1329 vec[voffs+k ]+=codebook.codevectors[coffs ]; // FPMATH | |
1330 vec[voffs+k+vlen]+=codebook.codevectors[coffs+1]; // FPMATH | |
1331 } | |
1332 } else | |
2743 | 1333 for(k=0;k<step;++k) { |
3570 | 1334 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
1335 for(l=0;l<dim;l+=2, voffs++) { | |
2743 | 1336 vec[voffs ]+=codebook.codevectors[coffs+l ]; // FPMATH |
1337 vec[voffs+vlen]+=codebook.codevectors[coffs+l+1]; // FPMATH | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1338 |
2743 | 1339 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
|
1340 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1341 } |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1344 else if (vr->type==2) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1345 voffs=voffset; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1346 |
2743 | 1347 for(k=0;k<step;++k) { |
3570 | 1348 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
1349 for(l=0;l<dim;++l, ++voffs) { | |
2743 | 1350 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
|
1351 |
2743 | 1352 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
|
1353 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1354 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1355 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1356 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
|
1357 return 1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1358 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1359 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1360 } |
2715 | 1361 j_times_ptns_to_read+=ptns_to_read; |
2697
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 ++partition_count; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1364 voffset+=vr->partition_size; |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1367 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1368 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1369 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1370 |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1371 void vorbis_inverse_coupling(float *mag, float *ang, int blocksize) |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1372 { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1373 int i; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1374 for(i=0; i<blocksize; i++) |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1375 { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1376 if (mag[i]>0.0) { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1377 if (ang[i]>0.0) { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1378 ang[i]=mag[i]-ang[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1379 } else { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1380 float temp=ang[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1381 ang[i]=mag[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1382 mag[i]+=temp; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1383 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1384 } else { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1385 if (ang[i]>0.0) { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1386 ang[i]+=mag[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1387 } else { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1388 float temp=ang[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1389 ang[i]=mag[i]; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1390 mag[i]-=temp; |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1391 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1392 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1393 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1394 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1395 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1396 // Decode the audio packet using the functions above |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1397 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1398 static int vorbis_parse_audio_packet(vorbis_context *vc) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1399 GetBitContext *gb=&vc->gb; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1400 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1401 uint_fast8_t previous_window=0,next_window=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1402 uint_fast8_t mode_number; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1403 uint_fast16_t blocksize; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1404 int_fast32_t i,j; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1405 uint_fast8_t no_residue[vc->audio_channels]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1406 uint_fast8_t do_not_decode[vc->audio_channels]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1407 vorbis_mapping *mapping; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1408 float *ch_res_ptr=vc->channel_residues; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1409 float *ch_floor_ptr=vc->channel_floors; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1410 uint_fast8_t res_chan[vc->audio_channels]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1411 uint_fast8_t res_num=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1412 int_fast16_t retlen=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1413 uint_fast16_t saved_start=0; |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1414 float fadd_bias = vc->add_bias; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1415 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1416 if (get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1417 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
|
1418 return -1; // packet type not audio |
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 |
2720 | 1421 if (vc->mode_count==1) { |
1422 mode_number=0; | |
1423 } else { | |
1424 mode_number=get_bits(gb, ilog(vc->mode_count-1)); | |
1425 } | |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
1426 vc->mode_number=mode_number; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1427 mapping=&vc->mappings[vc->modes[mode_number].mapping]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1428 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1429 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
|
1430 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1431 if (vc->modes[mode_number].blockflag) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1432 previous_window=get_bits1(gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1433 next_window=get_bits1(gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1434 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1435 |
3571 | 1436 blocksize=vc->blocksize[vc->modes[mode_number].blockflag]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1437 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
|
1438 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
|
1439 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1440 // Decode floor |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1441 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1442 for(i=0;i<vc->audio_channels;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1443 vorbis_floor *floor; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1444 if (mapping->submaps>1) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1445 floor=&vc->floors[mapping->submap_floor[mapping->mux[i]]]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1446 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1447 floor=&vc->floors[mapping->submap_floor[0]]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1448 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1449 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1450 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
|
1451 ch_floor_ptr+=blocksize/2; |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1454 // Nonzero vector propagate |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1455 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1456 for(i=mapping->coupling_steps-1;i>=0;--i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1457 if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1458 no_residue[mapping->magnitude[i]]=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1459 no_residue[mapping->angle[i]]=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1460 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1461 } |
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 // Decode residue |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1464 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1465 for(i=0;i<mapping->submaps;++i) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1466 vorbis_residue *residue; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1467 uint_fast8_t ch=0; |
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 for(j=0;j<vc->audio_channels;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1470 if ((mapping->submaps==1) || (i=mapping->mux[j])) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1471 res_chan[j]=res_num; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1472 if (no_residue[j]) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1473 do_not_decode[ch]=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1474 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1475 do_not_decode[ch]=0; |
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 ++ch; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1478 ++res_num; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1479 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1480 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1481 residue=&vc->residues[mapping->submap_residue[i]]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1482 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
|
1483 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1484 ch_res_ptr+=ch*blocksize/2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1485 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1486 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1487 // Inverse coupling |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1488 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1489 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
|
1490 float *mag, *ang; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1491 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1492 mag=vc->channel_residues+res_chan[mapping->magnitude[i]]*blocksize/2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1493 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
|
1494 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize/2); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1495 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1496 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1497 // Dotproduct |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1498 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1499 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
|
1500 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
|
1501 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
|
1502 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1503 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1504 // MDCT, overlap/add, save data for next overlapping FPMATH |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1505 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1506 for(j=0;j<vc->audio_channels;++j) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1507 uint_fast8_t step=vc->audio_channels; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1508 uint_fast16_t k; |
3571 | 1509 float *saved=vc->saved+j*vc->blocksize[1]/2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1510 float *ret=vc->ret; |
3571 | 1511 const float *lwin=vc->win[1]; |
1512 const float *swin=vc->win[0]; | |
2737
b37add61897a
Vorbis sse fix by (Balatoni Denes: dbalatoni, programozo hu)
michael
parents:
2720
diff
changeset
|
1513 float *buf=vc->buf; |
b37add61897a
Vorbis sse fix by (Balatoni Denes: dbalatoni, programozo hu)
michael
parents:
2720
diff
changeset
|
1514 float *buf_tmp=vc->buf_tmp; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1515 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1516 ch_floor_ptr=vc->channel_floors+j*blocksize/2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1517 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1518 saved_start=vc->saved_start; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1519 |
3571 | 1520 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
|
1521 |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1522 //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
|
1523 if (vc->modes[mode_number].blockflag) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1524 // -- overlap/add |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1525 if (previous_window) { |
3571 | 1526 vc->dsp.vector_fmul_add_add(ret+j, buf, lwin, saved, vc->add_bias, vc->blocksize[1]/2, step); |
1527 retlen=vc->blocksize[1]/2; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1528 } else { |
3571 | 1529 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
|
1530 buf += len; |
3571 | 1531 vc->dsp.vector_fmul_add_add(ret+j, buf, swin, saved, vc->add_bias, vc->blocksize[0]/2, step); |
1532 k = vc->blocksize[0]/2*step + j; | |
1533 buf += vc->blocksize[0]/2; | |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1534 if(vc->exp_bias){ |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1535 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
|
1536 ((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
|
1537 } else { |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1538 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
|
1539 ret[k] = buf[i] + fadd_bias; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1540 } |
2740 | 1541 buf=vc->buf; |
3571 | 1542 retlen=vc->blocksize[0]/2+len; |
2697
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 // -- save |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1545 if (next_window) { |
3571 | 1546 buf += vc->blocksize[1]/2; |
1547 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
|
1548 saved_start=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1549 } else { |
3571 | 1550 saved_start=(vc->blocksize[1]-vc->blocksize[0])/4; |
1551 buf += vc->blocksize[1]/2; | |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1552 for(i=0; i<saved_start; i++) |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1553 ((uint32_t*)saved)[i] = ((uint32_t*)buf)[i] + vc->exp_bias; |
3571 | 1554 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
|
1555 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1556 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1557 // --overlap/add |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1558 if(vc->add_bias) { |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1559 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
|
1560 ret[k] = saved[i] + fadd_bias; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1561 } else { |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1562 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
|
1563 ret[k] = saved[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1564 } |
3571 | 1565 vc->dsp.vector_fmul_add_add(ret+k, buf, swin, saved+saved_start, vc->add_bias, vc->blocksize[0]/2, step); |
1566 retlen=saved_start+vc->blocksize[0]/2; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1567 // -- save |
3571 | 1568 buf += vc->blocksize[0]/2; |
1569 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
|
1570 saved_start=0; |
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 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1573 vc->saved_start=saved_start; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1574 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1575 return retlen*vc->audio_channels; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1576 } |
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 // Return the decoded audio packet through the standard api |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1579 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1580 static int vorbis_decode_frame(AVCodecContext *avccontext, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1581 void *data, int *data_size, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1582 uint8_t *buf, int buf_size) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1583 { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1584 vorbis_context *vc = avccontext->priv_data ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1585 GetBitContext *gb = &(vc->gb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1586 |
3701 | 1587 int_fast16_t len; |
2697
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 if(!buf_size){ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1590 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1591 } |
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 AV_DEBUG("packet length %d \n", buf_size); |
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 init_get_bits(gb, buf, buf_size*8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1596 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1597 len=vorbis_parse_audio_packet(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1598 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1599 if (len<=0) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1600 *data_size=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1601 return buf_size; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1602 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1603 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1604 if (!vc->first_frame) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1605 vc->first_frame=1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1606 *data_size=0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1607 return buf_size ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1608 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1609 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1610 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
|
1611 |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1612 vc->dsp.float_to_int16(data, vc->ret, len); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1613 *data_size=len*2; |
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 return buf_size ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1616 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1617 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1618 // Close decoder |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1619 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1620 static int vorbis_decode_close(AVCodecContext *avccontext) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1621 vorbis_context *vc = avccontext->priv_data; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1622 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1623 vorbis_free(vc); |
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 return 0 ; |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1628 AVCodec vorbis_decoder = { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1629 "vorbis", |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1630 CODEC_TYPE_AUDIO, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1631 CODEC_ID_VORBIS, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1632 sizeof(vorbis_context), |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1633 vorbis_decode_init, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1634 NULL, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1635 vorbis_decode_close, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1636 vorbis_decode_frame, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1637 }; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1638 |