annotate wmadec.c @ 3198:6b9f0c4fbdbe libavcodec

First part of a series of speed-enchancing patches. This one sets up a snow.h and makes snow use the dsputil function pointer framework to access the three functions that will be implemented in asm in the other parts of the patchset. Patch by Robert Edele < yartrebo AH earthlink POIS net> Original thread: Subject: [Ffmpeg-devel] [PATCH] Snow mmx+sse2 asm optimizations Date: Sun, 05 Feb 2006 12:47:14 -0500
author gpoirier
date Thu, 16 Mar 2006 19:18:18 +0000
parents 10cda832bd0f
children d3c05c7dabcd
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)];
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
133 /* pow tables */
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
134 float pow_005_10[121];
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
135 float pow_00625_10[121];
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
136
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
137 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
138 int frame_count;
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
139 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
140 } WMADecodeContext;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
141
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
142 typedef struct CoefVLCTable {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
143 int n; /* total number of codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
144 const uint32_t *huffcodes; /* VLC bit values */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
145 const uint8_t *huffbits; /* VLC bit size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
146 const uint16_t *levels; /* table to build run/level tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
147 } CoefVLCTable;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
148
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
149 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
150
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
151 #include "wmadata.h"
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
152
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
153 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
154 static void dump_shorts(const char *name, const short *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
155 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
156 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
157
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
158 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
159 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
160 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
161 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
162 tprintf(" %5d.0", tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
163 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
164 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
165 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
166 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
167
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
168 static void dump_floats(const char *name, int prec, const float *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
169 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
170 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
171
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
172 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
173 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
174 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
175 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
176 tprintf(" %8.*f", prec, tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
177 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
178 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
179 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
180 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
181 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
182 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
183 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
184
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
185 /* XXX: use same run/length optimization as mpeg decoders */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
186 static void init_coef_vlc(VLC *vlc,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
187 uint16_t **prun_table, uint16_t **plevel_table,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
188 const CoefVLCTable *vlc_table)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
189 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
190 int n = vlc_table->n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
191 const uint8_t *table_bits = vlc_table->huffbits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
192 const uint32_t *table_codes = vlc_table->huffcodes;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
193 const uint16_t *levels_table = vlc_table->levels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
194 uint16_t *run_table, *level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
195 const uint16_t *p;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
196 int i, l, j, level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
197
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
198 init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
199
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
200 run_table = av_malloc(n * sizeof(uint16_t));
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
201 level_table = av_malloc(n * sizeof(uint16_t));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
202 p = levels_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
203 i = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
204 level = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
205 while (i < n) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
206 l = *p++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
207 for(j=0;j<l;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
208 run_table[i] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
209 level_table[i] = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
210 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
211 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
212 level++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
213 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
214 *prun_table = run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
215 *plevel_table = level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
216 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
217
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
218 static int wma_decode_init(AVCodecContext * avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
219 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
220 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
221 int i, flags1, flags2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
222 float *window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
223 uint8_t *extradata;
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
224 float bps, bps1;
3195
10cda832bd0f fix coverity warning CID: 255 (uninitalized variable used to build tables which arent used, well there is a slight change of a FPU exception maybe ...)
michael
parents: 3176
diff changeset
225 volatile float high_freq_factor= 0; //initial value should not matter as the tables build from this are unused if !use_noise_coding
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
226 int sample_rate1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
227 int coef_vlc_table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
228
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
229 s->sample_rate = avctx->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
230 s->nb_channels = avctx->channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
231 s->bit_rate = avctx->bit_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
232 s->block_align = avctx->block_align;
b6eefd714bf3 added wma decoder
bellard
parents:
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;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
281
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
282 /* if version 2, then the rates are normalized */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
283 sample_rate1 = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
284 if (s->version == 2) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
285 if (sample_rate1 >= 44100)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
286 sample_rate1 = 44100;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
287 else if (sample_rate1 >= 22050)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
288 sample_rate1 = 22050;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
289 else if (sample_rate1 >= 16000)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
290 sample_rate1 = 16000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
291 else if (sample_rate1 >= 11025)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
292 sample_rate1 = 11025;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
293 else if (sample_rate1 >= 8000)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
294 sample_rate1 = 8000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
295 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
296
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
297 bps = (float)s->bit_rate / (float)(s->nb_channels * s->sample_rate);
2992
f74ae8aff2a9 Fix wma2 audio decoder
rtognimp
parents: 2967
diff changeset
298 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
299
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
300 /* compute high frequency value and choose if noise coding should
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
301 be activated */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
302 bps1 = bps;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
303 if (s->nb_channels == 2)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
304 bps1 = bps * 1.6;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
305 if (sample_rate1 == 44100) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
306 if (bps1 >= 0.61)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
307 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
308 else
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
309 high_freq_factor = 0.4;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
310 } else if (sample_rate1 == 22050) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
311 if (bps1 >= 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
312 s->use_noise_coding = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
313 else if (bps1 >= 0.72)
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
314 high_freq_factor = 0.7;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
315 else
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
316 high_freq_factor = 0.6;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
317 } else if (sample_rate1 == 16000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
318 if (bps > 0.5)
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
319 high_freq_factor = 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
320 else
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
321 high_freq_factor = 0.3;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
322 } else if (sample_rate1 == 11025) {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
323 high_freq_factor = 0.7;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
324 } else if (sample_rate1 == 8000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
325 if (bps <= 0.625) {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
326 high_freq_factor = 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
327 } else if (bps > 0.75) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
328 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
329 } else {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
330 high_freq_factor = 0.65;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
331 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
332 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
333 if (bps >= 0.8) {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
334 high_freq_factor = 0.75;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
335 } else if (bps >= 0.6) {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
336 high_freq_factor = 0.6;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
337 } else {
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
338 high_freq_factor = 0.5;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
339 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
340 }
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
341 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
342 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
343 s->version, s->nb_channels, s->sample_rate, s->bit_rate,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
344 s->block_align);
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
345 dprintf("bps=%f bps1=%f bitoffset=%d\n",
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
346 bps, bps1, 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
347 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
348 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
349
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
350 /* compute the scale factor band sizes for each MDCT block size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
351 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
352 int a, b, pos, lpos, k, block_len, i, j, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
353 const uint8_t *table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
354
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
355 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
356 s->coefs_start = 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
357 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
358 s->coefs_start = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
359 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
360 for(k = 0; k < s->nb_block_sizes; k++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
361 block_len = s->frame_len >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
362
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
363 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
364 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
365 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
366 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
367 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
368 pos = ((block_len * 2 * a) + (b >> 1)) / b;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
369 if (pos > block_len)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
370 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
371 s->exponent_bands[0][i] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
372 if (pos >= block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
373 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
374 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
375 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
376 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
377 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
378 s->exponent_sizes[0] = i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
379 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
380 /* hardcoded tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
381 table = NULL;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
382 a = s->frame_len_bits - BLOCK_MIN_BITS - k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
383 if (a < 3) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
384 if (s->sample_rate >= 44100)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
385 table = exponent_band_44100[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
386 else if (s->sample_rate >= 32000)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
387 table = exponent_band_32000[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
388 else if (s->sample_rate >= 22050)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
389 table = exponent_band_22050[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
390 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
391 if (table) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
392 n = *table++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
393 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
394 s->exponent_bands[k][i] = table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
395 s->exponent_sizes[k] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
396 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
397 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
398 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
399 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
400 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
401 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
402 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
403 pos <<= 2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
404 if (pos > block_len)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
405 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
406 if (pos > lpos)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
407 s->exponent_bands[k][j++] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
408 if (pos >= block_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
409 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
410 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
411 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
412 s->exponent_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
413 }
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 /* max number of coefs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
417 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
418 /* high freq computation */
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
419 s->high_band_start[k] = (int)((block_len * high_freq_factor) + 0.5);
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
420
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
421 n = s->exponent_sizes[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
422 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
423 pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
424 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
425 int start, end;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
426 start = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
427 pos += s->exponent_bands[k][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
428 end = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
429 if (start < s->high_band_start[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
430 start = s->high_band_start[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
431 if (end > s->coefs_end[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
432 end = s->coefs_end[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
433 if (end > start)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
434 s->exponent_high_bands[k][j++] = end - start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
435 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
436 s->exponent_high_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
437 #if 0
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
438 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
439 s->frame_len >> k,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
440 s->coefs_end[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
441 s->high_band_start[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
442 s->exponent_high_sizes[k]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
443 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
444 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
445 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
446 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
447 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
448 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
449
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
450 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
451 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
452 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
453 for(i = 0; i < s->nb_block_sizes; i++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
454 tprintf("%5d: n=%2d:",
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
455 s->frame_len >> i,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
456 s->exponent_sizes[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
457 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
458 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
459 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
460 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
461 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
462 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
463
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
464 /* init MDCT */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
465 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
466 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
467
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
468 /* init MDCT windows : simple sinus window */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
469 for(i = 0; i < s->nb_block_sizes; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
470 int n, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
471 float alpha;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
472 n = 1 << (s->frame_len_bits - i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
473 window = av_malloc(sizeof(float) * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
474 alpha = M_PI / (2.0 * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
475 for(j=0;j<n;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
476 window[n - j - 1] = sin((j + 0.5) * alpha);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
477 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
478 s->windows[i] = window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
479 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
480
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
481 s->reset_block_lengths = 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
482
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
483 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
484
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
485 /* init the noise generator */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
486 if (s->use_exp_vlc)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
487 s->noise_mult = 0.02;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
488 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
489 s->noise_mult = 0.04;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
490
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
491 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
492 for(i=0;i<NOISE_TAB_SIZE;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
493 s->noise_table[i] = 1.0 * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
494 #else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
495 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
496 unsigned int seed;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
497 float norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
498 seed = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
499 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
500 for(i=0;i<NOISE_TAB_SIZE;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
501 seed = seed * 314159 + 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
502 s->noise_table[i] = (float)((int)seed) * norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
503 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
504 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
505 #endif
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
506 init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(hgain_huffbits),
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
507 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
508 hgain_huffcodes, 2, 2, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
509 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
510
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
511 if (s->use_exp_vlc) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
512 init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(scale_huffbits),
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
513 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
514 scale_huffcodes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
515 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
516 wma_lsp_to_curve_init(s, s->frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
517 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
518
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
519 /* choose the VLC tables for the coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
520 coef_vlc_table = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
521 if (s->sample_rate >= 32000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
522 if (bps1 < 0.72)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
523 coef_vlc_table = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
524 else if (bps1 < 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
525 coef_vlc_table = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
526 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
527
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
528 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
529 &coef_vlcs[coef_vlc_table * 2]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
530 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
531 &coef_vlcs[coef_vlc_table * 2 + 1]);
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
532
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
533 /* init pow tables */
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
534 for (i=0 ; i<121 ; i++) {
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
535 s->pow_005_10[i] = pow(10, i * 0.05);
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
536 s->pow_00625_10[i] = pow(10, i * (1.0 / 16.0));
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
537 }
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
538
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
539 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
540 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
541
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
542 /* interpolate values for a bigger or smaller block. The block must
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
543 have multiple sizes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
544 static void interpolate_array(float *scale, int old_size, int new_size)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
545 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
546 int i, j, jincr, k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
547 float v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
548
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
549 if (new_size > old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
550 jincr = new_size / old_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
551 j = new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
552 for(i = old_size - 1; i >=0; i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
553 v = scale[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
554 k = jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
555 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
556 scale[--j] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
557 } while (--k);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
558 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
559 } else if (new_size < old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
560 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
561 jincr = old_size / new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
562 for(i = 0; i < new_size; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
563 scale[i] = scale[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
564 j += jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
565 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
566 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
567 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
568
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
569 /* compute x^-0.25 with an exponent and mantissa table. We use linear
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
570 interpolation to reduce the mantissa table size at a small speed
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
571 expense (linear interpolation approximately doubles the number of
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
572 bits of precision). */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
573 static inline float pow_m1_4(WMADecodeContext *s, float x)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
574 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
575 union {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
576 float f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
577 unsigned int v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
578 } u, t;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
579 unsigned int e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
580 float a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
581
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
582 u.f = x;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
583 e = u.v >> 23;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
584 m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
585 /* build interpolation scale: 1 <= t < 2. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
586 t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
587 a = s->lsp_pow_m_table1[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
588 b = s->lsp_pow_m_table2[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
589 return s->lsp_pow_e_table[e] * (a + b * t.f);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
590 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
591
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
592 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
593 {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
594 float wdel, a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
595 int i, e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
596
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
597 wdel = M_PI / frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
598 for(i=0;i<frame_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
599 s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
600
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
601 /* tables for x^-0.25 computation */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
602 for(i=0;i<256;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
603 e = i - 126;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
604 s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
605 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
606
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
607 /* NOTE: these two tables are needed to avoid two operations in
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
608 pow_m1_4 */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
609 b = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
610 for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
611 m = (1 << LSP_POW_BITS) + i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
612 a = (float)m * (0.5 / (1 << LSP_POW_BITS));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
613 a = pow(a, -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
614 s->lsp_pow_m_table1[i] = 2 * a - b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
615 s->lsp_pow_m_table2[i] = b - a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
616 b = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
617 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
618 #if 0
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
619 for(i=1;i<20;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
620 float v, r1, r2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
621 v = 5.0 / i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
622 r1 = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
623 r2 = pow(v,-0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
624 printf("%f^-0.25=%f e=%f\n", v, r1, r2 - r1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
625 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
626 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
627 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
628
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
629 /* NOTE: We use the same code as Vorbis here */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
630 /* XXX: optimize it further with SSE/3Dnow */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
631 static void wma_lsp_to_curve(WMADecodeContext *s,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
632 float *out, float *val_max_ptr,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
633 int n, float *lsp)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
634 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
635 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
636 float p, q, w, v, val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
637
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
638 val_max = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
639 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
640 p = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
641 q = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
642 w = s->lsp_cos_table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
643 for(j=1;j<NB_LSP_COEFS;j+=2){
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
644 q *= w - lsp[j - 1];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
645 p *= w - lsp[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
646 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
647 p *= p * (2.0f - w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
648 q *= q * (2.0f + w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
649 v = p + q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
650 v = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
651 if (v > val_max)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
652 val_max = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
653 out[i] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
654 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
655 *val_max_ptr = val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
656 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
657
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
658 /* decode exponents coded with LSP coefficients (same idea as Vorbis) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
659 static void decode_exp_lsp(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
660 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
661 float lsp_coefs[NB_LSP_COEFS];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
662 int val, i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
663
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
664 for(i = 0; i < NB_LSP_COEFS; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
665 if (i == 0 || i >= 8)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
666 val = get_bits(&s->gb, 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
667 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
668 val = get_bits(&s->gb, 4);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
669 lsp_coefs[i] = lsp_codebook[i][val];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
670 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
671
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
672 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
673 s->block_len, lsp_coefs);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
674 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
675
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
676 /* decode exponents coded with VLC codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
677 static int decode_exp_vlc(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
678 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
679 int last_exp, n, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
680 const uint16_t *ptr, *band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
681 float v, *q, max_scale, *q_end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
682
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
683 band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
684 ptr = band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
685 q = s->exponents[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
686 q_end = q + s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
687 max_scale = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
688 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
689 last_exp = get_bits(&s->gb, 5) + 10;
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
690 v = s->pow_00625_10[last_exp];
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
691 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
692 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
693 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
694 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
695 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
696 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
697 last_exp = 36;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
698 while (q < q_end) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
699 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
700 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
701 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
702 /* NOTE: this offset is the same as MPEG4 AAC ! */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
703 last_exp += code - 60;
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
704 v = s->pow_00625_10[last_exp];
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
705 if (v > max_scale)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
706 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
707 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
708 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
709 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
710 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
711 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
712 s->max_exponent[ch] = max_scale;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
713 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
714 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
715
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
716 /* return 0 if OK. return 1 if last block of frame. return -1 if
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
717 unrecorrable error. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
718 static int wma_decode_block(WMADecodeContext *s)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
719 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
720 int n, v, a, ch, code, bsize;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
721 int coef_nb_bits, total_gain, parse_exponents;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
722 float window[BLOCK_MAX_SIZE * 2];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
723 // XXX: FIXME!! there's a bug somewhere which makes this mandatory under altivec
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
724 #ifdef HAVE_ALTIVEC
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
725 volatile int nb_coefs[MAX_CHANNELS] __attribute__((aligned(16)));
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
726 #else
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
727 int nb_coefs[MAX_CHANNELS];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
728 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
729 float mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
730
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
731 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
732 tprintf("***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
733 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
734
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
735 /* compute current block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
736 if (s->use_variable_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
737 n = av_log2(s->nb_block_sizes - 1) + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
738
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
739 if (s->reset_block_lengths) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
740 s->reset_block_lengths = 0;
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->prev_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
745 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
746 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
747 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
748 s->block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
749 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
750 /* update block lengths */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
751 s->prev_block_len_bits = s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
752 s->block_len_bits = s->next_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
753 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
754 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
755 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
756 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
757 s->next_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
758 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
759 /* fixed block len */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
760 s->next_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
761 s->prev_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
762 s->block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
763 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
764
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
765 /* now check if the block length is coherent with the frame length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
766 s->block_len = 1 << s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
767 if ((s->block_pos + s->block_len) > s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
768 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
769
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
770 if (s->nb_channels == 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
771 s->ms_stereo = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
772 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
773 v = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
774 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
775 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
776 s->channel_coded[ch] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
777 v |= a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
778 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
779 /* if no channel coded, no need to go further */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
780 /* XXX: fix potential framing problems */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
781 if (!v)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
782 goto next;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
784 bsize = s->frame_len_bits - s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
785
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
786 /* read total gain and extract corresponding number of bits for
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
787 coef escape coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
788 total_gain = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
789 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
790 a = get_bits(&s->gb, 7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
791 total_gain += a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
792 if (a != 127)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
793 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
794 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
795
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
796 if (total_gain < 15)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
797 coef_nb_bits = 13;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
798 else if (total_gain < 32)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
799 coef_nb_bits = 12;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
800 else if (total_gain < 40)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
801 coef_nb_bits = 11;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
802 else if (total_gain < 45)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
803 coef_nb_bits = 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
804 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
805 coef_nb_bits = 9;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
806
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
807 /* compute number of coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
808 n = s->coefs_end[bsize] - s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
809 for(ch = 0; ch < s->nb_channels; ch++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
810 nb_coefs[ch] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
811
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
812 /* complex coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
813 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
814
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
815 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
816 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
817 int i, n, a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
818 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
819 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
820 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
821 s->high_band_coded[ch][i] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
822 /* if noise coding, the coefficients are not transmitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
823 if (a)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
824 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
825 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
826 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
827 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
828 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
829 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
830 int i, n, val, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
831
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
832 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
833 val = (int)0x80000000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
834 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
835 if (s->high_band_coded[ch][i]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
836 if (val == (int)0x80000000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
837 val = get_bits(&s->gb, 7) - 19;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
838 } else {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
839 code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
840 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
841 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
842 val += code - 18;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
843 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
844 s->high_band_values[ch][i] = val;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
845 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
846 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
847 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
848 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
849 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
850
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
851 /* exposant can be interpolated in short blocks. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
852 parse_exponents = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
853 if (s->block_len_bits != s->frame_len_bits) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
854 parse_exponents = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
855 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
856
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
857 if (parse_exponents) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
858 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
859 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
860 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
861 if (decode_exp_vlc(s, ch) < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
862 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
863 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
864 decode_exp_lsp(s, ch);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
865 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
866 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
867 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
868 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
869 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
870 if (s->channel_coded[ch]) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
871 interpolate_array(s->exponents[ch], 1 << s->prev_block_len_bits,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
872 s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
873 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
874 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
875 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
876
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
877 /* parse spectral coefficients : just RLE encoding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
878 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
879 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
880 VLC *coef_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
881 int level, run, sign, tindex;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
882 int16_t *ptr, *eptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
883 const int16_t *level_table, *run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
884
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
885 /* special VLC tables are used for ms stereo because
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
886 there is potentially less energy there */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
887 tindex = (ch == 1 && s->ms_stereo);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
888 coef_vlc = &s->coef_vlc[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
889 run_table = s->run_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
890 level_table = s->level_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
891 /* XXX: optimize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
892 ptr = &s->coefs1[ch][0];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
893 eptr = ptr + nb_coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
894 memset(ptr, 0, s->block_len * sizeof(int16_t));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
895 for(;;) {
3113
ab01ee59324f - fix insufficient code length for exp_vlc
henry
parents: 3089
diff changeset
896 code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
897 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
898 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
899 if (code == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
900 /* EOB */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
901 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
902 } else if (code == 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
903 /* escape */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
904 level = get_bits(&s->gb, coef_nb_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
905 /* NOTE: this is rather suboptimal. reading
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
906 block_len_bits would be better */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
907 run = get_bits(&s->gb, s->frame_len_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
908 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
909 /* normal code */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
910 run = run_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
911 level = level_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
912 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
913 sign = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
914 if (!sign)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
915 level = -level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
916 ptr += run;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
917 if (ptr >= eptr)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
918 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
919 *ptr++ = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
920 /* NOTE: EOB can be omitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
921 if (ptr >= eptr)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
922 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
923 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
924 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
925 if (s->version == 1 && s->nb_channels >= 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
926 align_get_bits(&s->gb);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
927 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
928 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
929
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
930 /* normalize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
931 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
932 int n4 = s->block_len / 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
933 mdct_norm = 1.0 / (float)n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
934 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
935 mdct_norm *= sqrt(n4);
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
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
939 /* finally compute the MDCT coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
940 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
941 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
942 int16_t *coefs1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
943 float *coefs, *exponents, mult, mult1, noise, *exp_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
944 int i, j, n, n1, last_high_band;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
945 float exp_power[HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
946
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
947 coefs1 = s->coefs1[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
948 exponents = s->exponents[ch];
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
949 mult = s->pow_005_10[total_gain] / s->max_exponent[ch];
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
950 mult *= mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
951 coefs = s->coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
952 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
953 mult1 = mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
954 /* very low freqs : noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
955 for(i = 0;i < s->coefs_start; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
956 *coefs++ = s->noise_table[s->noise_index] * (*exponents++) * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
957 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
958 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
959
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
960 n1 = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
961
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
962 /* compute power of high bands */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
963 exp_ptr = exponents +
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
964 s->high_band_start[bsize] -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
965 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
966 last_high_band = 0; /* avoid warning */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
967 for(j=0;j<n1;j++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
968 n = s->exponent_high_bands[s->frame_len_bits -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
969 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
970 if (s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
971 float e2, v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
972 e2 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
973 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
974 v = exp_ptr[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
975 e2 += v * v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
976 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
977 exp_power[j] = e2 / n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
978 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
979 tprintf("%d: power=%f (%d)\n", j, exp_power[j], n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
980 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
981 exp_ptr += n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
982 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
983
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
984 /* main freqs and high freqs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
985 for(j=-1;j<n1;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
986 if (j < 0) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
987 n = s->high_band_start[bsize] -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
988 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
989 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
990 n = s->exponent_high_bands[s->frame_len_bits -
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
991 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
992 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
993 if (j >= 0 && s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
994 /* use noise with specified power */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
995 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
3176
babf844e1308 Init simplification and 2% faster wma_decode_block on amd64 with tables use
banan
parents: 3113
diff changeset
996 mult1 = mult1 * s->pow_005_10[s->high_band_values[ch][j]];
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;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1115 int i, n4, index, n;
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1119 ff_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 /* multiply by the window */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1125 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1126 output[i] *= window[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1127 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1128
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1129 /* add in the frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1130 index = (s->frame_len / 2) + s->block_pos - n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1131 ptr = &s->frame_out[ch][index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1132 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1133 *ptr += output[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1134 ptr++;
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 /* specific fast case for ms-stereo : add to second
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1138 channel if it is not coded */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1139 if (s->ms_stereo && !s->channel_coded[1]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1140 ptr = &s->frame_out[1][index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1141 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1142 *ptr += output[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1143 ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1144 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1145 }
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 next:
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1149 /* update block number */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1150 s->block_num++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1151 s->block_pos += s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1152 if (s->block_pos >= s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1153 return 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1154 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1155 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1156 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1157
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1158 /* decode a frame of frame_len samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1159 static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1160 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1161 int ret, i, n, a, ch, incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1162 int16_t *ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1163 float *iptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1164
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1165 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1166 tprintf("***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1167 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1168
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1169 /* read each block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1170 s->block_num = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1171 s->block_pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1172 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1173 ret = wma_decode_block(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1174 if (ret < 0)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1175 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1176 if (ret)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1177 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1178 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1179
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1180 /* convert frame to integer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1181 n = s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1182 incr = s->nb_channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1183 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1184 ptr = samples + ch;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1185 iptr = s->frame_out[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1186
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1187 for(i=0;i<n;i++) {
797
308e973c3fda use lrintf to avoid double conversion
bellard
parents: 795
diff changeset
1188 a = lrintf(*iptr++);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1189 if (a > 32767)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1190 a = 32767;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1191 else if (a < -32768)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1192 a = -32768;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1193 *ptr = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1194 ptr += incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1195 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1196 /* prepare for next block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1197 memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1198 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1199 /* XXX: suppress this */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1200 memset(&s->frame_out[ch][s->frame_len], 0,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1201 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1202 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1203
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1204 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1205 dump_shorts("samples", samples, n * s->nb_channels);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1206 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1207 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1208 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1209
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1210 static int wma_decode_superframe(AVCodecContext *avctx,
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1211 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1031
diff changeset
1212 uint8_t *buf, int buf_size)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1213 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1214 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1215 int nb_frames, bit_offset, i, pos, len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1216 uint8_t *q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1217 int16_t *samples;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1218
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1219 tprintf("***decode_superframe:\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1220
1750
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1221 if(buf_size==0){
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1222 s->last_superframe_len = 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1223 return 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1224 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1225
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1226 samples = data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1227
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
1228 init_get_bits(&s->gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1229
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1230 if (s->use_bit_reservoir) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1231 /* read super frame header */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1232 get_bits(&s->gb, 4); /* super frame index */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1233 nb_frames = get_bits(&s->gb, 4) - 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1234
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1235 bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1236
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1237 if (s->last_superframe_len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1238 // printf("skip=%d\n", s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1239 /* add bit_offset bits to last frame */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1240 if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1241 MAX_CODED_SUPERFRAME_SIZE)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1242 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1243 q = s->last_superframe + s->last_superframe_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1244 len = bit_offset;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1245 while (len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1246 *q++ = (get_bits)(&s->gb, 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1247 len -= 8;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1248 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1249 if (len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1250 *q++ = (get_bits)(&s->gb, len) << (8 - len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1251 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1252
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1253 /* 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
1254 init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1255 /* skip unused bits */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1256 if (s->last_bitoffset > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1257 skip_bits(&s->gb, s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1258 /* this frame is stored in the last superframe and in the
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1259 current one */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1260 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1261 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1262 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1263 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1264
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1265 /* read each frame starting from bit_offset */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1266 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
1267 init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1268 len = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1269 if (len > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1270 skip_bits(&s->gb, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1271
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1272 s->reset_block_lengths = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1273 for(i=0;i<nb_frames;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1274 if (wma_decode_frame(s, samples) < 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 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1277 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1278
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1279 /* we copy the end of the frame in the last frame buffer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1280 pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1281 s->last_bitoffset = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1282 pos >>= 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1283 len = buf_size - pos;
819
ae89deb3a97d * avoid negative numbers as well
kabi
parents: 818
diff changeset
1284 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
1285 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1286 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1287 s->last_superframe_len = len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1288 memcpy(s->last_superframe, buf + pos, len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1289 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1290 /* single frame decode */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1291 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1292 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1293 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1294 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1295 *data_size = (int8_t *)samples - (int8_t *)data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1296 return s->block_align;
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1297 fail:
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1298 /* when error, we reset the bit reservoir */
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1299 s->last_superframe_len = 0;
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1300 return -1;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1301 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1302
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1303 static int wma_decode_end(AVCodecContext *avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1304 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1305 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1306 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1307
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1308 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1309 ff_mdct_end(&s->mdct_ctx[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1310 for(i = 0; i < s->nb_block_sizes; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1311 av_free(s->windows[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1312
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1313 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1314 free_vlc(&s->exp_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1315 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1316 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1317 free_vlc(&s->hgain_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1318 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1319 for(i = 0;i < 2; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1320 free_vlc(&s->coef_vlc[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1321 av_free(s->run_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1322 av_free(s->level_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1323 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2775
diff changeset
1324
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1325 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1326 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1327
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1328 AVCodec wmav1_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1329 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1330 "wmav1",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1331 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1332 CODEC_ID_WMAV1,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1333 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1334 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1335 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1336 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1337 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1338 };
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1339
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1340 AVCodec wmav2_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1341 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1342 "wmav2",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1343 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1344 CODEC_ID_WMAV2,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1345 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1346 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1347 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1348 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1349 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1350 };