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 }