Mercurial > libavcodec.hg
annotate wma.c @ 10345:294c444866f7 libavcodec
Make avcodec_open set codec_id and codec_type if they haven't been set.
This fixes the API breakage introduced by the check that avctx codec id and type
match the opened codec and should make (almost?) all applications work again.
author | reimar |
---|---|
date | Thu, 01 Oct 2009 15:54:55 +0000 |
parents | ab687351bfef |
children | 3d011a01a6a0 |
rev | line source |
---|---|
4490 | 1 /* |
2 * WMA compatible codec | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
7682
diff
changeset
|
3 * Copyright (c) 2002-2007 The FFmpeg Project |
4490 | 4 * |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include "avcodec.h" | |
23 #include "wma.h" | |
24 #include "wmadata.h" | |
25 | |
26 #undef NDEBUG | |
27 #include <assert.h> | |
28 | |
29 /* XXX: use same run/length optimization as mpeg decoders */ | |
30 //FIXME maybe split decode / encode or pass flag | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
31 static void init_coef_vlc(VLC *vlc, uint16_t **prun_table, |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
32 float **plevel_table, uint16_t **pint_table, |
4490 | 33 const CoefVLCTable *vlc_table) |
34 { | |
35 int n = vlc_table->n; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
36 const uint8_t *table_bits = vlc_table->huffbits; |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
37 const uint32_t *table_codes = vlc_table->huffcodes; |
4490 | 38 const uint16_t *levels_table = vlc_table->levels; |
39 uint16_t *run_table, *level_table, *int_table; | |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
40 float *flevel_table; |
4490 | 41 int i, l, j, k, level; |
42 | |
43 init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); | |
44 | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
45 run_table = av_malloc(n * sizeof(uint16_t)); |
4490 | 46 level_table = av_malloc(n * sizeof(uint16_t)); |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
47 flevel_table= av_malloc(n * sizeof(*flevel_table)); |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
48 int_table = av_malloc(n * sizeof(uint16_t)); |
4490 | 49 i = 2; |
50 level = 1; | |
51 k = 0; | |
52 while (i < n) { | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
53 int_table[k] = i; |
4490 | 54 l = levels_table[k++]; |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
55 for (j = 0; j < l; j++) { |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
56 run_table[i] = j; |
4490 | 57 level_table[i] = level; |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
58 flevel_table[i]= level; |
4490 | 59 i++; |
60 } | |
61 level++; | |
62 } | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
63 *prun_table = run_table; |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
64 *plevel_table = flevel_table; |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
65 *pint_table = int_table; |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
66 av_free(level_table); |
4490 | 67 } |
68 | |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
69 /** |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
70 *@brief Get the samples per frame for this stream. |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
71 *@param sample_rate output sample_rate |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
72 *@param version wma version |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
73 *@param decode_flags codec compression features |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
74 *@return log2 of the number of output samples per frame |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
75 */ |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
76 int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
77 unsigned int decode_flags) |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
78 { |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
79 |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
80 int frame_len_bits; |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
81 |
9843 | 82 if (sample_rate <= 16000) { |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
83 frame_len_bits = 9; |
9843 | 84 } else if (sample_rate <= 22050 || |
85 (sample_rate <= 32000 && version == 1)) { | |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
86 frame_len_bits = 10; |
9843 | 87 } else if (sample_rate <= 48000) { |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
88 frame_len_bits = 11; |
9842
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
89 } else if (sample_rate <= 96000) { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
90 frame_len_bits = 12; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
91 } else { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
92 frame_len_bits = 13; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
93 } |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
94 |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
95 if (version == 3) { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
96 int tmp = decode_flags & 0x6; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
97 if (tmp == 0x2) { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
98 ++frame_len_bits; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
99 } else if (tmp == 0x4) { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
100 --frame_len_bits; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
101 } else if (tmp == 0x6) { |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
102 frame_len_bits -= 2; |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
103 } |
32d100ad81a6
Add additional sample rates to the frame len bits calculation code
faust3
parents:
9841
diff
changeset
|
104 } |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
105 |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
106 return frame_len_bits; |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
107 } |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
108 |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
109 int ff_wma_init(AVCodecContext *avctx, int flags2) |
4490 | 110 { |
4601 | 111 WMACodecContext *s = avctx->priv_data; |
4490 | 112 int i; |
113 float bps1, high_freq; | |
114 volatile float bps; | |
115 int sample_rate1; | |
116 int coef_vlc_table; | |
117 | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
118 if ( avctx->sample_rate <= 0 || avctx->sample_rate > 50000 |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
119 || avctx->channels <= 0 || avctx->channels > 8 |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
120 || avctx->bit_rate <= 0) |
5086
a10ebd496bd9
sanity checks (should prevent hypothetical div by zero issue)
michael
parents:
4737
diff
changeset
|
121 return -1; |
a10ebd496bd9
sanity checks (should prevent hypothetical div by zero issue)
michael
parents:
4737
diff
changeset
|
122 |
4490 | 123 s->sample_rate = avctx->sample_rate; |
124 s->nb_channels = avctx->channels; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
125 s->bit_rate = avctx->bit_rate; |
4490 | 126 s->block_align = avctx->block_align; |
127 | |
128 dsputil_init(&s->dsp, avctx); | |
129 | |
130 if (avctx->codec->id == CODEC_ID_WMAV1) { | |
131 s->version = 1; | |
132 } else { | |
133 s->version = 2; | |
134 } | |
135 | |
136 /* compute MDCT block size */ | |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
137 s->frame_len_bits = ff_wma_get_frame_len_bits(s->sample_rate, s->version, 0); |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9840
diff
changeset
|
138 |
4490 | 139 s->frame_len = 1 << s->frame_len_bits; |
140 if (s->use_variable_block_len) { | |
141 int nb_max, nb; | |
142 nb = ((flags2 >> 3) & 3) + 1; | |
143 if ((s->bit_rate / s->nb_channels) >= 32000) | |
144 nb += 2; | |
145 nb_max = s->frame_len_bits - BLOCK_MIN_BITS; | |
146 if (nb > nb_max) | |
147 nb = nb_max; | |
148 s->nb_block_sizes = nb + 1; | |
149 } else { | |
150 s->nb_block_sizes = 1; | |
151 } | |
152 | |
4588
fc155ff94878
cosmetics: Fix another common typo, dependAnt --> dependEnt.
diego
parents:
4490
diff
changeset
|
153 /* init rate dependent parameters */ |
4490 | 154 s->use_noise_coding = 1; |
155 high_freq = s->sample_rate * 0.5; | |
156 | |
157 /* if version 2, then the rates are normalized */ | |
158 sample_rate1 = s->sample_rate; | |
159 if (s->version == 2) { | |
9843 | 160 if (sample_rate1 >= 44100) { |
4490 | 161 sample_rate1 = 44100; |
9843 | 162 } else if (sample_rate1 >= 22050) { |
4490 | 163 sample_rate1 = 22050; |
9843 | 164 } else if (sample_rate1 >= 16000) { |
4490 | 165 sample_rate1 = 16000; |
9843 | 166 } else if (sample_rate1 >= 11025) { |
4490 | 167 sample_rate1 = 11025; |
9843 | 168 } else if (sample_rate1 >= 8000) { |
4490 | 169 sample_rate1 = 8000; |
9843 | 170 } |
4490 | 171 } |
172 | |
173 bps = (float)s->bit_rate / (float)(s->nb_channels * s->sample_rate); | |
174 s->byte_offset_bits = av_log2((int)(bps * s->frame_len / 8.0 + 0.5)) + 2; | |
175 | |
176 /* compute high frequency value and choose if noise coding should | |
177 be activated */ | |
178 bps1 = bps; | |
179 if (s->nb_channels == 2) | |
180 bps1 = bps * 1.6; | |
181 if (sample_rate1 == 44100) { | |
9843 | 182 if (bps1 >= 0.61) { |
4490 | 183 s->use_noise_coding = 0; |
9843 | 184 } else { |
4490 | 185 high_freq = high_freq * 0.4; |
9843 | 186 } |
4490 | 187 } else if (sample_rate1 == 22050) { |
9843 | 188 if (bps1 >= 1.16) { |
4490 | 189 s->use_noise_coding = 0; |
9843 | 190 } else if (bps1 >= 0.72) { |
4490 | 191 high_freq = high_freq * 0.7; |
9843 | 192 } else { |
4490 | 193 high_freq = high_freq * 0.6; |
9843 | 194 } |
4490 | 195 } else if (sample_rate1 == 16000) { |
9843 | 196 if (bps > 0.5) { |
4490 | 197 high_freq = high_freq * 0.5; |
9843 | 198 } else { |
4490 | 199 high_freq = high_freq * 0.3; |
9843 | 200 } |
4490 | 201 } else if (sample_rate1 == 11025) { |
202 high_freq = high_freq * 0.7; | |
203 } else if (sample_rate1 == 8000) { | |
204 if (bps <= 0.625) { | |
205 high_freq = high_freq * 0.5; | |
206 } else if (bps > 0.75) { | |
207 s->use_noise_coding = 0; | |
208 } else { | |
209 high_freq = high_freq * 0.65; | |
210 } | |
211 } else { | |
212 if (bps >= 0.8) { | |
213 high_freq = high_freq * 0.75; | |
214 } else if (bps >= 0.6) { | |
215 high_freq = high_freq * 0.6; | |
216 } else { | |
217 high_freq = high_freq * 0.5; | |
218 } | |
219 } | |
4652 | 220 dprintf(s->avctx, "flags2=0x%x\n", flags2); |
221 dprintf(s->avctx, "version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
222 s->version, s->nb_channels, s->sample_rate, s->bit_rate, |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
223 s->block_align); |
4652 | 224 dprintf(s->avctx, "bps=%f bps1=%f high_freq=%f bitoffset=%d\n", |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
225 bps, bps1, high_freq, s->byte_offset_bits); |
4652 | 226 dprintf(s->avctx, "use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
227 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); |
4490 | 228 |
229 /* compute the scale factor band sizes for each MDCT block size */ | |
230 { | |
231 int a, b, pos, lpos, k, block_len, i, j, n; | |
232 const uint8_t *table; | |
233 | |
234 if (s->version == 1) { | |
235 s->coefs_start = 3; | |
236 } else { | |
237 s->coefs_start = 0; | |
238 } | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
239 for (k = 0; k < s->nb_block_sizes; k++) { |
4490 | 240 block_len = s->frame_len >> k; |
241 | |
242 if (s->version == 1) { | |
243 lpos = 0; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
244 for (i = 0; i < 25; i++) { |
4490 | 245 a = wma_critical_freqs[i]; |
246 b = s->sample_rate; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
247 pos = ((block_len * 2 * a) + (b >> 1)) / b; |
4490 | 248 if (pos > block_len) |
249 pos = block_len; | |
250 s->exponent_bands[0][i] = pos - lpos; | |
251 if (pos >= block_len) { | |
252 i++; | |
253 break; | |
254 } | |
255 lpos = pos; | |
256 } | |
257 s->exponent_sizes[0] = i; | |
258 } else { | |
259 /* hardcoded tables */ | |
260 table = NULL; | |
261 a = s->frame_len_bits - BLOCK_MIN_BITS - k; | |
262 if (a < 3) { | |
9843 | 263 if (s->sample_rate >= 44100) { |
4490 | 264 table = exponent_band_44100[a]; |
9843 | 265 } else if (s->sample_rate >= 32000) { |
4490 | 266 table = exponent_band_32000[a]; |
9843 | 267 } else if (s->sample_rate >= 22050) { |
4490 | 268 table = exponent_band_22050[a]; |
9843 | 269 } |
4490 | 270 } |
271 if (table) { | |
272 n = *table++; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
273 for (i = 0; i < n; i++) |
4490 | 274 s->exponent_bands[k][i] = table[i]; |
275 s->exponent_sizes[k] = n; | |
276 } else { | |
277 j = 0; | |
278 lpos = 0; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
279 for (i = 0; i < 25; i++) { |
4490 | 280 a = wma_critical_freqs[i]; |
281 b = s->sample_rate; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
282 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); |
4490 | 283 pos <<= 2; |
284 if (pos > block_len) | |
285 pos = block_len; | |
286 if (pos > lpos) | |
287 s->exponent_bands[k][j++] = pos - lpos; | |
288 if (pos >= block_len) | |
289 break; | |
290 lpos = pos; | |
291 } | |
292 s->exponent_sizes[k] = j; | |
293 } | |
294 } | |
295 | |
296 /* max number of coefs */ | |
297 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; | |
298 /* high freq computation */ | |
299 s->high_band_start[k] = (int)((block_len * 2 * high_freq) / | |
300 s->sample_rate + 0.5); | |
301 n = s->exponent_sizes[k]; | |
302 j = 0; | |
303 pos = 0; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
304 for (i = 0; i < n; i++) { |
4490 | 305 int start, end; |
306 start = pos; | |
307 pos += s->exponent_bands[k][i]; | |
308 end = pos; | |
309 if (start < s->high_band_start[k]) | |
310 start = s->high_band_start[k]; | |
311 if (end > s->coefs_end[k]) | |
312 end = s->coefs_end[k]; | |
313 if (end > start) | |
314 s->exponent_high_bands[k][j++] = end - start; | |
315 } | |
316 s->exponent_high_sizes[k] = j; | |
317 #if 0 | |
4600 | 318 tprintf(s->avctx, "%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ", |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
319 s->frame_len >> k, |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
320 s->coefs_end[k], |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
321 s->high_band_start[k], |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
322 s->exponent_high_sizes[k]); |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
323 for (j = 0; j < s->exponent_high_sizes[k]; j++) |
4600 | 324 tprintf(s->avctx, " %d", s->exponent_high_bands[k][j]); |
325 tprintf(s->avctx, "\n"); | |
4490 | 326 #endif |
327 } | |
328 } | |
329 | |
330 #ifdef TRACE | |
331 { | |
332 int i, j; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
333 for (i = 0; i < s->nb_block_sizes; i++) { |
4600 | 334 tprintf(s->avctx, "%5d: n=%2d:", |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
335 s->frame_len >> i, |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
336 s->exponent_sizes[i]); |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
337 for (j = 0; j < s->exponent_sizes[i]; j++) |
4600 | 338 tprintf(s->avctx, " %d", s->exponent_bands[i][j]); |
339 tprintf(s->avctx, "\n"); | |
4490 | 340 } |
341 } | |
342 #endif | |
343 | |
344 /* init MDCT windows : simple sinus window */ | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
345 for (i = 0; i < s->nb_block_sizes; i++) { |
7572
d72f9295fe6e
Change wma.c to use the ff_sine_window_init() from mdct.c
superdump
parents:
5369
diff
changeset
|
346 int n; |
4490 | 347 n = 1 << (s->frame_len_bits - i); |
10174
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
9872
diff
changeset
|
348 ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i], n); |
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
9872
diff
changeset
|
349 s->windows[i] = ff_sine_windows[s->frame_len_bits - i]; |
4490 | 350 } |
351 | |
352 s->reset_block_lengths = 1; | |
353 | |
354 if (s->use_noise_coding) { | |
355 | |
356 /* init the noise generator */ | |
9843 | 357 if (s->use_exp_vlc) { |
4490 | 358 s->noise_mult = 0.02; |
9843 | 359 } else { |
4490 | 360 s->noise_mult = 0.04; |
9843 | 361 } |
4490 | 362 |
363 #ifdef TRACE | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
364 for (i = 0; i < NOISE_TAB_SIZE; i++) |
4490 | 365 s->noise_table[i] = 1.0 * s->noise_mult; |
366 #else | |
367 { | |
368 unsigned int seed; | |
369 float norm; | |
370 seed = 1; | |
371 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult; | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
372 for (i = 0; i < NOISE_TAB_SIZE; i++) { |
4490 | 373 seed = seed * 314159 + 1; |
374 s->noise_table[i] = (float)((int)seed) * norm; | |
375 } | |
376 } | |
377 #endif | |
378 } | |
379 | |
380 /* choose the VLC tables for the coefficients */ | |
381 coef_vlc_table = 2; | |
382 if (s->sample_rate >= 32000) { | |
9843 | 383 if (bps1 < 0.72) { |
4490 | 384 coef_vlc_table = 0; |
9843 | 385 } else if (bps1 < 1.16) { |
4490 | 386 coef_vlc_table = 1; |
9843 | 387 } |
4490 | 388 } |
389 s->coef_vlcs[0]= &coef_vlcs[coef_vlc_table * 2 ]; | |
390 s->coef_vlcs[1]= &coef_vlcs[coef_vlc_table * 2 + 1]; | |
391 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], &s->int_table[0], | |
392 s->coef_vlcs[0]); | |
393 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], &s->int_table[1], | |
394 s->coef_vlcs[1]); | |
395 | |
396 return 0; | |
397 } | |
398 | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
399 int ff_wma_total_gain_to_bits(int total_gain) |
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
400 { |
4490 | 401 if (total_gain < 15) return 13; |
402 else if (total_gain < 32) return 12; | |
403 else if (total_gain < 40) return 11; | |
404 else if (total_gain < 45) return 10; | |
405 else return 9; | |
406 } | |
407 | |
408 int ff_wma_end(AVCodecContext *avctx) | |
409 { | |
4601 | 410 WMACodecContext *s = avctx->priv_data; |
4490 | 411 int i; |
412 | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
413 for (i = 0; i < s->nb_block_sizes; i++) |
4490 | 414 ff_mdct_end(&s->mdct_ctx[i]); |
415 | |
416 if (s->use_exp_vlc) { | |
417 free_vlc(&s->exp_vlc); | |
418 } | |
419 if (s->use_noise_coding) { | |
420 free_vlc(&s->hgain_vlc); | |
421 } | |
9840
71066f133e1c
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
diego
parents:
8629
diff
changeset
|
422 for (i = 0; i < 2; i++) { |
4490 | 423 free_vlc(&s->coef_vlc[i]); |
424 av_free(s->run_table[i]); | |
425 av_free(s->level_table[i]); | |
5369 | 426 av_free(s->int_table[i]); |
4490 | 427 } |
428 | |
429 return 0; | |
430 } | |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
431 |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
432 /** |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
433 * Decode an uncompressed coefficient. |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
434 * @param s codec context |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
435 * @return the decoded coefficient |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
436 */ |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
437 unsigned int ff_wma_get_large_val(GetBitContext* gb) |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
438 { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
439 /** consumes up to 34 bits */ |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
440 int n_bits = 8; |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
441 /** decode length */ |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
442 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
443 n_bits += 8; |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
444 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
445 n_bits += 8; |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
446 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
447 n_bits += 7; |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
448 } |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
449 } |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
450 } |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
451 return get_bits_long(gb, n_bits); |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
452 } |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
453 |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
454 /** |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
455 * Decode run level compressed coefficients. |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
456 * @param avctx codec context |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
457 * @param gb bitstream reader context |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
458 * @param vlc vlc table for get_vlc2 |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
459 * @param level_table level codes |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
460 * @param run_table run codes |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
461 * @param version 0 for wma1,2 1 for wmapro |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
462 * @param ptr output buffer |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
463 * @param offset offset in the output buffer |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
464 * @param num_coefs number of input coefficents |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
465 * @param block_len input buffer length (2^n) |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
466 * @param frame_len_bits number of bits for escaped run codes |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
467 * @param coef_nb_bits number of bits for escaped level codes |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
468 * @return 0 on success, -1 otherwise |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
469 */ |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
470 int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb, |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
471 VLC *vlc, |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
472 const float *level_table, const uint16_t *run_table, |
9868 | 473 int version, WMACoef *ptr, int offset, |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
474 int num_coefs, int block_len, int frame_len_bits, |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
475 int coef_nb_bits) |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
476 { |
9871 | 477 int code, level, sign; |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
478 const uint32_t *ilvl = (const uint32_t*)level_table; |
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
479 uint32_t *iptr = (uint32_t*)ptr; |
9871 | 480 const unsigned int coef_mask = block_len - 1; |
481 for (; offset < num_coefs; offset++) { | |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
482 code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX); |
9871 | 483 if (code > 1) { |
484 /** normal code */ | |
485 offset += run_table[code]; | |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
486 sign = get_bits1(gb) - 1; |
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
487 iptr[offset & coef_mask] = ilvl[code] ^ sign<<31; |
9871 | 488 } else if (code == 1) { |
9872
01ccb357a33c
Make remaining run level decode comments doxygen comments
faust3
parents:
9871
diff
changeset
|
489 /** EOB */ |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
490 break; |
9871 | 491 } else { |
9872
01ccb357a33c
Make remaining run level decode comments doxygen comments
faust3
parents:
9871
diff
changeset
|
492 /** escape */ |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
493 if (!version) { |
9870 | 494 level = get_bits(gb, coef_nb_bits); |
9872
01ccb357a33c
Make remaining run level decode comments doxygen comments
faust3
parents:
9871
diff
changeset
|
495 /** NOTE: this is rather suboptimal. reading |
01ccb357a33c
Make remaining run level decode comments doxygen comments
faust3
parents:
9871
diff
changeset
|
496 block_len_bits would be better */ |
9871 | 497 offset += get_bits(gb, frame_len_bits); |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
498 } else { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
499 level = ff_wma_get_large_val(gb); |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
500 /** escape decode */ |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
501 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
502 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
503 if (get_bits1(gb)) { |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
504 av_log(avctx,AV_LOG_ERROR, |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
505 "broken escape sequence\n"); |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
506 return -1; |
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
507 } else |
9871 | 508 offset += get_bits(gb, frame_len_bits) + 4; |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
509 } else |
9871 | 510 offset += get_bits(gb, 2) + 1; |
511 } | |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
512 } |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
513 sign = get_bits1(gb) - 1; |
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10174
diff
changeset
|
514 ptr[offset & coef_mask] = (level^sign) - sign; |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
515 } |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
516 } |
9871 | 517 /** NOTE: EOB can be omitted */ |
518 if (offset > num_coefs) { | |
519 av_log(avctx, AV_LOG_ERROR, "overflow in spectral RLE, ignoring\n"); | |
520 return -1; | |
521 } | |
522 | |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
523 return 0; |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
524 } |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9843
diff
changeset
|
525 |