annotate vorbis_dec.c @ 11225:5811a86f55f1 libavcodec

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