annotate wmadec.c @ 3604:dad0296d4522 libavcodec

replace MULL with asm too, no significnat speedup but its probably better to not take any chances, some versions of gcc will almost certainly mess it up too if they can
author michael
date Tue, 22 Aug 2006 12:07:02 +0000
parents 6a358dccf2ab
children e28285ddde8d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1 /*
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
2 * WMA compatible decoder
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
3 * Copyright (c) 2002 The FFmpeg Project.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
4 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
9 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
14 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 3022
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 * @file wmadec.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 * WMA compatible decoder.
1967
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
23 * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
24 * WMA v1 is identified by audio format 0x160 in Microsoft media files
1967
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
25 * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
26 *
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
27 * To use this decoder, a calling application must supply the extra data
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
28 * bytes provided with the WMA data. These are the extra, codec-specific
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
29 * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
30 * to the decoder using the extradata[_size] fields in AVCodecContext. There
1967
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
31 * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
32 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
33
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
34 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2370
diff changeset
35 #include "bitstream.h"
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
36 #include "dsputil.h"
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
37
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
38 /* size of blocks */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
39 #define BLOCK_MIN_BITS 7
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
40 #define BLOCK_MAX_BITS 11
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
41 #define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
42
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
43 #define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
44
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
45 /* XXX: find exact max size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
46 #define HIGH_BAND_MAX_SIZE 16
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
47
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
48 #define NB_LSP_COEFS 10
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
49
817
97b71a72f087 reverse first hunk
nickols_k
parents: 816
diff changeset
50 /* XXX: is it a suitable value ? */
2775
f3cdd51c9e16 WMA MAX_CODED_SUPERFRAME_SIZE too small patch by (Mark Weaver: mark-clist, npsl co uk)
michael
parents: 2398
diff changeset
51 #define MAX_CODED_SUPERFRAME_SIZE 16384
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
52
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
53 #define MAX_CHANNELS 2
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
54
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
55 #define NOISE_TAB_SIZE 8192
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
56
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
57 #define LSP_POW_BITS 7
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
58
3022
d4080a510724 get_vlc -> get_vlc2 transition.
banan
parents: 2992
diff changeset
59 #define VLCBITS 9
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
60 #define VLCMAX ((22+VLCBITS-1)/VLCBITS)
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
61
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
62 #define EXPVLCBITS 8
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
63 #define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS)
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
64
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
65 #define HGAINVLCBITS 9
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
66 #define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS)
3022
d4080a510724 get_vlc -> get_vlc2 transition.
banan
parents: 2992
diff changeset
67
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
68 typedef struct WMADecodeContext {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
69 GetBitContext gb;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
70 int sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
71 int nb_channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
72 int bit_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
73 int version; /* 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
74 int block_align;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
75 int use_bit_reservoir;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
76 int use_variable_block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
77 int use_exp_vlc; /* exponent coding: 0 = lsp, 1 = vlc + delta */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
78 int use_noise_coding; /* true if perceptual noise is added */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
79 int byte_offset_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
80 VLC exp_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
81 int exponent_sizes[BLOCK_NB_SIZES];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
82 uint16_t exponent_bands[BLOCK_NB_SIZES][25];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
83 int high_band_start[BLOCK_NB_SIZES]; /* index of first coef in high band */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
84 int coefs_start; /* first coded coef */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
85 int coefs_end[BLOCK_NB_SIZES]; /* max number of coded coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
86 int exponent_high_sizes[BLOCK_NB_SIZES];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
87 int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE];
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
88 VLC hgain_vlc;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
89
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
90 /* coded values in high bands */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
91 int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
92 int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
93
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
94 /* there are two possible tables for spectral coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
95 VLC coef_vlc[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
96 uint16_t *run_table[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
97 uint16_t *level_table[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
98 /* frame info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
99 int frame_len; /* frame length in samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
100 int frame_len_bits; /* frame_len = 1 << frame_len_bits */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
101 int nb_block_sizes; /* number of block sizes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
102 /* block info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
103 int reset_block_lengths;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
104 int block_len_bits; /* log2 of current block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
105 int next_block_len_bits; /* log2 of next block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
106 int prev_block_len_bits; /* log2 of prev block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
107 int block_len; /* block length in samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
108 int block_num; /* block number in current frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
109 int block_pos; /* current position in frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
110 uint8_t ms_stereo; /* true if mid/side stereo mode */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
111 uint8_t channel_coded[MAX_CHANNELS]; /* true if channel is coded */
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
112 DECLARE_ALIGNED_16(float, exponents[MAX_CHANNELS][BLOCK_MAX_SIZE]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
113 float max_exponent[MAX_CHANNELS];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
114 int16_t coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE];
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
115 DECLARE_ALIGNED_16(float, coefs[MAX_CHANNELS][BLOCK_MAX_SIZE]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
116 MDCTContext mdct_ctx[BLOCK_NB_SIZES];
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
117 float *windows[BLOCK_NB_SIZES];
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
118 DECLARE_ALIGNED_16(FFTSample, mdct_tmp[BLOCK_MAX_SIZE]); /* temporary storage for imdct */
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
119 /* output buffer for one frame and the last for IMDCT windowing */
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
120 DECLARE_ALIGNED_16(float, frame_out[MAX_CHANNELS][BLOCK_MAX_SIZE * 2]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
121 /* last frame info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
122 uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
123 int last_bitoffset;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
124 int last_superframe_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
125 float noise_table[NOISE_TAB_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
126 int noise_index;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
127 float noise_mult; /* XXX: suppress that and integrate it in the noise array */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
128 /* lsp_to_curve tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
129 float lsp_cos_table[BLOCK_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
130 float lsp_pow_e_table[256];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
131 float lsp_pow_m_table1[(1 << LSP_POW_BITS)];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
132 float lsp_pow_m_table2[(1 << LSP_POW_BITS)];
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
133 DSPContext dsp;
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
134
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
135 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
136 int frame_count;
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
137 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
138 } WMADecodeContext;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
139
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
140 typedef struct CoefVLCTable {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
141 int n; /* total number of codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
142 const uint32_t *huffcodes; /* VLC bit values */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
143 const uint8_t *huffbits; /* VLC bit size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
144 const uint16_t *levels; /* table to build run/level tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
145 } CoefVLCTable;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
146
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
147 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
148
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
149 #include "wmadata.h"
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
150
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
151 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
152 static void dump_shorts(const char *name, const short *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
153 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
154 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
155
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
156 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
157 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
158 if ((i & 7) == 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
159 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
160 tprintf(" %5d.0", tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
161 if ((i & 7) == 7)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
162 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
163 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
164 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
165
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
166 static void dump_floats(const char *name, int prec, const float *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
167 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
168 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
169
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
170 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
171 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
172 if ((i & 7) == 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
173 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
174 tprintf(" %8.*f", prec, tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
175 if ((i & 7) == 7)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
176 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
177 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
178 if ((i & 7) != 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
179 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
180 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
181 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
182
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
183 /* XXX: use same run/length optimization as mpeg decoders */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
184 static void init_coef_vlc(VLC *vlc,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
185 uint16_t **prun_table, uint16_t **plevel_table,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
186 const CoefVLCTable *vlc_table)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
187 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
188 int n = vlc_table->n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
189 const uint8_t *table_bits = vlc_table->huffbits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
190 const uint32_t *table_codes = vlc_table->huffcodes;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
191 const uint16_t *levels_table = vlc_table->levels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
192 uint16_t *run_table, *level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
193 const uint16_t *p;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
194 int i, l, j, level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
195
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
196 init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
197
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
198 run_table = av_malloc(n * sizeof(uint16_t));
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
199 level_table = av_malloc(n * sizeof(uint16_t));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
200 p = levels_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
201 i = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
202 level = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
203 while (i < n) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
204 l = *p++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
205 for(j=0;j<l;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
206 run_table[i] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
207 level_table[i] = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
208 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
209 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
210 level++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
211 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
212 *prun_table = run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
213 *plevel_table = level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
214 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
215
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
216 static int wma_decode_init(AVCodecContext * avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
217 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
218 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
219 int i, flags1, flags2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
220 float *window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
221 uint8_t *extradata;
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
222 float bps1, high_freq;
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
223 volatile float bps;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
224 int sample_rate1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
225 int coef_vlc_table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
226
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
227 s->sample_rate = avctx->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
228 s->nb_channels = avctx->channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
229 s->bit_rate = avctx->bit_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
230 s->block_align = avctx->block_align;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
231
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
232 dsputil_init(&s->dsp, avctx);
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
233
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
234 if (avctx->codec->id == CODEC_ID_WMAV1) {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
235 s->version = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
236 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
237 s->version = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
238 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
239
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
240 /* extract flag infos */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
241 flags1 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
242 flags2 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
243 extradata = avctx->extradata;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
244 if (s->version == 1 && avctx->extradata_size >= 4) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
245 flags1 = extradata[0] | (extradata[1] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
246 flags2 = extradata[2] | (extradata[3] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
247 } else if (s->version == 2 && avctx->extradata_size >= 6) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
248 flags1 = extradata[0] | (extradata[1] << 8) |
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
249 (extradata[2] << 16) | (extradata[3] << 24);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
250 flags2 = extradata[4] | (extradata[5] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
251 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
252 s->use_exp_vlc = flags2 & 0x0001;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
253 s->use_bit_reservoir = flags2 & 0x0002;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
254 s->use_variable_block_len = flags2 & 0x0004;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
255
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
256 /* compute MDCT block size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
257 if (s->sample_rate <= 16000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
258 s->frame_len_bits = 9;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
259 } else if (s->sample_rate <= 22050 ||
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
260 (s->sample_rate <= 32000 && s->version == 1)) {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
261 s->frame_len_bits = 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
262 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
263 s->frame_len_bits = 11;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
264 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
265 s->frame_len = 1 << s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
266 if (s->use_variable_block_len) {
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
267 int nb_max, nb;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
268 nb = ((flags2 >> 3) & 3) + 1;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
269 if ((s->bit_rate / s->nb_channels) >= 32000)
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
270 nb += 2;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
271 nb_max = s->frame_len_bits - BLOCK_MIN_BITS;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
272 if (nb > nb_max)
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
273 nb = nb_max;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
274 s->nb_block_sizes = nb + 1;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
275 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
276 s->nb_block_sizes = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
277 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
278
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
279 /* init rate dependant parameters */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
280 s->use_noise_coding = 1;
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
281 high_freq = s->sample_rate * 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
282
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
283 /* if version 2, then the rates are normalized */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
284 sample_rate1 = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
285 if (s->version == 2) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
286 if (sample_rate1 >= 44100)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
287 sample_rate1 = 44100;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
288 else if (sample_rate1 >= 22050)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
289 sample_rate1 = 22050;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
290 else if (sample_rate1 >= 16000)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
291 sample_rate1 = 16000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
292 else if (sample_rate1 >= 11025)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
293 sample_rate1 = 11025;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
294 else if (sample_rate1 >= 8000)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
295 sample_rate1 = 8000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
296 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
297
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
298 bps = (float)s->bit_rate / (float)(s->nb_channels * s->sample_rate);
2992
f74ae8aff2a9 Fix wma2 audio decoder
rtognimp
parents: 2967
diff changeset
299 s->byte_offset_bits = av_log2((int)(bps * s->frame_len / 8.0 + 0.5)) + 2;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
300
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
301 /* compute high frequency value and choose if noise coding should
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
302 be activated */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
303 bps1 = bps;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
304 if (s->nb_channels == 2)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
305 bps1 = bps * 1.6;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
306 if (sample_rate1 == 44100) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
307 if (bps1 >= 0.61)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
308 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
309 else
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
310 high_freq = high_freq * 0.4;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
311 } else if (sample_rate1 == 22050) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
312 if (bps1 >= 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
313 s->use_noise_coding = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
314 else if (bps1 >= 0.72)
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
315 high_freq = high_freq * 0.7;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
316 else
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
317 high_freq = high_freq * 0.6;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
318 } else if (sample_rate1 == 16000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
319 if (bps > 0.5)
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
320 high_freq = high_freq * 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
321 else
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
322 high_freq = high_freq * 0.3;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
323 } else if (sample_rate1 == 11025) {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
324 high_freq = high_freq * 0.7;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
325 } else if (sample_rate1 == 8000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
326 if (bps <= 0.625) {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
327 high_freq = high_freq * 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
328 } else if (bps > 0.75) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
329 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
330 } else {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
331 high_freq = high_freq * 0.65;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
332 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
333 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
334 if (bps >= 0.8) {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
335 high_freq = high_freq * 0.75;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
336 } else if (bps >= 0.6) {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
337 high_freq = high_freq * 0.6;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
338 } else {
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
339 high_freq = high_freq * 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
340 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
341 }
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
342 dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
343 dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
344 s->version, s->nb_channels, s->sample_rate, s->bit_rate,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
345 s->block_align);
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
346 dprintf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n",
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
347 bps, bps1, high_freq, s->byte_offset_bits);
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
348 dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
349 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
350
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
351 /* compute the scale factor band sizes for each MDCT block size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
352 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
353 int a, b, pos, lpos, k, block_len, i, j, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
354 const uint8_t *table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
355
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
356 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
357 s->coefs_start = 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
358 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
359 s->coefs_start = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
360 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
361 for(k = 0; k < s->nb_block_sizes; k++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
362 block_len = s->frame_len >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
363
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
364 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
365 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
366 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
367 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
368 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
369 pos = ((block_len * 2 * a) + (b >> 1)) / b;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
370 if (pos > block_len)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
371 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
372 s->exponent_bands[0][i] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
373 if (pos >= block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
374 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
375 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
376 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
377 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
378 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
379 s->exponent_sizes[0] = i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
380 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
381 /* hardcoded tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
382 table = NULL;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
383 a = s->frame_len_bits - BLOCK_MIN_BITS - k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
384 if (a < 3) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
385 if (s->sample_rate >= 44100)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
386 table = exponent_band_44100[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
387 else if (s->sample_rate >= 32000)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
388 table = exponent_band_32000[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
389 else if (s->sample_rate >= 22050)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
390 table = exponent_band_22050[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
391 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
392 if (table) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
393 n = *table++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
394 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
395 s->exponent_bands[k][i] = table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
396 s->exponent_sizes[k] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
397 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
398 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
399 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
400 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
401 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
402 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
403 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
404 pos <<= 2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
405 if (pos > block_len)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
406 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
407 if (pos > lpos)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
408 s->exponent_bands[k][j++] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
409 if (pos >= block_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
410 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
411 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
412 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
413 s->exponent_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
414 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
415 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
416
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
417 /* max number of coefs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
418 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
419 /* high freq computation */
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
420 s->high_band_start[k] = (int)((block_len * 2 * high_freq) /
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
421 s->sample_rate + 0.5);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
422 n = s->exponent_sizes[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
423 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
424 pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
425 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
426 int start, end;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
427 start = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
428 pos += s->exponent_bands[k][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
429 end = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
430 if (start < s->high_band_start[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
431 start = s->high_band_start[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
432 if (end > s->coefs_end[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
433 end = s->coefs_end[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
434 if (end > start)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
435 s->exponent_high_bands[k][j++] = end - start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
436 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
437 s->exponent_high_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
438 #if 0
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
439 tprintf("%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
440 s->frame_len >> k,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
441 s->coefs_end[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
442 s->high_band_start[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
443 s->exponent_high_sizes[k]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
444 for(j=0;j<s->exponent_high_sizes[k];j++)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
445 tprintf(" %d", s->exponent_high_bands[k][j]);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
446 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
447 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
448 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
449 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
450
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
451 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
452 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
453 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
454 for(i = 0; i < s->nb_block_sizes; i++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
455 tprintf("%5d: n=%2d:",
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
456 s->frame_len >> i,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
457 s->exponent_sizes[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
458 for(j=0;j<s->exponent_sizes[i];j++)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
459 tprintf(" %d", s->exponent_bands[i][j]);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
460 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
461 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
462 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
463 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
464
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
465 /* init MDCT */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
466 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
467 ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
468
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
469 /* init MDCT windows : simple sinus window */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
470 for(i = 0; i < s->nb_block_sizes; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
471 int n, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
472 float alpha;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
473 n = 1 << (s->frame_len_bits - i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
474 window = av_malloc(sizeof(float) * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
475 alpha = M_PI / (2.0 * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
476 for(j=0;j<n;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
477 window[n - j - 1] = sin((j + 0.5) * alpha);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
478 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
479 s->windows[i] = window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
480 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
481
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
482 s->reset_block_lengths = 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
483
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
484 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
485
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
486 /* init the noise generator */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
487 if (s->use_exp_vlc)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
488 s->noise_mult = 0.02;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
489 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
490 s->noise_mult = 0.04;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
491
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
492 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
493 for(i=0;i<NOISE_TAB_SIZE;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
494 s->noise_table[i] = 1.0 * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
495 #else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
496 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
497 unsigned int seed;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
498 float norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
499 seed = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
500 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
501 for(i=0;i<NOISE_TAB_SIZE;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
502 seed = seed * 314159 + 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
503 s->noise_table[i] = (float)((int)seed) * norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
504 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
505 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
506 #endif
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
507 init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(hgain_huffbits),
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
508 hgain_huffbits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2180
diff changeset
509 hgain_huffcodes, 2, 2, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
510 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
511
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
512 if (s->use_exp_vlc) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
513 init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(scale_huffbits),
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
514 scale_huffbits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2180
diff changeset
515 scale_huffcodes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
516 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
517 wma_lsp_to_curve_init(s, s->frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
518 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
519
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
520 /* choose the VLC tables for the coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
521 coef_vlc_table = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
522 if (s->sample_rate >= 32000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
523 if (bps1 < 0.72)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
524 coef_vlc_table = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
525 else if (bps1 < 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
526 coef_vlc_table = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
527 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
528
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
529 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
530 &coef_vlcs[coef_vlc_table * 2]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
531 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
532 &coef_vlcs[coef_vlc_table * 2 + 1]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
533 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
534 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
535
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
536 /* interpolate values for a bigger or smaller block. The block must
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
537 have multiple sizes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
538 static void interpolate_array(float *scale, int old_size, int new_size)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
539 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
540 int i, j, jincr, k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
541 float v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
542
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
543 if (new_size > old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
544 jincr = new_size / old_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
545 j = new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
546 for(i = old_size - 1; i >=0; i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
547 v = scale[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
548 k = jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
549 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
550 scale[--j] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
551 } while (--k);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
552 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
553 } else if (new_size < old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
554 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
555 jincr = old_size / new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
556 for(i = 0; i < new_size; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
557 scale[i] = scale[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
558 j += jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
559 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
560 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
561 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
562
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
563 /* compute x^-0.25 with an exponent and mantissa table. We use linear
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
564 interpolation to reduce the mantissa table size at a small speed
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
565 expense (linear interpolation approximately doubles the number of
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
566 bits of precision). */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
567 static inline float pow_m1_4(WMADecodeContext *s, float x)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
568 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
569 union {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
570 float f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
571 unsigned int v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
572 } u, t;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
573 unsigned int e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
574 float a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
575
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
576 u.f = x;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
577 e = u.v >> 23;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
578 m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
579 /* build interpolation scale: 1 <= t < 2. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
580 t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
581 a = s->lsp_pow_m_table1[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
582 b = s->lsp_pow_m_table2[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
583 return s->lsp_pow_e_table[e] * (a + b * t.f);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
584 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
585
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
586 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
587 {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
588 float wdel, a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
589 int i, e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
590
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
591 wdel = M_PI / frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
592 for(i=0;i<frame_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
593 s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
594
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
595 /* tables for x^-0.25 computation */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
596 for(i=0;i<256;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
597 e = i - 126;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
598 s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
599 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
600
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
601 /* NOTE: these two tables are needed to avoid two operations in
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
602 pow_m1_4 */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
603 b = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
604 for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
605 m = (1 << LSP_POW_BITS) + i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
606 a = (float)m * (0.5 / (1 << LSP_POW_BITS));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
607 a = pow(a, -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
608 s->lsp_pow_m_table1[i] = 2 * a - b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
609 s->lsp_pow_m_table2[i] = b - a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
610 b = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
611 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
612 #if 0
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
613 for(i=1;i<20;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
614 float v, r1, r2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
615 v = 5.0 / i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
616 r1 = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
617 r2 = pow(v,-0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
618 printf("%f^-0.25=%f e=%f\n", v, r1, r2 - r1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
619 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
620 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
621 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
622
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
623 /* NOTE: We use the same code as Vorbis here */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
624 /* XXX: optimize it further with SSE/3Dnow */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
625 static void wma_lsp_to_curve(WMADecodeContext *s,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
626 float *out, float *val_max_ptr,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
627 int n, float *lsp)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
628 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
629 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
630 float p, q, w, v, val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
631
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
632 val_max = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
633 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
634 p = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
635 q = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
636 w = s->lsp_cos_table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
637 for(j=1;j<NB_LSP_COEFS;j+=2){
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
638 q *= w - lsp[j - 1];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
639 p *= w - lsp[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
640 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
641 p *= p * (2.0f - w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
642 q *= q * (2.0f + w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
643 v = p + q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
644 v = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
645 if (v > val_max)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
646 val_max = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
647 out[i] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
648 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
649 *val_max_ptr = val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
650 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
651
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
652 /* decode exponents coded with LSP coefficients (same idea as Vorbis) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
653 static void decode_exp_lsp(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
654 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
655 float lsp_coefs[NB_LSP_COEFS];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
656 int val, i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
657
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
658 for(i = 0; i < NB_LSP_COEFS; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
659 if (i == 0 || i >= 8)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
660 val = get_bits(&s->gb, 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
661 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
662 val = get_bits(&s->gb, 4);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
663 lsp_coefs[i] = lsp_codebook[i][val];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
664 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
665
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
666 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
667 s->block_len, lsp_coefs);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
668 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
669
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
670 /* decode exponents coded with VLC codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
671 static int decode_exp_vlc(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
672 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
673 int last_exp, n, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
674 const uint16_t *ptr, *band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
675 float v, *q, max_scale, *q_end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
676
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
677 band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
678 ptr = band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
679 q = s->exponents[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
680 q_end = q + s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
681 max_scale = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
682 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
683 last_exp = get_bits(&s->gb, 5) + 10;
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
684 /* XXX: use a table */
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
685 v = pow(10, last_exp * (1.0 / 16.0));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
686 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
687 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
688 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
689 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
690 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
691 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
692 last_exp = 36;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
693 while (q < q_end) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
694 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
695 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
696 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
697 /* NOTE: this offset is the same as MPEG4 AAC ! */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
698 last_exp += code - 60;
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
699 /* XXX: use a table */
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
700 v = pow(10, last_exp * (1.0 / 16.0));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
701 if (v > max_scale)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
702 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
703 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
704 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
705 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
706 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
707 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
708 s->max_exponent[ch] = max_scale;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
709 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
710 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
711
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
712 /* return 0 if OK. return 1 if last block of frame. return -1 if
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
713 unrecorrable error. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
714 static int wma_decode_block(WMADecodeContext *s)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
715 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
716 int n, v, a, ch, code, bsize;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
717 int coef_nb_bits, total_gain, parse_exponents;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
718 float window[BLOCK_MAX_SIZE * 2];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
719 // XXX: FIXME!! there's a bug somewhere which makes this mandatory under altivec
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
720 #ifdef HAVE_ALTIVEC
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
721 volatile int nb_coefs[MAX_CHANNELS] __attribute__((aligned(16)));
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
722 #else
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
723 int nb_coefs[MAX_CHANNELS];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
724 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
725 float mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
726
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
727 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
728 tprintf("***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
729 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
730
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
731 /* compute current block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
732 if (s->use_variable_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
733 n = av_log2(s->nb_block_sizes - 1) + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
734
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
735 if (s->reset_block_lengths) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
736 s->reset_block_lengths = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
737 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
738 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
739 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
740 s->prev_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
741 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
742 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
743 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
744 s->block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
745 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
746 /* update block lengths */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
747 s->prev_block_len_bits = s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
748 s->block_len_bits = s->next_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
749 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
750 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
751 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
752 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
753 s->next_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
754 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
755 /* fixed block len */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
756 s->next_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
757 s->prev_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
758 s->block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
759 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
760
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
761 /* now check if the block length is coherent with the frame length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
762 s->block_len = 1 << s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
763 if ((s->block_pos + s->block_len) > s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
764 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
765
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
766 if (s->nb_channels == 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
767 s->ms_stereo = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
768 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
769 v = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
770 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
771 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
772 s->channel_coded[ch] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
773 v |= a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
774 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
775 /* if no channel coded, no need to go further */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
776 /* XXX: fix potential framing problems */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
777 if (!v)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
778 goto next;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
779
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
780 bsize = s->frame_len_bits - s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
781
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
782 /* read total gain and extract corresponding number of bits for
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
783 coef escape coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
784 total_gain = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
785 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
786 a = get_bits(&s->gb, 7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
787 total_gain += a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
788 if (a != 127)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
789 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
790 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
791
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
792 if (total_gain < 15)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
793 coef_nb_bits = 13;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
794 else if (total_gain < 32)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
795 coef_nb_bits = 12;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
796 else if (total_gain < 40)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
797 coef_nb_bits = 11;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
798 else if (total_gain < 45)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
799 coef_nb_bits = 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
800 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
801 coef_nb_bits = 9;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
802
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
803 /* compute number of coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
804 n = s->coefs_end[bsize] - s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
805 for(ch = 0; ch < s->nb_channels; ch++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
806 nb_coefs[ch] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
807
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
808 /* complex coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
809 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
810
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
811 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
812 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
813 int i, n, a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
814 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
815 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
816 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
817 s->high_band_coded[ch][i] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
818 /* if noise coding, the coefficients are not transmitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
819 if (a)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
820 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
821 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
822 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
823 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
824 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
825 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
826 int i, n, val, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
827
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
828 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
829 val = (int)0x80000000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
830 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
831 if (s->high_band_coded[ch][i]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
832 if (val == (int)0x80000000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
833 val = get_bits(&s->gb, 7) - 19;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
834 } else {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
835 code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
836 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
837 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
838 val += code - 18;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
839 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
840 s->high_band_values[ch][i] = val;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
841 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
842 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
843 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
844 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
845 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
846
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
847 /* exposant can be interpolated in short blocks. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
848 parse_exponents = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
849 if (s->block_len_bits != s->frame_len_bits) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
850 parse_exponents = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
851 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
852
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
853 if (parse_exponents) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
854 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
855 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
856 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
857 if (decode_exp_vlc(s, ch) < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
858 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
859 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
860 decode_exp_lsp(s, ch);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
861 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
862 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
863 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
864 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
865 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
866 if (s->channel_coded[ch]) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
867 interpolate_array(s->exponents[ch], 1 << s->prev_block_len_bits,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
868 s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
869 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
870 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
871 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
872
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
873 /* parse spectral coefficients : just RLE encoding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
874 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
875 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
876 VLC *coef_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
877 int level, run, sign, tindex;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
878 int16_t *ptr, *eptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
879 const int16_t *level_table, *run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
880
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
881 /* special VLC tables are used for ms stereo because
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
882 there is potentially less energy there */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
883 tindex = (ch == 1 && s->ms_stereo);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
884 coef_vlc = &s->coef_vlc[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
885 run_table = s->run_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
886 level_table = s->level_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
887 /* XXX: optimize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
888 ptr = &s->coefs1[ch][0];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
889 eptr = ptr + nb_coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
890 memset(ptr, 0, s->block_len * sizeof(int16_t));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
891 for(;;) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
892 code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
893 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
894 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
895 if (code == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
896 /* EOB */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
897 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
898 } else if (code == 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
899 /* escape */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
900 level = get_bits(&s->gb, coef_nb_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
901 /* NOTE: this is rather suboptimal. reading
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
902 block_len_bits would be better */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
903 run = get_bits(&s->gb, s->frame_len_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
904 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
905 /* normal code */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
906 run = run_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
907 level = level_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
908 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
909 sign = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
910 if (!sign)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
911 level = -level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
912 ptr += run;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
913 if (ptr >= eptr)
3361
bcaa5113e311 Ignore overrun in spectral RLE decoding, fixes
reimar
parents: 3235
diff changeset
914 {
bcaa5113e311 Ignore overrun in spectral RLE decoding, fixes
reimar
parents: 3235
diff changeset
915 av_log(NULL, AV_LOG_ERROR, "overflow in spectral RLE, ignoring\n");
bcaa5113e311 Ignore overrun in spectral RLE decoding, fixes
reimar
parents: 3235
diff changeset
916 break;
bcaa5113e311 Ignore overrun in spectral RLE decoding, fixes
reimar
parents: 3235
diff changeset
917 }
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
918 *ptr++ = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
919 /* NOTE: EOB can be omitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
920 if (ptr >= eptr)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
921 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
922 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
923 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
924 if (s->version == 1 && s->nb_channels >= 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
925 align_get_bits(&s->gb);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
926 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
927 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
928
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
929 /* normalize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
930 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
931 int n4 = s->block_len / 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
932 mdct_norm = 1.0 / (float)n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
933 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
934 mdct_norm *= sqrt(n4);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
935 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
936 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
937
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
938 /* finally compute the MDCT coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
939 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
940 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
941 int16_t *coefs1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
942 float *coefs, *exponents, mult, mult1, noise, *exp_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
943 int i, j, n, n1, last_high_band;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
944 float exp_power[HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
945
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
946 coefs1 = s->coefs1[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
947 exponents = s->exponents[ch];
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
948 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
949 mult *= mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
950 coefs = s->coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
951 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
952 mult1 = mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
953 /* very low freqs : noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
954 for(i = 0;i < s->coefs_start; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
955 *coefs++ = s->noise_table[s->noise_index] * (*exponents++) * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
956 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
957 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
958
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
959 n1 = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
960
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
961 /* compute power of high bands */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
962 exp_ptr = exponents +
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
963 s->high_band_start[bsize] -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
964 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
965 last_high_band = 0; /* avoid warning */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
966 for(j=0;j<n1;j++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
967 n = s->exponent_high_bands[s->frame_len_bits -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
968 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
969 if (s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
970 float e2, v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
971 e2 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
972 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
973 v = exp_ptr[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
974 e2 += v * v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
975 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
976 exp_power[j] = e2 / n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
977 last_high_band = j;
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
978 tprintf("%d: power=%f (%d)\n", j, exp_power[j], n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
979 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
980 exp_ptr += n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
981 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
982
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
983 /* main freqs and high freqs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
984 for(j=-1;j<n1;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
985 if (j < 0) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
986 n = s->high_band_start[bsize] -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
987 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
988 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
989 n = s->exponent_high_bands[s->frame_len_bits -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
990 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
991 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
992 if (j >= 0 && s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
993 /* use noise with specified power */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
994 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
3235
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
995 /* XXX: use a table */
d3c05c7dabcd reverting 1.31->1.33
michael
parents: 3195
diff changeset
996 mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
997 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
998 mult1 *= mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
999 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1000 noise = s->noise_table[s->noise_index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1001 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1002 *coefs++ = (*exponents++) * noise * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1003 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1004 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1005 /* coded values + small noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1006 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1007 noise = s->noise_table[s->noise_index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1008 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1009 *coefs++ = ((*coefs1++) + noise) * (*exponents++) * mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1010 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1011 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1012 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1013
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1014 /* very high freqs : noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1015 n = s->block_len - s->coefs_end[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1016 mult1 = mult * exponents[-1];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1017 for(i = 0; i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1018 *coefs++ = s->noise_table[s->noise_index] * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1019 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1020 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1021 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1022 /* XXX: optimize more */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1023 for(i = 0;i < s->coefs_start; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1024 *coefs++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1025 n = nb_coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1026 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1027 *coefs++ = coefs1[i] * exponents[i] * mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1028 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1029 n = s->block_len - s->coefs_end[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1030 for(i = 0;i < n; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1031 *coefs++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1032 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1033 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1034 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1035
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1036 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1037 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1038 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1039 dump_floats("exponents", 3, s->exponents[ch], s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1040 dump_floats("coefs", 1, s->coefs[ch], s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1041 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1042 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1043 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1044
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1045 if (s->ms_stereo && s->channel_coded[1]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1046 float a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1047 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1048
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1049 /* nominal case for ms stereo: we do it before mdct */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1050 /* no need to optimize this case because it should almost
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1051 never happen */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1052 if (!s->channel_coded[0]) {
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1053 tprintf("rare ms-stereo case happened\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1054 memset(s->coefs[0], 0, sizeof(float) * s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1055 s->channel_coded[0] = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1056 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1057
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1058 for(i = 0; i < s->block_len; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1059 a = s->coefs[0][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1060 b = s->coefs[1][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1061 s->coefs[0][i] = a + b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1062 s->coefs[1][i] = a - b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1063 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1064 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1065
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1066 /* build the window : we ensure that when the windows overlap
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1067 their squared sum is always 1 (MDCT reconstruction rule) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1068 /* XXX: merge with output */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1069 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1070 int i, next_block_len, block_len, prev_block_len, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1071 float *wptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1072
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1073 block_len = s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1074 prev_block_len = 1 << s->prev_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1075 next_block_len = 1 << s->next_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1076
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1077 /* right part */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1078 wptr = window + block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1079 if (block_len <= next_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1080 for(i=0;i<block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1081 *wptr++ = s->windows[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1082 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1083 /* overlap */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1084 n = (block_len / 2) - (next_block_len / 2);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1085 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1086 *wptr++ = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1087 for(i=0;i<next_block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1088 *wptr++ = s->windows[s->frame_len_bits - s->next_block_len_bits][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1089 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1090 *wptr++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1091 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1092
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1093 /* left part */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1094 wptr = window + block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1095 if (block_len <= prev_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1096 for(i=0;i<block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1097 *--wptr = s->windows[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1098 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1099 /* overlap */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1100 n = (block_len / 2) - (prev_block_len / 2);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1101 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1102 *--wptr = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1103 for(i=0;i<prev_block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1104 *--wptr = s->windows[s->frame_len_bits - s->prev_block_len_bits][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1105 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1106 *--wptr = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1107 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1108 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1109
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1110
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1111 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1112 if (s->channel_coded[ch]) {
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
1113 DECLARE_ALIGNED_16(FFTSample, output[BLOCK_MAX_SIZE * 2]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1114 float *ptr;
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
1115 int n4, index, n;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1116
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1117 n = s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1118 n4 = s->block_len / 2;
3555
5ea82888103e 3dnow2 implementation of imdct.
lorenm
parents: 3362
diff changeset
1119 s->mdct_ctx[bsize].fft.imdct_calc(&s->mdct_ctx[bsize],
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1120 output, s->coefs[ch], s->mdct_tmp);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1121
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1122 /* XXX: optimize all that by build the window and
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1123 multipying/adding at the same time */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1124
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
1125 /* multiply by the window and add in the frame */
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1126 index = (s->frame_len / 2) + s->block_pos - n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1127 ptr = &s->frame_out[ch][index];
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
1128 s->dsp.vector_fmul_add_add(ptr,window,output,ptr,0,2*n,1);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1129
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1130 /* specific fast case for ms-stereo : add to second
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1131 channel if it is not coded */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1132 if (s->ms_stereo && !s->channel_coded[1]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1133 ptr = &s->frame_out[1][index];
3592
6a358dccf2ab SIMD vector optimizations. 3% faster overall decoding.
banan
parents: 3555
diff changeset
1134 s->dsp.vector_fmul_add_add(ptr,window,output,ptr,0,2*n,1);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1135 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1136 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1137 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1138 next:
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1139 /* update block number */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1140 s->block_num++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1141 s->block_pos += s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1142 if (s->block_pos >= s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1143 return 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1144 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1145 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1146 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1147
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1148 /* decode a frame of frame_len samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1149 static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1150 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1151 int ret, i, n, a, ch, incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1152 int16_t *ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1153 float *iptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1154
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1155 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1156 tprintf("***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1157 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1158
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1159 /* read each block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1160 s->block_num = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1161 s->block_pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1162 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1163 ret = wma_decode_block(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1164 if (ret < 0)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1165 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1166 if (ret)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1167 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1168 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1169
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1170 /* convert frame to integer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1171 n = s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1172 incr = s->nb_channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1173 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1174 ptr = samples + ch;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1175 iptr = s->frame_out[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1176
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1177 for(i=0;i<n;i++) {
797
308e973c3fda use lrintf to avoid double conversion
bellard
parents: 795
diff changeset
1178 a = lrintf(*iptr++);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1179 if (a > 32767)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1180 a = 32767;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1181 else if (a < -32768)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1182 a = -32768;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1183 *ptr = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1184 ptr += incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1185 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1186 /* prepare for next block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1187 memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1188 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1189 /* XXX: suppress this */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1190 memset(&s->frame_out[ch][s->frame_len], 0,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1191 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1192 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1193
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1194 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1195 dump_shorts("samples", samples, n * s->nb_channels);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1196 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1197 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1198 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1199
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1200 static int wma_decode_superframe(AVCodecContext *avctx,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1201 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1031
diff changeset
1202 uint8_t *buf, int buf_size)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1203 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1204 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1205 int nb_frames, bit_offset, i, pos, len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1206 uint8_t *q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1207 int16_t *samples;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1208
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1209 tprintf("***decode_superframe:\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1210
1750
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1211 if(buf_size==0){
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1212 s->last_superframe_len = 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1213 return 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1214 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1215
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1216 samples = data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1217
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1218 init_get_bits(&s->gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1219
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1220 if (s->use_bit_reservoir) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1221 /* read super frame header */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1222 get_bits(&s->gb, 4); /* super frame index */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1223 nb_frames = get_bits(&s->gb, 4) - 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1224
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1225 bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1226
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1227 if (s->last_superframe_len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1228 // printf("skip=%d\n", s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1229 /* add bit_offset bits to last frame */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1230 if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1231 MAX_CODED_SUPERFRAME_SIZE)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1232 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1233 q = s->last_superframe + s->last_superframe_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1234 len = bit_offset;
3362
c43fcf831f7c Do not read full byte when less than 8 bits are still to be read.
reimar
parents: 3361
diff changeset
1235 while (len > 7) {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1236 *q++ = (get_bits)(&s->gb, 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1237 len -= 8;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1238 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1239 if (len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1240 *q++ = (get_bits)(&s->gb, len) << (8 - len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1241 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1242
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1243 /* XXX: bit_offset bits into last frame */
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1244 init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1245 /* skip unused bits */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1246 if (s->last_bitoffset > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1247 skip_bits(&s->gb, s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1248 /* this frame is stored in the last superframe and in the
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1249 current one */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1250 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1251 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1252 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1253 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1254
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1255 /* read each frame starting from bit_offset */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1256 pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1257 init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1258 len = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1259 if (len > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1260 skip_bits(&s->gb, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1261
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1262 s->reset_block_lengths = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1263 for(i=0;i<nb_frames;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1264 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1265 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1266 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1267 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1268
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1269 /* we copy the end of the frame in the last frame buffer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1270 pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1271 s->last_bitoffset = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1272 pos >>= 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1273 len = buf_size - pos;
819
ae89deb3a97d * avoid negative numbers as well
kabi
parents: 818
diff changeset
1274 if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1275 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1276 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1277 s->last_superframe_len = len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1278 memcpy(s->last_superframe, buf + pos, len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1279 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1280 /* single frame decode */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1281 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1282 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1283 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1284 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1285 *data_size = (int8_t *)samples - (int8_t *)data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1286 return s->block_align;
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1287 fail:
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1288 /* when error, we reset the bit reservoir */
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1289 s->last_superframe_len = 0;
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1290 return -1;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1291 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1292
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1293 static int wma_decode_end(AVCodecContext *avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1294 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1295 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1296 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1297
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1298 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1299 ff_mdct_end(&s->mdct_ctx[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1300 for(i = 0; i < s->nb_block_sizes; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1301 av_free(s->windows[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1302
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1303 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1304 free_vlc(&s->exp_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1305 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1306 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1307 free_vlc(&s->hgain_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1308 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1309 for(i = 0;i < 2; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1310 free_vlc(&s->coef_vlc[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1311 av_free(s->run_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1312 av_free(s->level_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1313 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1314
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1315 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1316 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1317
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1318 AVCodec wmav1_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1319 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1320 "wmav1",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1321 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1322 CODEC_ID_WMAV1,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1323 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1324 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1325 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1326 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1327 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1328 };
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1329
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1330 AVCodec wmav2_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1331 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1332 "wmav2",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1333 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1334 CODEC_ID_WMAV2,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1335 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1336 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1337 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1338 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1339 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1340 };