1 /*
2 * WMA compatible codec
3 * Copyright (c) 2002-2007 The FFmpeg Project
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
24
31
32 /* XXX: use same run/length optimization as mpeg decoders */
33 // FIXME maybe split decode / encode or pass flag
35 float **plevel_table, uint16_t **pint_table,
37 {
39 const uint8_t *table_bits = vlc_table->
huffbits;
40 const uint32_t *table_codes = vlc_table->
huffcodes;
41 const uint16_t *levels_table = vlc_table->
levels;
42 uint16_t *run_table, *int_table;
43 float *flevel_table;
45
49
53 if (!run_table || !flevel_table || !int_table) {
58 }
61 k = 0;
64 l = levels_table[k++];
65 for (j = 0; j < l; j++) {
69 }
71 }
72 *prun_table = run_table;
73 *plevel_table = flevel_table;
74 *pint_table = int_table;
75
76 return 0;
77 }
78
80 {
84 float bps1, high_freq;
86 int sample_rate1;
87 int coef_vlc_table;
88
92 return -1;
93
94
97 else
99
100 /* compute MDCT block size */
103 s->next_block_len_bits =
s->frame_len_bits;
104 s->prev_block_len_bits =
s->frame_len_bits;
105 s->block_len_bits =
s->frame_len_bits;
106
107 s->frame_len = 1 <<
s->frame_len_bits;
108 if (
s->use_variable_block_len) {
109 int nb_max, nb;
110 nb = ((flags2 >> 3) & 3) + 1;
112 nb += 2;
114 if (nb > nb_max)
115 nb = nb_max;
116 s->nb_block_sizes = nb + 1;
117 } else
118 s->nb_block_sizes = 1;
119
120 /* init rate dependent parameters */
121 s->use_noise_coding = 1;
123
124 /* if version 2, then the rates are normalized */
126 if (
s->version == 2) {
127 if (sample_rate1 >= 44100)
128 sample_rate1 = 44100;
129 else if (sample_rate1 >= 22050)
130 sample_rate1 = 22050;
131 else if (sample_rate1 >= 16000)
132 sample_rate1 = 16000;
133 else if (sample_rate1 >= 11025)
134 sample_rate1 = 11025;
135 else if (sample_rate1 >= 8000)
136 sample_rate1 = 8000;
137 }
138
141 s->byte_offset_bits =
av_log2((
int) (
bps *
s->frame_len / 8.0 + 0.5)) + 2;
145 }
146
147 /* compute high frequency value and choose if noise coding should
148 * be activated */
152 if (sample_rate1 == 44100) {
153 if (bps1 >= 0.61)
154 s->use_noise_coding = 0;
155 else
156 high_freq = high_freq * 0.4;
157 } else if (sample_rate1 == 22050) {
158 if (bps1 >= 1.16)
159 s->use_noise_coding = 0;
160 else if (bps1 >= 0.72)
161 high_freq = high_freq * 0.7;
162 else
163 high_freq = high_freq * 0.6;
164 } else if (sample_rate1 == 16000) {
166 high_freq = high_freq * 0.5;
167 else
168 high_freq = high_freq * 0.3;
169 } else if (sample_rate1 == 11025)
170 high_freq = high_freq * 0.7;
171 else if (sample_rate1 == 8000) {
173 high_freq = high_freq * 0.5;
175 s->use_noise_coding = 0;
176 else
177 high_freq = high_freq * 0.65;
178 } else {
180 high_freq = high_freq * 0.75;
182 high_freq = high_freq * 0.6;
183 else
184 high_freq = high_freq * 0.5;
185 }
186 ff_dlog(
s->avctx,
"flags2=0x%x\n", flags2);
187 ff_dlog(
s->avctx,
"version=%d channels=%d sample_rate=%d bitrate=%"PRId64
" block_align=%d\n",
190 ff_dlog(
s->avctx,
"bps=%f bps1=%f high_freq=%f bitoffset=%d\n",
191 bps, bps1, high_freq,
s->byte_offset_bits);
192 ff_dlog(
s->avctx,
"use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
193 s->use_noise_coding,
s->use_exp_vlc,
s->nb_block_sizes);
194
195 /* compute the scale factor band sizes for each MDCT block size */
196 {
197 int a,
b,
pos, lpos, k, block_len,
i, j, n;
198 const uint8_t *
table;
199
202 else
204 for (k = 0; k <
s->nb_block_sizes; k++) {
205 block_len =
s->frame_len >> k;
206
207 if (
s->version == 1) {
208 lpos = 0;
209 for (
i = 0;
i < 25;
i++) {
212 pos = ((block_len * 2 *
a) + (
b >> 1)) /
b;
215 s->exponent_bands[0][
i] =
pos - lpos;
216 if (
pos >= block_len) {
218 break;
219 }
221 }
222 s->exponent_sizes[0] =
i;
223 } else {
224 /* hardcoded tables */
234 }
237 for (
i = 0;
i < n;
i++)
239 s->exponent_sizes[k] = n;
240 } else {
241 j = 0;
242 lpos = 0;
243 for (
i = 0;
i < 25;
i++) {
246 pos = ((block_len * 2 *
a) + (
b << 1)) / (4 *
b);
251 s->exponent_bands[k][j++] =
pos - lpos;
252 if (
pos >= block_len)
253 break;
255 }
256 s->exponent_sizes[k] = j;
257 }
258 }
259
260 /* max number of coefs */
261 s->coefs_end[k] = (
s->frame_len - ((
s->frame_len * 9) / 100)) >> k;
262 /* high freq computation */
263 s->high_band_start[k] = (int) ((block_len * 2 * high_freq) /
265 n =
s->exponent_sizes[k];
266 j = 0;
268 for (
i = 0;
i < n;
i++) {
269 int start, end;
271 pos +=
s->exponent_bands[k][
i];
273 if (start < s->high_band_start[k])
274 start =
s->high_band_start[k];
275 if (end >
s->coefs_end[k])
276 end =
s->coefs_end[k];
277 if (end > start)
278 s->exponent_high_bands[k][j++] = end - start;
279 }
280 s->exponent_high_sizes[k] = j;
281 }
282 }
283
284 #ifdef TRACE
285 {
287 for (
i = 0;
i <
s->nb_block_sizes;
i++) {
290 s->exponent_sizes[
i]);
291 for (j = 0; j <
s->exponent_sizes[
i]; j++)
292 ff_tlog(
s->avctx,
" %d",
s->exponent_bands[
i][j]);
294 }
295 }
296 #endif /* TRACE */
297
298 /* init MDCT windows : simple sine window */
299 for (
i = 0;
i <
s->nb_block_sizes;
i++) {
302 }
303
304 s->reset_block_lengths = 1;
305
306 if (
s->use_noise_coding) {
307 /* init the noise generator */
309 s->noise_mult = 0.02;
310 else
311 s->noise_mult = 0.04;
312
313 #ifdef TRACE
315 s->noise_table[
i] = 1.0 *
s->noise_mult;
316 #else
317 {
319 float norm;
321 norm = (1.0 / (
float) (1LL << 31)) * sqrt(3) *
s->noise_mult;
325 }
326 }
327 #endif /* TRACE */
328 }
329
333
334 /* choose the VLC tables for the coefficients */
335 coef_vlc_table = 2;
336 if (avctx->sample_rate >= 32000) {
337 if (bps1 < 0.72)
338 coef_vlc_table = 0;
339 else if (bps1 < 1.16)
340 coef_vlc_table = 1;
341 }
342 s->coef_vlcs[0] = &
coef_vlcs[coef_vlc_table * 2];
343 s->coef_vlcs[1] = &
coef_vlcs[coef_vlc_table * 2 + 1];
345 &
s->int_table[0],
s->coef_vlcs[0]);
348
350 &
s->int_table[1],
s->coef_vlcs[1]);
351 }
352
354 {
355 if (total_gain < 15)
356 return 13;
357 else if (total_gain < 32)
358 return 12;
359 else if (total_gain < 40)
360 return 11;
361 else if (total_gain < 45)
362 return 10;
363 else
364 return 9;
365 }
366
368 {
371
372 for (
i = 0;
i <
s->nb_block_sizes;
i++)
374
377 if (
s->use_noise_coding)
379 for (
i = 0;
i < 2;
i++) {
384 }
386
387 return 0;
388 }
389
390 /**
391 * Decode an uncompressed coefficient.
392 * @param gb GetBitContext
393 * @return the decoded coefficient
394 */
396 {
397 /** consumes up to 34 bits */
398 int n_bits = 8;
399 /** decode length */
401 n_bits += 8;
403 n_bits += 8;
405 n_bits += 7;
406 }
407 }
409 }
410
411 /**
412 * Decode run level compressed coefficients.
413 * @param avctx codec context
414 * @param gb bitstream reader context
415 * @param vlc vlc table for get_vlc2
416 * @param level_table level codes
417 * @param run_table run codes
418 * @param version 0 for wma1,2 1 for wmapro
419 * @param ptr output buffer
420 * @param offset offset in the output buffer
421 * @param num_coefs number of input coefficients
422 * @param block_len input buffer length (2^n)
423 * @param frame_len_bits number of bits for escaped run codes
424 * @param coef_nb_bits number of bits for escaped level codes
425 * @return 0 on success, -1 otherwise
426 */
428 const VLCElem *vlc,
const float *level_table,
429 const uint16_t *run_table,
int version,
431 int block_len, int frame_len_bits,
432 int coef_nb_bits)
433 {
435 const uint32_t *ilvl = (const uint32_t *) level_table;
436 uint32_t *iptr = (uint32_t *) ptr;
437 const unsigned int coef_mask = block_len - 1;
441 /** normal code */
444 iptr[
offset & coef_mask] = ilvl[
code] ^ (sign & 0x80000000);
445 }
else if (
code == 1) {
446 /** EOB */
447 break;
448 } else {
449 /** escape */
452 /** NOTE: this is rather suboptimal. reading
453 * block_len_bits would be better */
455 } else {
457 /** escape decode */
462 "broken escape sequence\n");
464 } else
466 } else
468 }
469 }
472 }
473 }
474 /** NOTE: EOB can be omitted */
477 "overflow (%d > %d) in spectral RLE, ignoring\n",
479 num_coefs
480 );
482 }
483
484 return 0;
485 }