Mercurial > libavcodec.hg
annotate vorbis_dec.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 4c8aac222d19 |
children |
rev | line source |
---|---|
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
2 * @file |
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 ) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
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" |
9428 | 31 #include "get_bits.h" |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
32 #include "dsputil.h" |
11370 | 33 #include "fft.h" |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
34 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
35 #include "vorbis.h" |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
36 #include "xiph.h" |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
37 |
2744 | 38 #define V_NB_BITS 8 |
39 #define V_NB_BITS2 11 | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
40 #define V_MAX_VLCS (1 << 16) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
41 #define V_MAX_PARTITIONS (1 << 20) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
42 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
43 #ifndef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
44 #define AV_DEBUG(...) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
45 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
46 |
2743 | 47 #undef NDEBUG |
48 #include <assert.h> | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
49 |
3798 | 50 typedef struct { |
51 uint_fast8_t dimensions; | |
52 uint_fast8_t lookup_type; | |
53 uint_fast8_t maxdepth; | |
54 VLC vlc; | |
55 float *codevectors; | |
56 unsigned int nb_bits; | |
57 } vorbis_codebook; | |
58 | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
59 typedef union vorbis_floor_u vorbis_floor_data; |
3798 | 60 typedef struct vorbis_floor0_s vorbis_floor0; |
61 typedef struct vorbis_floor1_s vorbis_floor1; | |
62 struct vorbis_context_s; | |
63 typedef | |
64 uint_fast8_t (* vorbis_floor_decode_func) | |
65 (struct vorbis_context_s *, vorbis_floor_data *, float *); | |
66 typedef struct { | |
67 uint_fast8_t floor_type; | |
68 vorbis_floor_decode_func decode; | |
10309 | 69 union vorbis_floor_u { |
70 struct vorbis_floor0_s { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
71 uint_fast8_t order; |
3798 | 72 uint_fast16_t rate; |
73 uint_fast16_t bark_map_size; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
74 int_fast32_t *map[2]; |
3798 | 75 uint_fast32_t map_size[2]; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
76 uint_fast8_t amplitude_bits; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
77 uint_fast8_t amplitude_offset; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
78 uint_fast8_t num_books; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
79 uint_fast8_t *book_list; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
80 float *lsp; |
3798 | 81 } t0; |
10309 | 82 struct vorbis_floor1_s { |
3798 | 83 uint_fast8_t partitions; |
12374 | 84 uint8_t partition_class[32]; |
3798 | 85 uint_fast8_t class_dimensions[16]; |
86 uint_fast8_t class_subclasses[16]; | |
87 uint_fast8_t class_masterbook[16]; | |
88 int_fast16_t subclass_books[16][8]; | |
89 uint_fast8_t multiplier; | |
90 uint_fast16_t x_list_dim; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
91 vorbis_floor1_entry *list; |
3798 | 92 } t1; |
93 } data; | |
94 } vorbis_floor; | |
95 | |
96 typedef struct { | |
97 uint_fast16_t type; | |
98 uint_fast32_t begin; | |
99 uint_fast32_t end; | |
12341
ad24cca213ae
vorbisdec: change a uint_fast32_t to 'unsigned', fix llvm-gcc build
mru
parents:
12079
diff
changeset
|
100 unsigned partition_size; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
101 uint_fast8_t classifications; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
102 uint_fast8_t classbook; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
103 int_fast16_t books[64][8]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
104 uint_fast8_t maxpass; |
12050 | 105 uint_fast16_t ptns_to_read; |
12347 | 106 uint8_t *classifs; |
3798 | 107 } vorbis_residue; |
108 | |
109 typedef struct { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
110 uint_fast8_t submaps; |
3798 | 111 uint_fast16_t coupling_steps; |
112 uint_fast8_t *magnitude; | |
113 uint_fast8_t *angle; | |
114 uint_fast8_t *mux; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
115 uint_fast8_t submap_floor[16]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
116 uint_fast8_t submap_residue[16]; |
3798 | 117 } vorbis_mapping; |
118 | |
119 typedef struct { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
120 uint_fast8_t blockflag; |
3798 | 121 uint_fast16_t windowtype; |
122 uint_fast16_t transformtype; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
123 uint_fast8_t mapping; |
3798 | 124 } vorbis_mode; |
125 | |
126 typedef struct vorbis_context_s { | |
127 AVCodecContext *avccontext; | |
128 GetBitContext gb; | |
129 DSPContext dsp; | |
130 | |
10199 | 131 FFTContext mdct[2]; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
132 uint_fast8_t first_frame; |
3798 | 133 uint_fast32_t version; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
134 uint_fast8_t audio_channels; |
3798 | 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]; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
140 const float *win[2]; |
3798 | 141 uint_fast16_t codebook_count; |
142 vorbis_codebook *codebooks; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
143 uint_fast8_t floor_count; |
3798 | 144 vorbis_floor *floors; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
145 uint_fast8_t residue_count; |
3798 | 146 vorbis_residue *residues; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
147 uint_fast8_t mapping_count; |
3798 | 148 vorbis_mapping *mappings; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
149 uint_fast8_t mode_count; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
150 vorbis_mode *modes; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
151 uint_fast8_t mode_number; // mode number for the current packet |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
152 uint_fast8_t previous_window; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
153 float *channel_residues; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
154 float *channel_floors; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
155 float *saved; |
3798 | 156 uint_fast32_t add_bias; // for float->int conversion |
157 uint_fast32_t exp_bias; | |
158 } vorbis_context; | |
159 | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
160 /* Helper functions */ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
161 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
162 #define BARK(x) \ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
163 (13.1f * atan(0.00074f * (x)) + 2.24f * atan(1.85e-8f * (x) * (x)) + 1e-4f * (x)) |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
164 |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
165 static const char idx_err_str[] = "Index value %d out of range (0 - %d) for %s at %s:%i\n"; |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
166 #define VALIDATE_INDEX(idx, limit) \ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
167 if (idx >= limit) {\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
168 av_log(vc->avccontext, AV_LOG_ERROR,\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
169 idx_err_str,\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
170 (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
171 return -1;\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
172 } |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
173 #define GET_VALIDATED_INDEX(idx, bits, limit) \ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
174 {\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
175 idx = get_bits(gb, bits);\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
176 VALIDATE_INDEX(idx, limit)\ |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
177 } |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
178 |
10309 | 179 static float vorbisfloat2float(uint_fast32_t val) |
180 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
181 double mant = val & 0x1fffff; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
182 long exp = (val & 0x7fe00000L) >> 21; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
183 if (val & 0x80000000) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
184 mant = -mant; |
6751
1fc844ec6430
Remove one more set of useless parentheses from a return call.
diego
parents:
6710
diff
changeset
|
185 return ldexp(mant, exp - 20 - 768); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
186 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
187 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
188 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
189 // Free all allocated memory ----------------------------------------- |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
190 |
10309 | 191 static void vorbis_free(vorbis_context *vc) |
192 { | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
193 int_fast16_t i; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
194 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
195 av_freep(&vc->channel_residues); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
196 av_freep(&vc->channel_floors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
197 av_freep(&vc->saved); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
198 |
12050 | 199 for (i = 0; i < vc->residue_count; i++) |
200 av_free(vc->residues[i].classifs); | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
201 av_freep(&vc->residues); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
202 av_freep(&vc->modes); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
203 |
3571 | 204 ff_mdct_end(&vc->mdct[0]); |
205 ff_mdct_end(&vc->mdct[1]); | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
206 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
207 for (i = 0; i < vc->codebook_count; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
208 av_free(vc->codebooks[i].codevectors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
209 free_vlc(&vc->codebooks[i].vlc); |
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->codebooks); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
212 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
213 for (i = 0; i < vc->floor_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
214 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
|
215 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
|
216 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
|
217 av_free(vc->floors[i].data.t0.book_list); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
218 av_free(vc->floors[i].data.t0.lsp); |
10309 | 219 } else { |
3801 | 220 av_free(vc->floors[i].data.t1.list); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
221 } |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
222 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
223 av_freep(&vc->floors); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
224 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
225 for (i = 0; i < vc->mapping_count; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
226 av_free(vc->mappings[i].magnitude); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
227 av_free(vc->mappings[i].angle); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
228 av_free(vc->mappings[i].mux); |
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 av_freep(&vc->mappings); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
231 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
232 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
233 // Parse setup header ------------------------------------------------- |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
234 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
235 // Process codebooks part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
236 |
10309 | 237 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) |
238 { | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
239 uint_fast16_t cb; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
240 uint8_t *tmp_vlc_bits; |
3802
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
241 uint32_t *tmp_vlc_codes; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
242 GetBitContext *gb = &vc->gb; |
12050 | 243 uint_fast16_t *codebook_multiplicands; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
244 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
245 vc->codebook_count = get_bits(gb, 8) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
246 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
247 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
248 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
249 vc->codebooks = av_mallocz(vc->codebook_count * sizeof(vorbis_codebook)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
250 tmp_vlc_bits = av_mallocz(V_MAX_VLCS * sizeof(uint8_t)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
251 tmp_vlc_codes = av_mallocz(V_MAX_VLCS * sizeof(uint32_t)); |
12050 | 252 codebook_multiplicands = av_malloc(V_MAX_VLCS * sizeof(*codebook_multiplicands)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
253 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
254 for (cb = 0; cb < vc->codebook_count; ++cb) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
255 vorbis_codebook *codebook_setup = &vc->codebooks[cb]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
256 uint_fast8_t ordered; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
257 uint_fast32_t t, used_entries = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
258 uint_fast32_t entries; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
259 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
260 AV_DEBUG(" %d. Codebook \n", cb); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
261 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
262 if (get_bits(gb, 24) != 0x564342) { |
2962 | 263 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook setup data corrupt. \n", cb); |
2720 | 264 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
265 } |
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 codebook_setup->dimensions=get_bits(gb, 16); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
268 if (codebook_setup->dimensions > 16 || codebook_setup->dimensions == 0) { |
10232 | 269 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is invalid (%d). \n", cb, codebook_setup->dimensions); |
2720 | 270 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
271 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
272 entries = get_bits(gb, 24); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
273 if (entries > V_MAX_VLCS) { |
2962 | 274 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook has too many entries (%"PRIdFAST32"). \n", cb, entries); |
2720 | 275 goto error; |
2697
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 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
278 ordered = get_bits1(gb); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
279 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
280 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
|
281 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
282 if (!ordered) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
283 uint_fast16_t ce; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
284 uint_fast8_t flag; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
285 uint_fast8_t sparse = get_bits1(gb); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
286 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
287 AV_DEBUG(" not ordered \n"); |
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 if (sparse) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
290 AV_DEBUG(" sparse \n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
291 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
292 used_entries = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
293 for (ce = 0; ce < entries; ++ce) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
294 flag = get_bits1(gb); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
295 if (flag) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
296 tmp_vlc_bits[ce] = get_bits(gb, 5) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
297 ++used_entries; |
10309 | 298 } else |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
299 tmp_vlc_bits[ce] = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
300 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
301 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
302 AV_DEBUG(" not sparse \n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
303 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
304 used_entries = entries; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
305 for (ce = 0; ce < entries; ++ce) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
306 tmp_vlc_bits[ce] = get_bits(gb, 5) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
307 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
308 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
309 uint_fast16_t current_entry = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
310 uint_fast8_t current_length = get_bits(gb, 5)+1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
311 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
312 AV_DEBUG(" ordered, current length: %d \n", current_length); //FIXME |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
313 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
314 used_entries = entries; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
315 for (; current_entry < used_entries && current_length <= 32; ++current_length) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
316 uint_fast16_t i, number; |
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 AV_DEBUG(" number bits: %d ", ilog(entries - current_entry)); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
319 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
320 number = get_bits(gb, ilog(entries - current_entry)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
321 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
322 AV_DEBUG(" number: %d \n", number); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
323 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
324 for (i = current_entry; i < number+current_entry; ++i) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
325 if (i < used_entries) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
326 tmp_vlc_bits[i] = current_length; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
327 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
328 current_entry+=number; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
329 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
330 if (current_entry>used_entries) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
331 av_log(vc->avccontext, AV_LOG_ERROR, " More codelengths than codes in codebook. \n"); |
2720 | 332 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
333 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
334 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
335 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
336 codebook_setup->lookup_type = get_bits(gb, 4); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
337 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
338 AV_DEBUG(" lookup type: %d : %s \n", codebook_setup->lookup_type, codebook_setup->lookup_type ? "vq" : "no lookup"); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
339 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
340 // If the codebook is used for (inverse) VQ, calculate codevectors. |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
341 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
342 if (codebook_setup->lookup_type == 1) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
343 uint_fast16_t i, j, k; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
344 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
|
345 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
346 float codebook_minimum_value = vorbisfloat2float(get_bits_long(gb, 32)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
347 float codebook_delta_value = vorbisfloat2float(get_bits_long(gb, 32)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
348 uint_fast8_t codebook_value_bits = get_bits(gb, 4)+1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
349 uint_fast8_t codebook_sequence_p = get_bits1(gb); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
350 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
351 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
|
352 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
|
353 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
354 for (i = 0; i < codebook_lookup_values; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
355 codebook_multiplicands[i] = get_bits(gb, codebook_value_bits); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
356 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
357 AV_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
|
358 AV_DEBUG(" multiplicand %d \n", codebook_multiplicands[i]); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
359 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
360 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
361 // Weed out unused vlcs and build codevector vector |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
362 codebook_setup->codevectors = used_entries ? av_mallocz(used_entries*codebook_setup->dimensions * sizeof(float)) : NULL; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
363 for (j = 0, i = 0; i < entries; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
364 uint_fast8_t dim = codebook_setup->dimensions; |
2697
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 if (tmp_vlc_bits[i]) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
367 float last = 0.0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
368 uint_fast32_t lookup_offset = i; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
369 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
370 #ifdef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
371 av_log(vc->avccontext, AV_LOG_INFO, "Lookup offset %d ,", i); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
372 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
373 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
374 for (k = 0; k < dim; ++k) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
375 uint_fast32_t multiplicand_offset = lookup_offset % codebook_lookup_values; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
376 codebook_setup->codevectors[j * dim + k] = codebook_multiplicands[multiplicand_offset] * codebook_delta_value + codebook_minimum_value + last; |
10309 | 377 if (codebook_sequence_p) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
378 last = codebook_setup->codevectors[j * dim + k]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
379 lookup_offset/=codebook_lookup_values; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
380 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
381 tmp_vlc_bits[j] = tmp_vlc_bits[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
382 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
383 #ifdef V_DEBUG |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
384 av_log(vc->avccontext, AV_LOG_INFO, "real lookup offset %d, vector: ", j); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
385 for (k = 0; k < dim; ++k) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
386 av_log(vc->avccontext, AV_LOG_INFO, " %f ", codebook_setup->codevectors[j * dim + k]); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
387 av_log(vc->avccontext, AV_LOG_INFO, "\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
388 #endif |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
389 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
390 ++j; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
391 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
392 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
393 if (j != used_entries) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
394 av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n"); |
2720 | 395 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
396 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
397 entries = used_entries; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
398 } else if (codebook_setup->lookup_type >= 2) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
399 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); |
2720 | 400 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
401 } |
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 // Initialize VLC table |
3802
094fe185d054
make some more functions global so they can be shared with vorbis_enc.c
ods15
parents:
3801
diff
changeset
|
404 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
|
405 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); |
2720 | 406 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
407 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
408 codebook_setup->maxdepth = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
409 for (t = 0; t < entries; ++t) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
410 if (tmp_vlc_bits[t] >= codebook_setup->maxdepth) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
411 codebook_setup->maxdepth = tmp_vlc_bits[t]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
412 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
413 if (codebook_setup->maxdepth > 3 * V_NB_BITS) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
414 codebook_setup->nb_bits = V_NB_BITS2; |
10309 | 415 else |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
416 codebook_setup->nb_bits = V_NB_BITS; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
417 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
418 codebook_setup->maxdepth = (codebook_setup->maxdepth+codebook_setup->nb_bits - 1) / codebook_setup->nb_bits; |
2967 | 419 |
2744 | 420 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
|
421 av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); |
2720 | 422 goto error; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
423 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
424 } |
2720 | 425 |
426 av_free(tmp_vlc_bits); | |
427 av_free(tmp_vlc_codes); | |
12050 | 428 av_free(codebook_multiplicands); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
429 return 0; |
2720 | 430 |
431 // Error: | |
432 error: | |
433 av_free(tmp_vlc_bits); | |
434 av_free(tmp_vlc_codes); | |
12050 | 435 av_free(codebook_multiplicands); |
10251 | 436 return -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
437 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
438 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
439 // Process time domain transforms part (unused in Vorbis I) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
440 |
10309 | 441 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) |
442 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
443 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
444 uint_fast8_t i; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
445 uint_fast8_t vorbis_time_count = get_bits(gb, 6) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
446 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
447 for (i = 0; i < vorbis_time_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
448 uint_fast16_t vorbis_tdtransform = get_bits(gb, 16); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
449 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
450 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
|
451 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
452 if (vorbis_tdtransform) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
453 av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n"); |
10251 | 454 return -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
455 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
456 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
457 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
458 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
459 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
460 // Process floors part |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
461 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
462 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
|
463 vorbis_floor_data *vfu, float *vec); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
464 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
|
465 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
|
466 vorbis_floor_data *vfu, float *vec); |
10309 | 467 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) |
468 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
469 GetBitContext *gb = &vc->gb; |
12440
4c8aac222d19
vorbisdec: Use int instead of uint16_fast_t for index variables
conrad
parents:
12374
diff
changeset
|
470 int i,j,k; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
471 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
472 vc->floor_count = get_bits(gb, 6) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
473 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
474 vc->floors = av_mallocz(vc->floor_count * sizeof(vorbis_floor)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
475 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
476 for (i = 0; i < vc->floor_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
477 vorbis_floor *floor_setup = &vc->floors[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
478 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
479 floor_setup->floor_type = get_bits(gb, 16); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
480 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
481 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
|
482 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
483 if (floor_setup->floor_type == 1) { |
11972
e36d1bb6d8b7
vorbisdec: Fix header parsing with no floor1 partitions
conrad
parents:
11971
diff
changeset
|
484 int maximum_class = -1; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
485 uint_fast8_t rangebits; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
486 uint_fast16_t floor1_values = 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
487 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
488 floor_setup->decode = vorbis_floor1_decode; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
489 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
490 floor_setup->data.t1.partitions = get_bits(gb, 5); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
491 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
492 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
|
493 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
494 for (j = 0; j < floor_setup->data.t1.partitions; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
495 floor_setup->data.t1.partition_class[j] = get_bits(gb, 4); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
496 if (floor_setup->data.t1.partition_class[j] > maximum_class) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
497 maximum_class = floor_setup->data.t1.partition_class[j]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
498 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
499 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
|
500 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
501 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
502 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
503 AV_DEBUG(" maximum class %d \n", maximum_class); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
504 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
505 for (j = 0; j <= maximum_class; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
506 floor_setup->data.t1.class_dimensions[j] = get_bits(gb, 3) + 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
507 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
|
508 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
509 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
|
510 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
511 if (floor_setup->data.t1.class_subclasses[j]) { |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
512 GET_VALIDATED_INDEX(floor_setup->data.t1.class_masterbook[j], 8, vc->codebook_count) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
513 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
514 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
|
515 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
516 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
517 for (k = 0; k < (1 << floor_setup->data.t1.class_subclasses[j]); ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
518 int16_t bits = get_bits(gb, 8) - 1; |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
519 if (bits != -1) |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
520 VALIDATE_INDEX(bits, vc->codebook_count) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
521 floor_setup->data.t1.subclass_books[j][k] = bits; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
522 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
523 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
|
524 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
525 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
526 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
527 floor_setup->data.t1.multiplier = get_bits(gb, 2) + 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
528 floor_setup->data.t1.x_list_dim = 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
529 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
530 for (j = 0; j < floor_setup->data.t1.partitions; ++j) |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
531 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
|
532 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
533 floor_setup->data.t1.list = av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(vorbis_floor1_entry)); |
2697
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 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
536 rangebits = get_bits(gb, 4); |
3801 | 537 floor_setup->data.t1.list[0].x = 0; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
538 floor_setup->data.t1.list[1].x = (1 << rangebits); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
539 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
540 for (j = 0; j < floor_setup->data.t1.partitions; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
541 for (k = 0; k < floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]]; ++k, ++floor1_values) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
542 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
|
543 |
3801 | 544 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
|
545 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
546 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
547 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
548 // Precalculate order of x coordinates - needed for decode |
3801 | 549 ff_vorbis_ready_floor1_list(floor_setup->data.t1.list, floor_setup->data.t1.x_list_dim); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
550 } else if (floor_setup->floor_type == 0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
551 uint_fast8_t max_codebook_dim = 0; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
552 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
553 floor_setup->decode = vorbis_floor0_decode; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
554 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
555 floor_setup->data.t0.order = get_bits(gb, 8); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
556 floor_setup->data.t0.rate = get_bits(gb, 16); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
557 floor_setup->data.t0.bark_map_size = get_bits(gb, 16); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
558 floor_setup->data.t0.amplitude_bits = get_bits(gb, 6); |
3084 | 559 /* zero would result in a div by zero later * |
560 * 2^0 - 1 == 0 */ | |
561 if (floor_setup->data.t0.amplitude_bits == 0) { | |
562 av_log(vc->avccontext, AV_LOG_ERROR, | |
563 "Floor 0 amplitude bits is 0.\n"); | |
10251 | 564 return -1; |
3084 | 565 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
566 floor_setup->data.t0.amplitude_offset = get_bits(gb, 8); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
567 floor_setup->data.t0.num_books = get_bits(gb, 4) + 1; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
568 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
569 /* allocate mem for booklist */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
570 floor_setup->data.t0.book_list = |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
571 av_malloc(floor_setup->data.t0.num_books); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
572 if (!floor_setup->data.t0.book_list) |
10309 | 573 return -1; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
574 /* read book indexes */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
575 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
576 int idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
577 uint_fast8_t book_idx; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
578 for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) { |
12079
e2d6add92a73
Fix use of unintialized variable introduced in r20411.
reimar
parents:
12050
diff
changeset
|
579 GET_VALIDATED_INDEX(book_idx, 8, vc->codebook_count) |
e2d6add92a73
Fix use of unintialized variable introduced in r20411.
reimar
parents:
12050
diff
changeset
|
580 floor_setup->data.t0.book_list[idx] = book_idx; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
581 if (vc->codebooks[book_idx].dimensions > max_codebook_dim) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
582 max_codebook_dim = vc->codebooks[book_idx].dimensions; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
583 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
584 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
585 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
586 create_map(vc, i); |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
587 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
588 /* allocate mem for lsp coefficients */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
589 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
590 /* codebook dim is for padding if codebook dim doesn't * |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
591 * divide order+1 then we need to read more data */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
592 floor_setup->data.t0.lsp = |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
593 av_malloc((floor_setup->data.t0.order+1 + max_codebook_dim) |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
594 * sizeof(float)); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
595 if (!floor_setup->data.t0.lsp) |
10309 | 596 return -1; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
597 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
598 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
599 #ifdef V_DEBUG /* debug output parsed headers */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
600 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
|
601 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
|
602 AV_DEBUG("floor0 bark map size: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
603 floor_setup->data.t0.bark_map_size); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
604 AV_DEBUG("floor0 amplitude bits: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
605 floor_setup->data.t0.amplitude_bits); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
606 AV_DEBUG("floor0 amplitude offset: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
607 floor_setup->data.t0.amplitude_offset); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
608 AV_DEBUG("floor0 number of books: %u\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
609 floor_setup->data.t0.num_books); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
610 AV_DEBUG("floor0 book list pointer: %p\n", |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
611 floor_setup->data.t0.book_list); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
612 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
613 int idx; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
614 for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
615 AV_DEBUG(" Book %d: %u\n", |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
616 idx+1, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
617 floor_setup->data.t0.book_list[idx]); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
618 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
619 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
620 #endif |
10309 | 621 } else { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
622 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid floor type!\n"); |
10251 | 623 return -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
624 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
625 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
626 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
627 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
628 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
629 // Process residues part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
630 |
10309 | 631 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc) |
632 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
633 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
634 uint_fast8_t i, j, k; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
635 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
636 vc->residue_count = get_bits(gb, 6)+1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
637 vc->residues = av_mallocz(vc->residue_count * sizeof(vorbis_residue)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
638 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
639 AV_DEBUG(" There are %d residues. \n", vc->residue_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
640 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
641 for (i = 0; i < vc->residue_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
642 vorbis_residue *res_setup = &vc->residues[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
643 uint_fast8_t cascade[64]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
644 uint_fast8_t high_bits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
645 uint_fast8_t low_bits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
646 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
647 res_setup->type = get_bits(gb, 16); |
2697
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 AV_DEBUG(" %d. residue type %d \n", i, res_setup->type); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
650 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
651 res_setup->begin = get_bits(gb, 24); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
652 res_setup->end = get_bits(gb, 24); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
653 res_setup->partition_size = get_bits(gb, 24) + 1; |
10250 | 654 /* Validations to prevent a buffer overflow later. */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
655 if (res_setup->begin>res_setup->end || |
11973
7ca225db75e8
vorbisdec: Take channels into account when checking against residue overflow
conrad
parents:
11972
diff
changeset
|
656 res_setup->end > vc->avccontext->channels * vc->blocksize[1] / (res_setup->type == 2 ? 1 : 2) || |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
657 (res_setup->end-res_setup->begin) / res_setup->partition_size > V_MAX_PARTITIONS) { |
12341
ad24cca213ae
vorbisdec: change a uint_fast32_t to 'unsigned', fix llvm-gcc build
mru
parents:
12079
diff
changeset
|
658 av_log(vc->avccontext, AV_LOG_ERROR, "partition out of bounds: type, begin, end, size, blocksize: %"PRIdFAST16", %"PRIdFAST32", %"PRIdFAST32", %u, %"PRIdFAST32"\n", res_setup->type, res_setup->begin, res_setup->end, res_setup->partition_size, vc->blocksize[1] / 2); |
10251 | 659 return -1; |
10250 | 660 } |
661 | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
662 res_setup->classifications = get_bits(gb, 6) + 1; |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
663 GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
664 |
12050 | 665 res_setup->ptns_to_read = |
666 (res_setup->end - res_setup->begin) / res_setup->partition_size; | |
667 res_setup->classifs = av_malloc(res_setup->ptns_to_read * | |
668 vc->audio_channels * | |
669 sizeof(*res_setup->classifs)); | |
12348
97a9ea928ffc
vorbisdec: Return AVERROR(ENOMEM) on malloc() failure.
alexc
parents:
12347
diff
changeset
|
670 if (!res_setup->classifs) |
97a9ea928ffc
vorbisdec: Return AVERROR(ENOMEM) on malloc() failure.
alexc
parents:
12347
diff
changeset
|
671 return AVERROR(ENOMEM); |
12050 | 672 |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
673 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
|
674 res_setup->classifications, res_setup->classbook); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
675 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
676 for (j = 0; j < res_setup->classifications; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
677 high_bits = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
678 low_bits = get_bits(gb, 3); |
10309 | 679 if (get_bits1(gb)) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
680 high_bits = get_bits(gb, 5); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
681 cascade[j] = (high_bits << 3) + low_bits; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
682 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
683 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
|
684 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
685 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
686 res_setup->maxpass = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
687 for (j = 0; j < res_setup->classifications; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
688 for (k = 0; k < 8; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
689 if (cascade[j]&(1 << k)) { |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
690 GET_VALIDATED_INDEX(res_setup->books[j][k], 8, vc->codebook_count) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
691 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
692 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
|
693 |
10309 | 694 if (k>res_setup->maxpass) |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
695 res_setup->maxpass = k; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
696 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
697 res_setup->books[j][k] = -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
698 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
699 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
700 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
701 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
702 return 0; |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
705 // Process mappings part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
706 |
10309 | 707 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) |
708 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
709 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
710 uint_fast8_t i, j; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
711 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
712 vc->mapping_count = get_bits(gb, 6)+1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
713 vc->mappings = av_mallocz(vc->mapping_count * sizeof(vorbis_mapping)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
714 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
715 AV_DEBUG(" There are %d mappings. \n", vc->mapping_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
716 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
717 for (i = 0; i < vc->mapping_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
718 vorbis_mapping *mapping_setup = &vc->mappings[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
719 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
720 if (get_bits(gb, 16)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
721 av_log(vc->avccontext, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n"); |
10251 | 722 return -1; |
2697
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 (get_bits1(gb)) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
725 mapping_setup->submaps = get_bits(gb, 4) + 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
726 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
727 mapping_setup->submaps = 1; |
2697
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 if (get_bits1(gb)) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
731 mapping_setup->coupling_steps = get_bits(gb, 8) + 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
732 mapping_setup->magnitude = av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
733 mapping_setup->angle = av_mallocz(mapping_setup->coupling_steps * sizeof(uint_fast8_t)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
734 for (j = 0; j < mapping_setup->coupling_steps; ++j) { |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
735 GET_VALIDATED_INDEX(mapping_setup->magnitude[j], ilog(vc->audio_channels - 1), vc->audio_channels) |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
736 GET_VALIDATED_INDEX(mapping_setup->angle[j], ilog(vc->audio_channels - 1), vc->audio_channels) |
2697
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 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
739 mapping_setup->coupling_steps = 0; |
2697
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 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
|
743 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
744 if (get_bits(gb, 2)) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
745 av_log(vc->avccontext, AV_LOG_ERROR, "%d. mapping setup data invalid. \n", i); |
10251 | 746 return -1; // following spec. |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
747 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
748 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
749 if (mapping_setup->submaps>1) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
750 mapping_setup->mux = av_mallocz(vc->audio_channels * sizeof(uint_fast8_t)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
751 for (j = 0; j < vc->audio_channels; ++j) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
752 mapping_setup->mux[j] = get_bits(gb, 4); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
753 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
754 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
755 for (j = 0; j < mapping_setup->submaps; ++j) { |
5518 | 756 skip_bits(gb, 8); // FIXME check? |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
757 GET_VALIDATED_INDEX(mapping_setup->submap_floor[j], 8, vc->floor_count) |
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
758 GET_VALIDATED_INDEX(mapping_setup->submap_residue[j], 8, vc->residue_count) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
759 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
760 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
|
761 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
762 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
763 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
764 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
765 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
766 // Process modes part |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
767 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
768 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
|
769 { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
770 vorbis_floor *floors = vc->floors; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
771 vorbis_floor0 *vf; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
772 int idx; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
773 int_fast8_t blockflag; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
774 int_fast32_t *map; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
775 int_fast32_t n; //TODO: could theoretically be smaller? |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
776 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
777 for (blockflag = 0; blockflag < 2; ++blockflag) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
778 n = vc->blocksize[blockflag] / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
779 floors[floor_number].data.t0.map[blockflag] = |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
780 av_malloc((n+1) * sizeof(int_fast32_t)); // n + sentinel |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
781 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
782 map = floors[floor_number].data.t0.map[blockflag]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
783 vf = &floors[floor_number].data.t0; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
784 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
785 for (idx = 0; idx < n; ++idx) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
786 map[idx] = floor(BARK((vf->rate * idx) / (2.0f * n)) * |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
787 ((vf->bark_map_size) / |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
788 BARK(vf->rate / 2.0f))); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
789 if (vf->bark_map_size-1 < map[idx]) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
790 map[idx] = vf->bark_map_size - 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
791 } |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
792 map[n] = -1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
793 vf->map_size[blockflag] = n; |
3088
03582724f3de
Correct the relation between floors of type 0 and block sizes.
al
parents:
3084
diff
changeset
|
794 } |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
795 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
796 # ifdef V_DEBUG |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
797 for (idx = 0; idx <= n; ++idx) { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
798 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
|
799 idx, map[idx]); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
800 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
801 # endif |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
802 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
803 |
10309 | 804 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) |
805 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
806 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
807 uint_fast8_t i; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
808 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
809 vc->mode_count = get_bits(gb, 6) + 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
810 vc->modes = av_mallocz(vc->mode_count * sizeof(vorbis_mode)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
811 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
812 AV_DEBUG(" There are %d modes.\n", vc->mode_count); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
813 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
814 for (i = 0; i < vc->mode_count; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
815 vorbis_mode *mode_setup = &vc->modes[i]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
816 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
817 mode_setup->blockflag = get_bits1(gb); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
818 mode_setup->windowtype = get_bits(gb, 16); //FIXME check |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
819 mode_setup->transformtype = get_bits(gb, 16); //FIXME check |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
820 GET_VALIDATED_INDEX(mode_setup->mapping, 8, vc->mapping_count); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
821 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
822 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
|
823 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
824 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
825 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
826 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
827 // Process the whole setup header using the functions above |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
828 |
10309 | 829 static int vorbis_parse_setup_hdr(vorbis_context *vc) |
830 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
831 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
832 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
833 if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') || |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
834 (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
835 (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
836 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n"); |
10251 | 837 return -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
838 } |
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 (vorbis_parse_setup_hdr_codebooks(vc)) { |
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 (codebooks). \n"); |
10251 | 842 return -2; |
2697
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 if (vorbis_parse_setup_hdr_tdtransforms(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
845 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n"); |
10251 | 846 return -3; |
2697
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 if (vorbis_parse_setup_hdr_floors(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
849 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n"); |
10251 | 850 return -4; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
851 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
852 if (vorbis_parse_setup_hdr_residues(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
853 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n"); |
10251 | 854 return -5; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
855 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
856 if (vorbis_parse_setup_hdr_mappings(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
857 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n"); |
10251 | 858 return -6; |
2697
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 if (vorbis_parse_setup_hdr_modes(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
861 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n"); |
10251 | 862 return -7; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
863 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
864 if (!get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
865 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n"); |
10251 | 866 return -8; // framing flag bit unset error |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
867 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
868 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
869 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
870 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
871 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
872 // Process the identification header |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
873 |
10309 | 874 static int vorbis_parse_id_hdr(vorbis_context *vc) |
875 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
876 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
877 uint_fast8_t bl0, bl1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
878 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
879 if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') || |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
880 (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
881 (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
882 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n"); |
10251 | 883 return -1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
884 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
885 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
886 vc->version = get_bits_long(gb, 32); //FIXME check 0 |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
887 vc->audio_channels = get_bits(gb, 8); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
888 if (vc->audio_channels <= 0) { |
10231 | 889 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid number of channels\n"); |
890 return -1; | |
891 } | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
892 vc->audio_samplerate = get_bits_long(gb, 32); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
893 if (vc->audio_samplerate <= 0) { |
10231 | 894 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid samplerate\n"); |
895 return -1; | |
896 } | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
897 vc->bitrate_maximum = get_bits_long(gb, 32); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
898 vc->bitrate_nominal = get_bits_long(gb, 32); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
899 vc->bitrate_minimum = get_bits_long(gb, 32); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
900 bl0 = get_bits(gb, 4); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
901 bl1 = get_bits(gb, 4); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
902 vc->blocksize[0] = (1 << bl0); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
903 vc->blocksize[1] = (1 << bl1); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
904 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
|
905 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n"); |
10251 | 906 return -3; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
907 } |
3270
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
908 // output format int16 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
909 if (vc->blocksize[1] / 2 * vc->audio_channels * 2 > AVCODEC_MAX_AUDIO_FRAME_SIZE) { |
3270
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
910 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
|
911 "output packets too large.\n"); |
10251 | 912 return -4; |
3270
d6a5ed01acdf
Vorbis specs requires blocksize_1 >= blocksize_0, error if it's false.
rtognimp
parents:
3145
diff
changeset
|
913 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
914 vc->win[0] = ff_vorbis_vwin[bl0 - 6]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
915 vc->win[1] = ff_vorbis_vwin[bl1 - 6]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
916 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
917 if ((get_bits1(gb)) == 0) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
918 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n"); |
10251 | 919 return -2; |
2697
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 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
922 vc->channel_residues = av_malloc((vc->blocksize[1] / 2) * vc->audio_channels * sizeof(float)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
923 vc->channel_floors = av_malloc((vc->blocksize[1] / 2) * vc->audio_channels * sizeof(float)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
924 vc->saved = av_mallocz((vc->blocksize[1] / 4) * vc->audio_channels * sizeof(float)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
925 vc->previous_window = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
926 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
927 ff_mdct_init(&vc->mdct[0], bl0, 1, vc->exp_bias ? -(1 << 15) : -1.0); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
928 ff_mdct_init(&vc->mdct[1], bl1, 1, vc->exp_bias ? -(1 << 15) : -1.0); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
929 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
930 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 | 931 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
|
932 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
933 /* |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
934 BLK = vc->blocksize[0]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
935 for (i = 0; i < BLK / 2; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
936 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
|
937 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
938 */ |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
939 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
940 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
941 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
942 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
943 // Process the extradata using the functions above (identification header, setup header) |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
944 |
10309 | 945 static av_cold int vorbis_decode_init(AVCodecContext *avccontext) |
946 { | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
947 vorbis_context *vc = avccontext->priv_data ; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
948 uint8_t *headers = avccontext->extradata; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
949 int headers_len = avccontext->extradata_size; |
2716 | 950 uint8_t *header_start[3]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
951 int header_len[3]; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
952 GetBitContext *gb = &(vc->gb); |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
953 int hdr_type; |
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 vc->avccontext = avccontext; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
956 dsputil_init(&vc->dsp, avccontext); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
957 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
958 if (vc->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) { |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
959 vc->add_bias = 385; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
960 vc->exp_bias = 0; |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
961 } else { |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
962 vc->add_bias = 0; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
963 vc->exp_bias = 15 << 23; |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
964 } |
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
965 |
2716 | 966 if (!headers_len) { |
10695
fe81255af588
More sane error message when extradata has not been set.
michael
parents:
10477
diff
changeset
|
967 av_log(avccontext, AV_LOG_ERROR, "Extradata missing.\n"); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
968 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
969 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
970 |
4722
7595ead28402
extract vorbis header spliting code into a reusable function
aurel
parents:
4174
diff
changeset
|
971 if (ff_split_xiph_headers(headers, headers_len, 30, header_start, header_len) < 0) { |
2716 | 972 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
973 return -1; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
974 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
975 |
2716 | 976 init_get_bits(gb, header_start[0], header_len[0]*8); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
977 hdr_type = get_bits(gb, 8); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
978 if (hdr_type != 1) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
979 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
|
980 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
981 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
982 if (vorbis_parse_id_hdr(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
983 av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
984 vorbis_free(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
985 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
986 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
987 |
2716 | 988 init_get_bits(gb, header_start[2], header_len[2]*8); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
989 hdr_type = get_bits(gb, 8); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
990 if (hdr_type != 5) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
991 av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n"); |
7973 | 992 vorbis_free(vc); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
993 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
994 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
995 if (vorbis_parse_setup_hdr(vc)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
996 av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
997 vorbis_free(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
998 return -1; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
999 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1000 |
11051
5d4991dd23de
Add support for vorbis 6.1 and 7.1 channel configurations as per the new spec
superdump
parents:
10695
diff
changeset
|
1001 if (vc->audio_channels > 8) |
10347
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1002 avccontext->channel_layout = 0; |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1003 else |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1004 avccontext->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1]; |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1005 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1006 avccontext->channels = vc->audio_channels; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1007 avccontext->sample_rate = vc->audio_samplerate; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1008 avccontext->frame_size = FFMIN(vc->blocksize[0], vc->blocksize[1]) >> 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1009 avccontext->sample_fmt = SAMPLE_FMT_S16; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1010 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1011 return 0 ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1012 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1013 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1014 // Decode audiopackets ------------------------------------------------- |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1015 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1016 // Read and decode floor |
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 static uint_fast8_t vorbis_floor0_decode(vorbis_context *vc, |
10309 | 1019 vorbis_floor_data *vfu, float *vec) |
1020 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1021 vorbis_floor0 *vf = &vfu->t0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1022 float *lsp = vf->lsp; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1023 uint_fast32_t amplitude; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1024 uint_fast32_t book_idx; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1025 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
|
1026 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1027 amplitude = get_bits(&vc->gb, vf->amplitude_bits); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1028 if (amplitude > 0) { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1029 float last = 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1030 uint_fast16_t lsp_len = 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1031 uint_fast16_t idx; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1032 vorbis_codebook codebook; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1033 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1034 book_idx = get_bits(&vc->gb, ilog(vf->num_books)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1035 if (book_idx >= vf->num_books) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1036 av_log(vc->avccontext, AV_LOG_ERROR, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1037 "floor0 dec: booknumber too high!\n"); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1038 book_idx = 0; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1039 //FIXME: look above |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1040 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1041 AV_DEBUG("floor0 dec: booknumber: %u\n", book_idx); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1042 codebook = vc->codebooks[vf->book_list[book_idx]]; |
3083
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 while (lsp_len<vf->order) { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1045 int vec_off; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1046 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1047 AV_DEBUG("floor0 dec: book dimension: %d\n", codebook.dimensions); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1048 AV_DEBUG("floor0 dec: maximum depth: %d\n", codebook.maxdepth); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1049 /* read temp vector */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1050 vec_off = get_vlc2(&vc->gb, codebook.vlc.table, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1051 codebook.nb_bits, codebook.maxdepth) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1052 * codebook.dimensions; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1053 AV_DEBUG("floor0 dec: vector offset: %d\n", vec_off); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1054 /* copy each vector component and add last to it */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1055 for (idx = 0; idx < codebook.dimensions; ++idx) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1056 lsp[lsp_len+idx] = codebook.codevectors[vec_off+idx] + last; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1057 last = lsp[lsp_len+idx-1]; /* set last to last vector component */ |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1058 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1059 lsp_len += codebook.dimensions; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1060 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1061 #ifdef V_DEBUG |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1062 /* DEBUG: output lsp coeffs */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1063 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1064 int idx; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1065 for (idx = 0; idx < lsp_len; ++idx) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1066 AV_DEBUG("floor0 dec: coeff at %d is %f\n", idx, lsp[idx]); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1067 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1068 #endif |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1069 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1070 /* synthesize floor output vector */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1071 { |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1072 int i; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1073 int order = vf->order; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1074 float wstep = M_PI / vf->bark_map_size; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1075 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1076 for (i = 0; i < order; i++) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1077 lsp[i] = 2.0f * cos(lsp[i]); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1078 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1079 AV_DEBUG("floor0 synth: map_size = %d; m = %d; wstep = %f\n", |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1080 vf->map_size, order, wstep); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1081 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1082 i = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1083 while (i < vf->map_size[blockflag]) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1084 int j, iter_cond = vf->map[blockflag][i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1085 float p = 0.5f; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1086 float q = 0.5f; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1087 float two_cos_w = 2.0f * cos(wstep * iter_cond); // needed all times |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1088 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1089 /* similar part for the q and p products */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1090 for (j = 0; j + 1 < order; j += 2) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1091 q *= lsp[j] - two_cos_w; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1092 p *= lsp[j + 1] - two_cos_w; |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1093 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1094 if (j == order) { // even order |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1095 p *= p * (2.0f - two_cos_w); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1096 q *= q * (2.0f + two_cos_w); |
10309 | 1097 } else { // odd order |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1098 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
|
1099 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1100 /* final step and square */ |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1101 p *= p * (4.f - two_cos_w * two_cos_w); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1102 q *= q; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1103 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1104 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1105 /* calculate linear floor value */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1106 { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1107 q = exp((((amplitude*vf->amplitude_offset) / |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1108 (((1 << vf->amplitude_bits) - 1) * sqrt(p + q))) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1109 - vf->amplitude_offset) * .11512925f); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1110 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1111 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1112 /* fill vector */ |
10309 | 1113 do { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1114 vec[i] = q; ++i; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1115 } while (vf->map[blockflag][i] == iter_cond); |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1116 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1117 } |
10309 | 1118 } else { |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1119 /* this channel is unused */ |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1120 return 1; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1121 } |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1122 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1123 AV_DEBUG(" Floor0 decoded\n"); |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1124 |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1125 return 0; |
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1126 } |
3805
5ad55a4e42c2
remove render_line from vorbis.h, add ff_vorbis_floor1_render_list instead
ods15
parents:
3802
diff
changeset
|
1127 |
10309 | 1128 static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc, |
1129 vorbis_floor_data *vfu, float *vec) | |
1130 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1131 vorbis_floor1 *vf = &vfu->t1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1132 GetBitContext *gb = &vc->gb; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1133 uint_fast16_t range_v[4] = { 256, 128, 86, 64 }; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1134 uint_fast16_t range = range_v[vf->multiplier-1]; |
12050 | 1135 uint_fast16_t floor1_Y[258]; |
1136 uint_fast16_t floor1_Y_final[258]; | |
1137 int floor1_flag[258]; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1138 uint_fast8_t class_; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1139 uint_fast8_t cdim; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1140 uint_fast8_t cbits; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1141 uint_fast8_t csub; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1142 uint_fast8_t cval; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1143 int_fast16_t book; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1144 uint_fast16_t offset; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1145 uint_fast16_t i,j; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1146 /*u*/int_fast16_t adx, ady, off, predicted; // WTF ? dy/adx = (unsigned)dy/adx ? |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1147 int_fast16_t dy, err; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1148 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1149 |
10310 | 1150 if (!get_bits1(gb)) // silence |
1151 return 1; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1152 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1153 // Read values (or differences) for the floor's points |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1154 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1155 floor1_Y[0] = get_bits(gb, ilog(range - 1)); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1156 floor1_Y[1] = get_bits(gb, ilog(range - 1)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1157 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1158 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
|
1159 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1160 offset = 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1161 for (i = 0; i < vf->partitions; ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1162 class_ = vf->partition_class[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1163 cdim = vf->class_dimensions[class_]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1164 cbits = vf->class_subclasses[class_]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1165 csub = (1 << cbits) - 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1166 cval = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1167 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1168 AV_DEBUG("Cbits %d \n", cbits); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1169 |
10309 | 1170 if (cbits) // this reads all subclasses for this partition's class |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1171 cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1172 vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1173 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1174 for (j = 0; j < cdim; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1175 book = vf->subclass_books[class_][cval & csub]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1176 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1177 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
|
1178 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1179 cval = cval >> cbits; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1180 if (book > -1) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1181 floor1_Y[offset+j] = get_vlc2(gb, vc->codebooks[book].vlc.table, |
2744 | 1182 vc->codebooks[book].nb_bits, 3); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1183 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1184 floor1_Y[offset+j] = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1185 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1186 |
3801 | 1187 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
|
1188 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1189 offset+=cdim; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1190 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1191 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1192 // Amplitude calculation from the differences |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1193 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1194 floor1_flag[0] = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1195 floor1_flag[1] = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1196 floor1_Y_final[0] = floor1_Y[0]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1197 floor1_Y_final[1] = floor1_Y[1]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1198 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1199 for (i = 2; i < vf->x_list_dim; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1200 uint_fast16_t val, highroom, lowroom, room; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1201 uint_fast16_t high_neigh_offs; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1202 uint_fast16_t low_neigh_offs; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1203 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1204 low_neigh_offs = vf->list[i].low; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1205 high_neigh_offs = vf->list[i].high; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1206 dy = floor1_Y_final[high_neigh_offs] - floor1_Y_final[low_neigh_offs]; // render_point begin |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1207 adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1208 ady = FFABS(dy); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1209 err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1210 off = (int16_t)err / (int16_t)adx; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1211 if (dy < 0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1212 predicted = floor1_Y_final[low_neigh_offs] - off; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1213 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1214 predicted = floor1_Y_final[low_neigh_offs] + off; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1215 } // render_point end |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1216 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1217 val = floor1_Y[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1218 highroom = range-predicted; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1219 lowroom = predicted; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1220 if (highroom < lowroom) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1221 room = highroom * 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1222 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1223 room = lowroom * 2; // SPEC mispelling |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1224 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1225 if (val) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1226 floor1_flag[low_neigh_offs] = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1227 floor1_flag[high_neigh_offs] = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1228 floor1_flag[i] = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1229 if (val >= room) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1230 if (highroom > lowroom) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1231 floor1_Y_final[i] = val - lowroom + predicted; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1232 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1233 floor1_Y_final[i] = predicted - val + highroom - 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1234 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1235 } else { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1236 if (val & 1) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1237 floor1_Y_final[i] = predicted - (val + 1) / 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1238 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1239 floor1_Y_final[i] = predicted + val / 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1240 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1241 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1242 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1243 floor1_flag[i] = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1244 floor1_Y_final[i] = predicted; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1245 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1246 |
3801 | 1247 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
|
1248 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1249 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1250 // 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
|
1251 |
3805
5ad55a4e42c2
remove render_line from vorbis.h, add ff_vorbis_floor1_render_list instead
ods15
parents:
3802
diff
changeset
|
1252 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
|
1253 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1254 AV_DEBUG(" Floor decoded\n"); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1255 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1256 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1257 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1258 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1259 // Read and decode residue |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1260 |
10309 | 1261 static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, |
1262 vorbis_residue *vr, | |
1263 uint_fast8_t ch, | |
1264 uint_fast8_t *do_not_decode, | |
1265 float *vec, | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1266 uint_fast16_t vlen, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1267 int vr_type) |
10309 | 1268 { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1269 GetBitContext *gb = &vc->gb; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1270 uint_fast8_t c_p_c = vc->codebooks[vr->classbook].dimensions; |
12050 | 1271 uint_fast16_t ptns_to_read = vr->ptns_to_read; |
12347 | 1272 uint8_t *classifs = vr->classifs; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1273 uint_fast8_t pass; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1274 uint_fast8_t ch_used; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1275 uint_fast8_t i,j,l; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1276 uint_fast16_t k; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1277 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1278 if (vr_type == 2) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1279 for (j = 1; j < ch; ++j) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1280 do_not_decode[0] &= do_not_decode[j]; // FIXME - clobbering input |
10309 | 1281 if (do_not_decode[0]) |
1282 return 0; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1283 ch_used = 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1284 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1285 ch_used = ch; |
2697
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1288 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
|
1289 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1290 for (pass = 0; pass <= vr->maxpass; ++pass) { // FIXME OPTIMIZE? |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1291 uint_fast16_t voffset; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1292 uint_fast16_t partition_count; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1293 uint_fast16_t j_times_ptns_to_read; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1294 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1295 voffset = vr->begin; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1296 for (partition_count = 0; partition_count < ptns_to_read;) { // SPEC error |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1297 if (!pass) { |
4174 | 1298 uint_fast32_t inverse_class = ff_inverse[vr->classifications]; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1299 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1300 if (!do_not_decode[j]) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1301 uint_fast32_t temp = get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table, |
2744 | 1302 vc->codebooks[vr->classbook].nb_bits, 3); |
2697
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 AV_DEBUG("Classword: %d \n", temp); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1305 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1306 assert(vr->classifications > 1 && temp <= 65536); //needed for inverse[] |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1307 for (i = 0; i < c_p_c; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1308 uint_fast32_t temp2; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1309 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1310 temp2 = (((uint_fast64_t)temp) * inverse_class) >> 32; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1311 if (partition_count + c_p_c - 1 - i < ptns_to_read) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1312 classifs[j_times_ptns_to_read + partition_count + c_p_c - 1 - i] = temp - temp2 * vr->classifications; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1313 temp = temp2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1314 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1315 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1316 j_times_ptns_to_read += ptns_to_read; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1317 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1318 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1319 for (i = 0; (i < c_p_c) && (partition_count < ptns_to_read); ++i) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1320 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1321 uint_fast16_t voffs; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1322 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1323 if (!do_not_decode[j]) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1324 uint_fast8_t vqclass = classifs[j_times_ptns_to_read+partition_count]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1325 int_fast16_t vqbook = vr->books[vqclass][pass]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1326 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1327 if (vqbook >= 0 && vc->codebooks[vqbook].codevectors) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1328 uint_fast16_t coffs; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1329 unsigned dim = vc->codebooks[vqbook].dimensions; // not uint_fast8_t: 64bit is slower here on amd64 |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1330 uint_fast16_t step = dim == 1 ? vr->partition_size |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1331 : FASTDIV(vr->partition_size, dim); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1332 vorbis_codebook codebook = vc->codebooks[vqbook]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1333 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1334 if (vr_type == 0) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1335 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1336 voffs = voffset+j*vlen; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1337 for (k = 0; k < step; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1338 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1339 for (l = 0; l < dim; ++l) |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1340 vec[voffs + k + l * step] += codebook.codevectors[coffs + l]; // FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1341 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1342 } else if (vr_type == 1) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1343 voffs = voffset + j * vlen; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1344 for (k = 0; k < step; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1345 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1346 for (l = 0; l < dim; ++l, ++voffs) { |
2743 | 1347 vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1348 |
2743 | 1349 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
|
1350 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1351 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1352 } else if (vr_type == 2 && ch == 2 && (voffset & 1) == 0 && (dim & 1) == 0) { // most frequent case optimized |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1353 voffs = voffset >> 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1354 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1355 if (dim == 2) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1356 for (k = 0; k < step; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1357 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1358 vec[voffs + k ] += codebook.codevectors[coffs ]; // FPMATH |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1359 vec[voffs + k + vlen] += codebook.codevectors[coffs + 1]; // FPMATH |
3570 | 1360 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1361 } else if (dim == 4) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1362 for (k = 0; k < step; ++k, voffs += 2) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1363 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 4; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1364 vec[voffs ] += codebook.codevectors[coffs ]; // FPMATH |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1365 vec[voffs + 1 ] += codebook.codevectors[coffs + 2]; // FPMATH |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1366 vec[voffs + vlen ] += codebook.codevectors[coffs + 1]; // FPMATH |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1367 vec[voffs + vlen + 1] += codebook.codevectors[coffs + 3]; // FPMATH |
7284
a40ae5adf74c
unroll another common case in vorbis_residue_decode
lorenm
parents:
7263
diff
changeset
|
1368 } |
3570 | 1369 } else |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1370 for (k = 0; k < step; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1371 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1372 for (l = 0; l < dim; l += 2, voffs++) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1373 vec[voffs ] += codebook.codevectors[coffs + l ]; // FPMATH |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1374 vec[voffs + vlen] += codebook.codevectors[coffs + l + 1]; // FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1375 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1376 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
|
1377 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1378 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1379 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1380 } else if (vr_type == 2) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1381 voffs = voffset; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1382 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1383 for (k = 0; k < step; ++k) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1384 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1385 for (l = 0; l < dim; ++l, ++voffs) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1386 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
|
1387 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1388 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
|
1389 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1390 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1391 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1392 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1393 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1394 j_times_ptns_to_read += ptns_to_read; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1395 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1396 ++partition_count; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1397 voffset += vr->partition_size; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1398 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1399 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1400 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1401 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1402 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1403 |
10309 | 1404 static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, |
1405 uint_fast8_t ch, | |
1406 uint_fast8_t *do_not_decode, | |
1407 float *vec, uint_fast16_t vlen) | |
7764
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1408 { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1409 if (vr->type == 2) |
7764
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1410 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 2); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1411 else if (vr->type == 1) |
7764
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1412 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 1); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1413 else if (vr->type == 0) |
7764
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1414 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 0); |
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1415 else { |
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1416 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n"); |
10251 | 1417 return -1; |
7764
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1418 } |
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1419 } |
a34931a8fea9
Optimize vorbis_residue_decode() so that vr->type is a constant.
michael
parents:
7547
diff
changeset
|
1420 |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1421 void vorbis_inverse_coupling(float *mag, float *ang, int blocksize) |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1422 { |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1423 int i; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1424 for (i = 0; i < blocksize; i++) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1425 if (mag[i] > 0.0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1426 if (ang[i] > 0.0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1427 ang[i] = mag[i] - ang[i]; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1428 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1429 float temp = ang[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1430 ang[i] = mag[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1431 mag[i] += temp; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1432 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1433 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1434 if (ang[i] > 0.0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1435 ang[i] += mag[i]; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1436 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1437 float temp = ang[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1438 ang[i] = mag[i]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1439 mag[i] -= temp; |
3536
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1440 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1441 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1442 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1443 } |
545a15c19c91
sse & sse2 implementations of vorbis channel coupling.
lorenm
parents:
3535
diff
changeset
|
1444 |
10309 | 1445 static void copy_normalize(float *dst, float *src, int len, int exp_bias, |
1446 float add_bias) | |
7261 | 1447 { |
1448 int i; | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1449 if (exp_bias) { |
9676
f39076e0d605
Use iMDCT output scaling to simplify ffvorbis and make it slightly faster.
serge
parents:
9675
diff
changeset
|
1450 memcpy(dst, src, len * sizeof(float)); |
7261 | 1451 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1452 for (i = 0; i < len; i++) |
7261 | 1453 dst[i] = src[i] + add_bias; |
1454 } | |
1455 } | |
1456 | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1457 // Decode the audio packet using the functions above |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1458 |
10309 | 1459 static int vorbis_parse_audio_packet(vorbis_context *vc) |
1460 { | |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1461 GetBitContext *gb = &vc->gb; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1462 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1463 uint_fast8_t previous_window = vc->previous_window; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1464 uint_fast8_t mode_number; |
7261 | 1465 uint_fast8_t blockflag; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1466 uint_fast16_t blocksize; |
7962
c0745c5b1bb4
Interleaved forward/backward channels processing in order to increase chances
benoit
parents:
7764
diff
changeset
|
1467 int_fast32_t i,j; |
12050 | 1468 uint_fast8_t no_residue[255]; |
1469 uint_fast8_t do_not_decode[255]; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1470 vorbis_mapping *mapping; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1471 float *ch_res_ptr = vc->channel_residues; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1472 float *ch_floor_ptr = vc->channel_floors; |
12050 | 1473 uint_fast8_t res_chan[255]; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1474 uint_fast8_t res_num = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1475 int_fast16_t retlen = 0; |
3568
945caa35ee9a
sse and 3dnow implementations of float->int conversion and mdct windowing.
lorenm
parents:
3555
diff
changeset
|
1476 float fadd_bias = vc->add_bias; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1477 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1478 if (get_bits1(gb)) { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1479 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
|
1480 return -1; // packet type not audio |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1481 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1482 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1483 if (vc->mode_count == 1) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1484 mode_number = 0; |
2720 | 1485 } else { |
10477
8cccee204e2e
vorbis_dec: factor out duplicated code for index reading, bounds checking and
reimar
parents:
10354
diff
changeset
|
1486 GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count) |
10244
ae97152542d1
Add checks for per-packet mode indexes and per-header mode mapping indexes.
michael
parents:
10243
diff
changeset
|
1487 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1488 vc->mode_number = mode_number; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1489 mapping = &vc->mappings[vc->modes[mode_number].mapping]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1490 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1491 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
|
1492 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1493 blockflag = vc->modes[mode_number].blockflag; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1494 blocksize = vc->blocksize[blockflag]; |
10309 | 1495 if (blockflag) |
7261 | 1496 skip_bits(gb, 2); // previous_window, next_window |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1497 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1498 memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ? |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1499 memset(ch_floor_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ? |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1500 |
3083
0995d7ddeb58
Added support for vorbis files containing floor type 0.
al
parents:
3075
diff
changeset
|
1501 // Decode floor |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1502 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1503 for (i = 0; i < vc->audio_channels; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1504 vorbis_floor *floor; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1505 if (mapping->submaps > 1) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1506 floor = &vc->floors[mapping->submap_floor[mapping->mux[i]]]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1507 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1508 floor = &vc->floors[mapping->submap_floor[0]]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1509 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1510 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1511 no_residue[i] = floor->decode(vc, &floor->data, ch_floor_ptr); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1512 ch_floor_ptr += blocksize / 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1513 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1514 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1515 // Nonzero vector propagate |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1516 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1517 for (i = mapping->coupling_steps - 1; i >= 0; --i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1518 if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1519 no_residue[mapping->magnitude[i]] = 0; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1520 no_residue[mapping->angle[i]] = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1521 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1522 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1523 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1524 // Decode residue |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1525 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1526 for (i = 0; i < mapping->submaps; ++i) { |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1527 vorbis_residue *residue; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1528 uint_fast8_t ch = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1529 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1530 for (j = 0; j < vc->audio_channels; ++j) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1531 if ((mapping->submaps == 1) || (i == mapping->mux[j])) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1532 res_chan[j] = res_num; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1533 if (no_residue[j]) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1534 do_not_decode[ch] = 1; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1535 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1536 do_not_decode[ch] = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1537 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1538 ++ch; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1539 ++res_num; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1540 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1541 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1542 residue = &vc->residues[mapping->submap_residue[i]]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1543 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
|
1544 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1545 ch_res_ptr += ch * blocksize / 2; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1546 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1547 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1548 // Inverse coupling |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1549 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1550 for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1551 float *mag, *ang; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1552 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1553 mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1554 ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1555 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1556 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1557 |
7962
c0745c5b1bb4
Interleaved forward/backward channels processing in order to increase chances
benoit
parents:
7764
diff
changeset
|
1558 // Dotproduct, MDCT |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1559 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1560 for (j = vc->audio_channels-1;j >= 0; j--) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1561 ch_floor_ptr = vc->channel_floors + j * blocksize / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1562 ch_res_ptr = vc->channel_residues + res_chan[j] * blocksize / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1563 vc->dsp.vector_fmul(ch_floor_ptr, ch_res_ptr, blocksize / 2); |
7962
c0745c5b1bb4
Interleaved forward/backward channels processing in order to increase chances
benoit
parents:
7764
diff
changeset
|
1564 ff_imdct_half(&vc->mdct[blockflag], ch_res_ptr, ch_floor_ptr); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1565 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1566 |
7962
c0745c5b1bb4
Interleaved forward/backward channels processing in order to increase chances
benoit
parents:
7764
diff
changeset
|
1567 // Overlap/add, save data for next overlapping FPMATH |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1568 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1569 retlen = (blocksize + vc->blocksize[previous_window]) / 4; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1570 for (j = 0; j < vc->audio_channels; j++) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1571 uint_fast16_t bs0 = vc->blocksize[0]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1572 uint_fast16_t bs1 = vc->blocksize[1]; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1573 float *residue = vc->channel_residues + res_chan[j] * blocksize / 2; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1574 float *saved = vc->saved + j * bs1 / 4; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1575 float *ret = vc->channel_floors + j * retlen; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1576 float *buf = residue; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1577 const float *win = vc->win[blockflag & previous_window]; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1578 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1579 if (blockflag == previous_window) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1580 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, blocksize / 4); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1581 } else if (blockflag > previous_window) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1582 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, bs0 / 4); |
7263 | 1583 copy_normalize(ret+bs0/2, buf+bs0/4, (bs1-bs0)/4, vc->exp_bias, fadd_bias); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1584 } else { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1585 copy_normalize(ret, saved, (bs1 - bs0) / 4, vc->exp_bias, fadd_bias); |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1586 vc->dsp.vector_fmul_window(ret + (bs1 - bs0) / 4, saved + (bs1 - bs0) / 4, buf, win, fadd_bias, bs0 / 4); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1587 } |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1588 memcpy(saved, buf + blocksize / 4, blocksize / 4 * sizeof(float)); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1589 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1590 |
7261 | 1591 vc->previous_window = blockflag; |
1592 return retlen; | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1593 } |
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 // Return the decoded audio packet through the standard api |
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 static int vorbis_decode_frame(AVCodecContext *avccontext, |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1598 void *data, int *data_size, |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1599 AVPacket *avpkt) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1600 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1601 const uint8_t *buf = avpkt->data; |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1602 int buf_size = avpkt->size; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1603 vorbis_context *vc = avccontext->priv_data ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1604 GetBitContext *gb = &(vc->gb); |
12050 | 1605 const float *channel_ptrs[255]; |
7286
e267f2519248
float_to_int16_interleave: change src to an array of pointers instead of assuming it's contiguous.
lorenm
parents:
7285
diff
changeset
|
1606 int i; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1607 |
3701 | 1608 int_fast16_t len; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1609 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1610 if (!buf_size) |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1611 return 0; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1612 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1613 AV_DEBUG("packet length %d \n", buf_size); |
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 init_get_bits(gb, buf, buf_size*8); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1616 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1617 len = vorbis_parse_audio_packet(vc); |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1618 |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1619 if (len <= 0) { |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1620 *data_size = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1621 return buf_size; |
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 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1624 if (!vc->first_frame) { |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1625 vc->first_frame = 1; |
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1626 *data_size = 0; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1627 return buf_size ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1628 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1629 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1630 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
|
1631 |
11051
5d4991dd23de
Add support for vorbis 6.1 and 7.1 channel configurations as per the new spec
superdump
parents:
10695
diff
changeset
|
1632 if (vc->audio_channels > 8) { |
10354
24a069f83049
Reindent after channel layout commit from yesterday
superdump
parents:
10347
diff
changeset
|
1633 for (i = 0; i < vc->audio_channels; i++) |
24a069f83049
Reindent after channel layout commit from yesterday
superdump
parents:
10347
diff
changeset
|
1634 channel_ptrs[i] = vc->channel_floors + i * len; |
10347
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1635 } else { |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1636 for (i = 0; i < vc->audio_channels; i++) |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1637 channel_ptrs[i] = vc->channel_floors + |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1638 len * ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i]; |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1639 } |
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1640 |
7286
e267f2519248
float_to_int16_interleave: change src to an array of pointers instead of assuming it's contiguous.
lorenm
parents:
7285
diff
changeset
|
1641 vc->dsp.float_to_int16_interleave(data, channel_ptrs, len, vc->audio_channels); |
10316
7bfcc66f807d
whitespace cosmetics, prettyprinting, K&R coding style
diego
parents:
10310
diff
changeset
|
1642 *data_size = len * 2 * vc->audio_channels; |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1643 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1644 return buf_size ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1645 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1646 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1647 // Close decoder |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1648 |
10309 | 1649 static av_cold int vorbis_decode_close(AVCodecContext *avccontext) |
1650 { | |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1651 vorbis_context *vc = avccontext->priv_data; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1652 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1653 vorbis_free(vc); |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1654 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1655 return 0 ; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1656 } |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1657 |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1658 AVCodec vorbis_decoder = { |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1659 "vorbis", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11370
diff
changeset
|
1660 AVMEDIA_TYPE_AUDIO, |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1661 CODEC_ID_VORBIS, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1662 sizeof(vorbis_context), |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1663 vorbis_decode_init, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1664 NULL, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1665 vorbis_decode_close, |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1666 vorbis_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6751
diff
changeset
|
1667 .long_name = NULL_IF_CONFIG_SMALL("Vorbis"), |
10347
93abbe76b5cc
Add vorbis channel layout support according to those defined in the Vorbis I
superdump
parents:
10316
diff
changeset
|
1668 .channel_layouts = ff_vorbis_channel_layouts, |
2697
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1669 }; |
4fe1c19fc7a3
Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff
changeset
|
1670 |