Mercurial > libavcodec.hg
comparison wma.c @ 9840:71066f133e1c libavcodec
cosmetics: Prettyprint and reformat wma.c closer to K&R style.
author | diego |
---|---|
date | Fri, 12 Jun 2009 13:12:13 +0000 |
parents | 04423b2f6e0b |
children | 39bb2646fe00 |
comparison
equal
deleted
inserted
replaced
9839:ee32274eb802 | 9840:71066f133e1c |
---|---|
26 #undef NDEBUG | 26 #undef NDEBUG |
27 #include <assert.h> | 27 #include <assert.h> |
28 | 28 |
29 /* XXX: use same run/length optimization as mpeg decoders */ | 29 /* XXX: use same run/length optimization as mpeg decoders */ |
30 //FIXME maybe split decode / encode or pass flag | 30 //FIXME maybe split decode / encode or pass flag |
31 static void init_coef_vlc(VLC *vlc, | 31 static void init_coef_vlc(VLC *vlc, uint16_t **prun_table, |
32 uint16_t **prun_table, uint16_t **plevel_table, uint16_t **pint_table, | 32 uint16_t **plevel_table, uint16_t **pint_table, |
33 const CoefVLCTable *vlc_table) | 33 const CoefVLCTable *vlc_table) |
34 { | 34 { |
35 int n = vlc_table->n; | 35 int n = vlc_table->n; |
36 const uint8_t *table_bits = vlc_table->huffbits; | 36 const uint8_t *table_bits = vlc_table->huffbits; |
37 const uint32_t *table_codes = vlc_table->huffcodes; | 37 const uint32_t *table_codes = vlc_table->huffcodes; |
38 const uint16_t *levels_table = vlc_table->levels; | 38 const uint16_t *levels_table = vlc_table->levels; |
39 uint16_t *run_table, *level_table, *int_table; | 39 uint16_t *run_table, *level_table, *int_table; |
40 int i, l, j, k, level; | 40 int i, l, j, k, level; |
41 | 41 |
42 init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); | 42 init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); |
43 | 43 |
44 run_table = av_malloc(n * sizeof(uint16_t)); | 44 run_table = av_malloc(n * sizeof(uint16_t)); |
45 level_table = av_malloc(n * sizeof(uint16_t)); | 45 level_table = av_malloc(n * sizeof(uint16_t)); |
46 int_table = av_malloc(n * sizeof(uint16_t)); | 46 int_table = av_malloc(n * sizeof(uint16_t)); |
47 i = 2; | 47 i = 2; |
48 level = 1; | 48 level = 1; |
49 k = 0; | 49 k = 0; |
50 while (i < n) { | 50 while (i < n) { |
51 int_table[k]= i; | 51 int_table[k] = i; |
52 l = levels_table[k++]; | 52 l = levels_table[k++]; |
53 for(j=0;j<l;j++) { | 53 for (j = 0; j < l; j++) { |
54 run_table[i] = j; | 54 run_table[i] = j; |
55 level_table[i] = level; | 55 level_table[i] = level; |
56 i++; | 56 i++; |
57 } | 57 } |
58 level++; | 58 level++; |
59 } | 59 } |
60 *prun_table = run_table; | 60 *prun_table = run_table; |
61 *plevel_table = level_table; | 61 *plevel_table = level_table; |
62 *pint_table= int_table; | 62 *pint_table = int_table; |
63 } | 63 } |
64 | 64 |
65 int ff_wma_init(AVCodecContext * avctx, int flags2) | 65 int ff_wma_init(AVCodecContext *avctx, int flags2) |
66 { | 66 { |
67 WMACodecContext *s = avctx->priv_data; | 67 WMACodecContext *s = avctx->priv_data; |
68 int i; | 68 int i; |
69 float bps1, high_freq; | 69 float bps1, high_freq; |
70 volatile float bps; | 70 volatile float bps; |
71 int sample_rate1; | 71 int sample_rate1; |
72 int coef_vlc_table; | 72 int coef_vlc_table; |
73 | 73 |
74 if( avctx->sample_rate<=0 || avctx->sample_rate>50000 | 74 if ( avctx->sample_rate <= 0 || avctx->sample_rate > 50000 |
75 || avctx->channels<=0 || avctx->channels>8 | 75 || avctx->channels <= 0 || avctx->channels > 8 |
76 || avctx->bit_rate<=0) | 76 || avctx->bit_rate <= 0) |
77 return -1; | 77 return -1; |
78 | 78 |
79 s->sample_rate = avctx->sample_rate; | 79 s->sample_rate = avctx->sample_rate; |
80 s->nb_channels = avctx->channels; | 80 s->nb_channels = avctx->channels; |
81 s->bit_rate = avctx->bit_rate; | 81 s->bit_rate = avctx->bit_rate; |
82 s->block_align = avctx->block_align; | 82 s->block_align = avctx->block_align; |
83 | 83 |
84 dsputil_init(&s->dsp, avctx); | 84 dsputil_init(&s->dsp, avctx); |
85 | 85 |
86 if (avctx->codec->id == CODEC_ID_WMAV1) { | 86 if (avctx->codec->id == CODEC_ID_WMAV1) { |
90 } | 90 } |
91 | 91 |
92 /* compute MDCT block size */ | 92 /* compute MDCT block size */ |
93 if (s->sample_rate <= 16000) { | 93 if (s->sample_rate <= 16000) { |
94 s->frame_len_bits = 9; | 94 s->frame_len_bits = 9; |
95 } else if (s->sample_rate <= 22050 || | 95 } else if ( s->sample_rate <= 22050 || |
96 (s->sample_rate <= 32000 && s->version == 1)) { | 96 (s->sample_rate <= 32000 && s->version == 1)) { |
97 s->frame_len_bits = 10; | 97 s->frame_len_bits = 10; |
98 } else { | 98 } else { |
99 s->frame_len_bits = 11; | 99 s->frame_len_bits = 11; |
100 } | 100 } |
175 high_freq = high_freq * 0.5; | 175 high_freq = high_freq * 0.5; |
176 } | 176 } |
177 } | 177 } |
178 dprintf(s->avctx, "flags2=0x%x\n", flags2); | 178 dprintf(s->avctx, "flags2=0x%x\n", flags2); |
179 dprintf(s->avctx, "version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", | 179 dprintf(s->avctx, "version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", |
180 s->version, s->nb_channels, s->sample_rate, s->bit_rate, | 180 s->version, s->nb_channels, s->sample_rate, s->bit_rate, |
181 s->block_align); | 181 s->block_align); |
182 dprintf(s->avctx, "bps=%f bps1=%f high_freq=%f bitoffset=%d\n", | 182 dprintf(s->avctx, "bps=%f bps1=%f high_freq=%f bitoffset=%d\n", |
183 bps, bps1, high_freq, s->byte_offset_bits); | 183 bps, bps1, high_freq, s->byte_offset_bits); |
184 dprintf(s->avctx, "use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", | 184 dprintf(s->avctx, "use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", |
185 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); | 185 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); |
186 | 186 |
187 /* compute the scale factor band sizes for each MDCT block size */ | 187 /* compute the scale factor band sizes for each MDCT block size */ |
188 { | 188 { |
189 int a, b, pos, lpos, k, block_len, i, j, n; | 189 int a, b, pos, lpos, k, block_len, i, j, n; |
190 const uint8_t *table; | 190 const uint8_t *table; |
192 if (s->version == 1) { | 192 if (s->version == 1) { |
193 s->coefs_start = 3; | 193 s->coefs_start = 3; |
194 } else { | 194 } else { |
195 s->coefs_start = 0; | 195 s->coefs_start = 0; |
196 } | 196 } |
197 for(k = 0; k < s->nb_block_sizes; k++) { | 197 for (k = 0; k < s->nb_block_sizes; k++) { |
198 block_len = s->frame_len >> k; | 198 block_len = s->frame_len >> k; |
199 | 199 |
200 if (s->version == 1) { | 200 if (s->version == 1) { |
201 lpos = 0; | 201 lpos = 0; |
202 for(i=0;i<25;i++) { | 202 for (i = 0; i < 25; i++) { |
203 a = wma_critical_freqs[i]; | 203 a = wma_critical_freqs[i]; |
204 b = s->sample_rate; | 204 b = s->sample_rate; |
205 pos = ((block_len * 2 * a) + (b >> 1)) / b; | 205 pos = ((block_len * 2 * a) + (b >> 1)) / b; |
206 if (pos > block_len) | 206 if (pos > block_len) |
207 pos = block_len; | 207 pos = block_len; |
208 s->exponent_bands[0][i] = pos - lpos; | 208 s->exponent_bands[0][i] = pos - lpos; |
209 if (pos >= block_len) { | 209 if (pos >= block_len) { |
210 i++; | 210 i++; |
225 else if (s->sample_rate >= 22050) | 225 else if (s->sample_rate >= 22050) |
226 table = exponent_band_22050[a]; | 226 table = exponent_band_22050[a]; |
227 } | 227 } |
228 if (table) { | 228 if (table) { |
229 n = *table++; | 229 n = *table++; |
230 for(i=0;i<n;i++) | 230 for (i = 0; i < n; i++) |
231 s->exponent_bands[k][i] = table[i]; | 231 s->exponent_bands[k][i] = table[i]; |
232 s->exponent_sizes[k] = n; | 232 s->exponent_sizes[k] = n; |
233 } else { | 233 } else { |
234 j = 0; | 234 j = 0; |
235 lpos = 0; | 235 lpos = 0; |
236 for(i=0;i<25;i++) { | 236 for (i = 0; i < 25; i++) { |
237 a = wma_critical_freqs[i]; | 237 a = wma_critical_freqs[i]; |
238 b = s->sample_rate; | 238 b = s->sample_rate; |
239 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); | 239 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); |
240 pos <<= 2; | 240 pos <<= 2; |
241 if (pos > block_len) | 241 if (pos > block_len) |
242 pos = block_len; | 242 pos = block_len; |
243 if (pos > lpos) | 243 if (pos > lpos) |
244 s->exponent_bands[k][j++] = pos - lpos; | 244 s->exponent_bands[k][j++] = pos - lpos; |
256 s->high_band_start[k] = (int)((block_len * 2 * high_freq) / | 256 s->high_band_start[k] = (int)((block_len * 2 * high_freq) / |
257 s->sample_rate + 0.5); | 257 s->sample_rate + 0.5); |
258 n = s->exponent_sizes[k]; | 258 n = s->exponent_sizes[k]; |
259 j = 0; | 259 j = 0; |
260 pos = 0; | 260 pos = 0; |
261 for(i=0;i<n;i++) { | 261 for (i = 0; i < n; i++) { |
262 int start, end; | 262 int start, end; |
263 start = pos; | 263 start = pos; |
264 pos += s->exponent_bands[k][i]; | 264 pos += s->exponent_bands[k][i]; |
265 end = pos; | 265 end = pos; |
266 if (start < s->high_band_start[k]) | 266 if (start < s->high_band_start[k]) |
271 s->exponent_high_bands[k][j++] = end - start; | 271 s->exponent_high_bands[k][j++] = end - start; |
272 } | 272 } |
273 s->exponent_high_sizes[k] = j; | 273 s->exponent_high_sizes[k] = j; |
274 #if 0 | 274 #if 0 |
275 tprintf(s->avctx, "%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ", | 275 tprintf(s->avctx, "%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ", |
276 s->frame_len >> k, | 276 s->frame_len >> k, |
277 s->coefs_end[k], | 277 s->coefs_end[k], |
278 s->high_band_start[k], | 278 s->high_band_start[k], |
279 s->exponent_high_sizes[k]); | 279 s->exponent_high_sizes[k]); |
280 for(j=0;j<s->exponent_high_sizes[k];j++) | 280 for (j = 0; j < s->exponent_high_sizes[k]; j++) |
281 tprintf(s->avctx, " %d", s->exponent_high_bands[k][j]); | 281 tprintf(s->avctx, " %d", s->exponent_high_bands[k][j]); |
282 tprintf(s->avctx, "\n"); | 282 tprintf(s->avctx, "\n"); |
283 #endif | 283 #endif |
284 } | 284 } |
285 } | 285 } |
286 | 286 |
287 #ifdef TRACE | 287 #ifdef TRACE |
288 { | 288 { |
289 int i, j; | 289 int i, j; |
290 for(i = 0; i < s->nb_block_sizes; i++) { | 290 for (i = 0; i < s->nb_block_sizes; i++) { |
291 tprintf(s->avctx, "%5d: n=%2d:", | 291 tprintf(s->avctx, "%5d: n=%2d:", |
292 s->frame_len >> i, | 292 s->frame_len >> i, |
293 s->exponent_sizes[i]); | 293 s->exponent_sizes[i]); |
294 for(j=0;j<s->exponent_sizes[i];j++) | 294 for (j = 0; j < s->exponent_sizes[i]; j++) |
295 tprintf(s->avctx, " %d", s->exponent_bands[i][j]); | 295 tprintf(s->avctx, " %d", s->exponent_bands[i][j]); |
296 tprintf(s->avctx, "\n"); | 296 tprintf(s->avctx, "\n"); |
297 } | 297 } |
298 } | 298 } |
299 #endif | 299 #endif |
300 | 300 |
301 /* init MDCT windows : simple sinus window */ | 301 /* init MDCT windows : simple sinus window */ |
302 for(i = 0; i < s->nb_block_sizes; i++) { | 302 for (i = 0; i < s->nb_block_sizes; i++) { |
303 int n; | 303 int n; |
304 n = 1 << (s->frame_len_bits - i); | 304 n = 1 << (s->frame_len_bits - i); |
305 ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i - 7], n); | 305 ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i - 7], n); |
306 s->windows[i] = ff_sine_windows[s->frame_len_bits - i - 7]; | 306 s->windows[i] = ff_sine_windows[s->frame_len_bits - i - 7]; |
307 } | 307 } |
315 s->noise_mult = 0.02; | 315 s->noise_mult = 0.02; |
316 else | 316 else |
317 s->noise_mult = 0.04; | 317 s->noise_mult = 0.04; |
318 | 318 |
319 #ifdef TRACE | 319 #ifdef TRACE |
320 for(i=0;i<NOISE_TAB_SIZE;i++) | 320 for (i = 0; i < NOISE_TAB_SIZE; i++) |
321 s->noise_table[i] = 1.0 * s->noise_mult; | 321 s->noise_table[i] = 1.0 * s->noise_mult; |
322 #else | 322 #else |
323 { | 323 { |
324 unsigned int seed; | 324 unsigned int seed; |
325 float norm; | 325 float norm; |
326 seed = 1; | 326 seed = 1; |
327 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult; | 327 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult; |
328 for(i=0;i<NOISE_TAB_SIZE;i++) { | 328 for (i = 0; i < NOISE_TAB_SIZE; i++) { |
329 seed = seed * 314159 + 1; | 329 seed = seed * 314159 + 1; |
330 s->noise_table[i] = (float)((int)seed) * norm; | 330 s->noise_table[i] = (float)((int)seed) * norm; |
331 } | 331 } |
332 } | 332 } |
333 #endif | 333 #endif |
349 s->coef_vlcs[1]); | 349 s->coef_vlcs[1]); |
350 | 350 |
351 return 0; | 351 return 0; |
352 } | 352 } |
353 | 353 |
354 int ff_wma_total_gain_to_bits(int total_gain){ | 354 int ff_wma_total_gain_to_bits(int total_gain) |
355 { | |
355 if (total_gain < 15) return 13; | 356 if (total_gain < 15) return 13; |
356 else if (total_gain < 32) return 12; | 357 else if (total_gain < 32) return 12; |
357 else if (total_gain < 40) return 11; | 358 else if (total_gain < 40) return 11; |
358 else if (total_gain < 45) return 10; | 359 else if (total_gain < 45) return 10; |
359 else return 9; | 360 else return 9; |
362 int ff_wma_end(AVCodecContext *avctx) | 363 int ff_wma_end(AVCodecContext *avctx) |
363 { | 364 { |
364 WMACodecContext *s = avctx->priv_data; | 365 WMACodecContext *s = avctx->priv_data; |
365 int i; | 366 int i; |
366 | 367 |
367 for(i = 0; i < s->nb_block_sizes; i++) | 368 for (i = 0; i < s->nb_block_sizes; i++) |
368 ff_mdct_end(&s->mdct_ctx[i]); | 369 ff_mdct_end(&s->mdct_ctx[i]); |
369 | 370 |
370 if (s->use_exp_vlc) { | 371 if (s->use_exp_vlc) { |
371 free_vlc(&s->exp_vlc); | 372 free_vlc(&s->exp_vlc); |
372 } | 373 } |
373 if (s->use_noise_coding) { | 374 if (s->use_noise_coding) { |
374 free_vlc(&s->hgain_vlc); | 375 free_vlc(&s->hgain_vlc); |
375 } | 376 } |
376 for(i = 0;i < 2; i++) { | 377 for (i = 0; i < 2; i++) { |
377 free_vlc(&s->coef_vlc[i]); | 378 free_vlc(&s->coef_vlc[i]); |
378 av_free(s->run_table[i]); | 379 av_free(s->run_table[i]); |
379 av_free(s->level_table[i]); | 380 av_free(s->level_table[i]); |
380 av_free(s->int_table[i]); | 381 av_free(s->int_table[i]); |
381 } | 382 } |