annotate vorbis_dec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 4c8aac222d19
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2697
4fe1c19fc7a3 Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff changeset
1 /**
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
16 * Lesser General Public License for more details.
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
17 *
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
89af006ac42d Cosmetics. Add the defines needed for debug output.
banan
parents: 3300
diff changeset
24 //#define V_DEBUG
89af006ac42d Cosmetics. Add the defines needed for debug output.
banan
parents: 3300
diff changeset
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
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
31 #include "get_bits.h"
2697
4fe1c19fc7a3 Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff changeset
32 #include "dsputil.h"
11370
4b3da727d832 Move FFT parts from dsputil.h to fft.h
mru
parents: 11051
diff changeset
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
12436597cc0c decrease V_NB_BITS if possible
michael
parents: 2743
diff changeset
38 #define V_NB_BITS 8
12436597cc0c decrease V_NB_BITS if possible
michael
parents: 2743
diff changeset
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
9f469a5d3a33 more trivial optimizations
michael
parents: 2741
diff changeset
47 #undef NDEBUG
9f469a5d3a33 more trivial optimizations
michael
parents: 2741
diff changeset
48 #include <assert.h>
2697
4fe1c19fc7a3 Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff changeset
49
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
50 typedef struct {
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
51 uint_fast8_t dimensions;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
52 uint_fast8_t lookup_type;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
53 uint_fast8_t maxdepth;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
54 VLC vlc;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
55 float *codevectors;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
56 unsigned int nb_bits;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
57 } vorbis_codebook;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
60 typedef struct vorbis_floor0_s vorbis_floor0;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
61 typedef struct vorbis_floor1_s vorbis_floor1;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
62 struct vorbis_context_s;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
63 typedef
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
64 uint_fast8_t (* vorbis_floor_decode_func)
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
65 (struct vorbis_context_s *, vorbis_floor_data *, float *);
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
66 typedef struct {
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
67 uint_fast8_t floor_type;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
68 vorbis_floor_decode_func decode;
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
69 union vorbis_floor_u {
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
72 uint_fast16_t rate;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
81 } t0;
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
82 struct vorbis_floor1_s {
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
83 uint_fast8_t partitions;
12374
9999147e9d50 vorbis_dec: Change partition_class[] to uint8_t.
alexc
parents: 12348
diff changeset
84 uint8_t partition_class[32];
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
85 uint_fast8_t class_dimensions[16];
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
86 uint_fast8_t class_subclasses[16];
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
87 uint_fast8_t class_masterbook[16];
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
88 int_fast16_t subclass_books[16][8];
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
89 uint_fast8_t multiplier;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
92 } t1;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
93 } data;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
94 } vorbis_floor;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
95
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
96 typedef struct {
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
97 uint_fast16_t type;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
98 uint_fast32_t begin;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
105 uint_fast16_t ptns_to_read;
12347
bc21b45eba99 vorbisdec: Prevent a potential integer overflow.
alexc
parents: 12341
diff changeset
106 uint8_t *classifs;
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
107 } vorbis_residue;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
108
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
109 typedef struct {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
110 uint_fast8_t submaps;
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
111 uint_fast16_t coupling_steps;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
112 uint_fast8_t *magnitude;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
113 uint_fast8_t *angle;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
117 } vorbis_mapping;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
118
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
119 typedef struct {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
120 uint_fast8_t blockflag;
3798
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
121 uint_fast16_t windowtype;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
124 } vorbis_mode;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
125
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
126 typedef struct vorbis_context_s {
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
127 AVCodecContext *avccontext;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
128 GetBitContext gb;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
129 DSPContext dsp;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
130
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 9933
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
135 uint_fast32_t audio_samplerate;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
136 uint_fast32_t bitrate_maximum;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
137 uint_fast32_t bitrate_nominal;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
138 uint_fast32_t bitrate_minimum;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
141 uint_fast16_t codebook_count;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
156 uint_fast32_t add_bias; // for float->int conversion
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
157 uint_fast32_t exp_bias;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
158 } vorbis_context;
6e7b9a44800c vorbis.h -> vorbis_data.c
ods15
parents: 3762
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
179 static float vorbisfloat2float(uint_fast32_t val)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
191 static void vorbis_free(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
199 for (i = 0; i < vc->residue_count; i++)
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
3bfe36a9db73 vorbis cosmetics: mdct0,mdct1 => mdct[2]
lorenm
parents: 3570
diff changeset
204 ff_mdct_end(&vc->mdct[0]);
3bfe36a9db73 vorbis cosmetics: mdct0,mdct1 => mdct[2]
lorenm
parents: 3570
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
219 } else {
3801
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
237 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
fde28cb7e3d5 use PRIxN, %zd, %td formats where needed
mru
parents: 2744
diff changeset
263 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook setup data corrupt. \n", cb);
2720
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
1792a26c0bbb Check dimensions against 0 too.
michael
parents: 10231
diff changeset
269 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is invalid (%d). \n", cb, codebook_setup->dimensions);
2720
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
fde28cb7e3d5 use PRIxN, %zd, %td formats where needed
mru
parents: 2744
diff changeset
274 av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook has too many entries (%"PRIdFAST32"). \n", cb, entries);
2720
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
419
2744
12436597cc0c decrease V_NB_BITS if possible
michael
parents: 2743
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
425
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
426 av_free(tmp_vlc_bits);
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
427 av_free(tmp_vlc_codes);
12050
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
428 av_free(codebook_multiplicands);
2697
4fe1c19fc7a3 Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff changeset
429 return 0;
2720
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
430
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
431 // Error:
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
432 error:
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
433 av_free(tmp_vlc_bits);
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
434 av_free(tmp_vlc_codes);
12050
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
435 av_free(codebook_multiplicands);
10251
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
441 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
467 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
559 /* zero would result in a div by zero later *
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
560 * 2^0 - 1 == 0 */
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
561 if (floor_setup->data.t0.amplitude_bits == 0) {
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
562 av_log(vc->avccontext, AV_LOG_ERROR,
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
563 "Floor 0 amplitude bits is 0.\n");
10251
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
564 return -1;
3084
d37c1e2f715d 10l (malloc check with the wrong pointer)
al
parents: 3083
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
621 } else {
3083
0995d7ddeb58 Added support for vorbis files containing floor type 0.
al
parents: 3075
diff changeset
622 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid floor type!\n");
10251
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
631 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
6e01bba7a930 Check begin/end/partition_size.
michael
parents: 10246
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
659 return -1;
10250
6e01bba7a930 Check begin/end/partition_size.
michael
parents: 10246
diff changeset
660 }
6e01bba7a930 Check begin/end/partition_size.
michael
parents: 10246
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
665 res_setup->ptns_to_read =
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
666 (res_setup->end - res_setup->begin) / res_setup->partition_size;
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
667 res_setup->classifs = av_malloc(res_setup->ptns_to_read *
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
668 vc->audio_channels *
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
707 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
804 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
829 static int vorbis_parse_setup_hdr(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
874 static int vorbis_parse_id_hdr(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
889 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid number of channels\n");
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
890 return -1;
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
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
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
894 av_log(vc->avccontext, AV_LOG_ERROR, "Invalid samplerate\n");
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
895 return -1;
e99054a89bfe Check validity of channels & samplerate.
michael
parents: 10199
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
3bfe36a9db73 vorbis cosmetics: mdct0,mdct1 => mdct[2]
lorenm
parents: 3570
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
945 static av_cold int vorbis_decode_init(AVCodecContext *avccontext)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
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
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
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
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
972 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
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
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
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
040b965f2cd0 accept old extradata format
mru
parents: 2715
diff changeset
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
fb9a51e5d116 Fix memleak for currupt input.
cehoyos
parents: 7962
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1019 vorbis_floor_data *vfu, float *vec)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1128 static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1129 vorbis_floor_data *vfu, float *vec)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
1135 uint_fast16_t floor1_Y[258];
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
1136 uint_fast16_t floor1_Y_final[258];
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
1150 if (!get_bits1(gb)) // silence
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
12436597cc0c decrease V_NB_BITS if possible
michael
parents: 2743
diff changeset
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
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
203cd258fc20 make ready_floor1_list() shared for vorbis_enc.c
ods15
parents: 3798
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1261 static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1262 vorbis_residue *vr,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1263 uint_fast8_t ch,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1264 uint_fast8_t *do_not_decode,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
1271 uint_fast16_t ptns_to_read = vr->ptns_to_read;
12347
bc21b45eba99 vorbisdec: Prevent a potential integer overflow.
alexc
parents: 12341
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1281 if (do_not_decode[0])
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
8535fcac43c1 rename inverse -> ff_inverse
mru
parents: 4001
diff changeset
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
12436597cc0c decrease V_NB_BITS if possible
michael
parents: 2743
diff changeset
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
9f469a5d3a33 more trivial optimizations
michael
parents: 2741
diff changeset
1347 vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH
2697
4fe1c19fc7a3 Vorbis decoder by (Balatoni Denes | dbalatoni programozo hu)
michael
parents:
diff changeset
1348
2743
9f469a5d3a33 more trivial optimizations
michael
parents: 2741
diff changeset
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
991ef6ade276 misc tweaks in vorbis_residue_decode().
lorenm
parents: 3568
diff changeset
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
991ef6ade276 misc tweaks in vorbis_residue_decode().
lorenm
parents: 3568
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1404 static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1405 uint_fast8_t ch,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1406 uint_fast8_t *do_not_decode,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
b9ea1706bf27 Make error return sign consistent.
michael
parents: 10250
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1445 static void copy_normalize(float *dst, float *src, int len, int exp_bias,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1446 float add_bias)
7261
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1447 {
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
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
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1451 } else {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
1452 for (i = 0; i < len; i++)
7261
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1453 dst[i] = src[i] + add_bias;
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1454 }
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1455 }
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1459 static int vorbis_parse_audio_packet(vorbis_context *vc)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
1468 uint_fast8_t no_residue[255];
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
4a5ed2d916f6 1.) LGPL license mentioned
michael
parents: 2716
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1495 if (blockflag)
7261
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
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
fc843d00867c exploit mdct symmetry
lorenm
parents: 7261
diff changeset
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
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
1591 vc->previous_window = blockflag;
032a49f033e8 simplify vorbis windowing
lorenm
parents: 7142
diff changeset
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
a3fe680377aa vorbisdec: remove variable-length arrays
mru
parents: 11973
diff changeset
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
4ba77dc980f1 Remove unused variable.
diego
parents: 3574
diff changeset
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
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
1649 static av_cold int vorbis_decode_close(AVCodecContext *avccontext)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10256
diff changeset
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