annotate vorbis_dec.c @ 9675:2e84b386a8b6 libavcodec

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