comparison mpegaudiodec.c @ 3608:f713d34d5d01 libavcodec

simplify
author michael
date Wed, 23 Aug 2006 23:40:03 +0000
parents 997036dffa26
children 6560c84eef72
comparison
equal deleted inserted replaced
3607:997036dffa26 3608:f713d34d5d01
164 static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g); 164 static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g);
165 static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g); 165 static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g);
166 166
167 /* vlc structure for decoding layer 3 huffman tables */ 167 /* vlc structure for decoding layer 3 huffman tables */
168 static VLC huff_vlc[16]; 168 static VLC huff_vlc[16];
169 static uint8_t *huff_code_table[16];
170 static VLC huff_quad_vlc[2]; 169 static VLC huff_quad_vlc[2];
171 /* computed from band_size_long */ 170 /* computed from band_size_long */
172 static uint16_t band_index_long[9][23]; 171 static uint16_t band_index_long[9][23];
173 /* XXX: free when all decoders are closed */ 172 /* XXX: free when all decoders are closed */
174 #define TABLE_4_3_SIZE (8191 + 16)*4 173 #define TABLE_4_3_SIZE (8191 + 16)*4
366 } 365 }
367 366
368 ff_mpa_synth_init(window); 367 ff_mpa_synth_init(window);
369 368
370 /* huffman decode tables */ 369 /* huffman decode tables */
371 huff_code_table[0] = NULL;
372 for(i=1;i<16;i++) { 370 for(i=1;i<16;i++) {
373 const HuffTable *h = &mpa_huff_tables[i]; 371 const HuffTable *h = &mpa_huff_tables[i];
374 int xsize, x, y; 372 int xsize, x, y;
375 unsigned int n; 373 unsigned int n;
376 uint8_t *code_table; 374 uint8_t tmp_bits [256];
375 uint16_t tmp_codes[256];
376
377 memset(tmp_bits , 0, sizeof(tmp_bits ));
378 memset(tmp_codes, 0, sizeof(tmp_codes));
377 379
378 xsize = h->xsize; 380 xsize = h->xsize;
379 n = xsize * xsize; 381 n = xsize * xsize;
380 /* XXX: fail test */ 382
381 init_vlc(&huff_vlc[i], 8, n,
382 h->bits, 1, 1, h->codes, 2, 2, 1);
383
384 code_table = av_mallocz(n);
385 j = 0; 383 j = 0;
386 for(x=0;x<xsize;x++) { 384 for(x=0;x<xsize;x++) {
387 for(y=0;y<xsize;y++) 385 for(y=0;y<xsize;y++){
388 code_table[j++] = (x << 4) | y; 386 tmp_bits [(x << 4) | y]= h->bits [j ];
389 } 387 tmp_codes[(x << 4) | y]= h->codes[j++];
390 huff_code_table[i] = code_table; 388 }
389 }
390
391 /* XXX: fail test */
392 init_vlc(&huff_vlc[i], 8, 256,
393 tmp_bits, 1, 1, tmp_codes, 2, 2, 1);
391 } 394 }
392 for(i=0;i<2;i++) { 395 for(i=0;i<2;i++) {
393 init_vlc(&huff_quad_vlc[i], i == 0 ? 7 : 4, 16, 396 init_vlc(&huff_quad_vlc[i], i == 0 ? 7 : 4, 16,
394 mpa_quad_bits[i], 1, 1, mpa_quad_codes[i], 1, 1, 1); 397 mpa_quad_bits[i], 1, 1, mpa_quad_codes[i], 1, 1, 1);
395 } 398 }
1668 { 1671 {
1669 int s_index; 1672 int s_index;
1670 int linbits, code, x, y, l, v, i, j, k, pos; 1673 int linbits, code, x, y, l, v, i, j, k, pos;
1671 GetBitContext last_gb; 1674 GetBitContext last_gb;
1672 VLC *vlc; 1675 VLC *vlc;
1673 uint8_t *code_table;
1674 1676
1675 /* low frequencies (called big values) */ 1677 /* low frequencies (called big values) */
1676 s_index = 0; 1678 s_index = 0;
1677 for(i=0;i<3;i++) { 1679 for(i=0;i<3;i++) {
1678 j = g->region_size[i]; 1680 j = g->region_size[i];
1681 /* select vlc table */ 1683 /* select vlc table */
1682 k = g->table_select[i]; 1684 k = g->table_select[i];
1683 l = mpa_huff_data[k][0]; 1685 l = mpa_huff_data[k][0];
1684 linbits = mpa_huff_data[k][1]; 1686 linbits = mpa_huff_data[k][1];
1685 vlc = &huff_vlc[l]; 1687 vlc = &huff_vlc[l];
1686 code_table = huff_code_table[l];
1687 1688
1688 /* read huffcode and compute each couple */ 1689 /* read huffcode and compute each couple */
1689 for(;j>0;j--) { 1690 for(;j>0;j--) {
1690 if (get_bits_count(&s->gb) >= end_pos) 1691 if (get_bits_count(&s->gb) >= end_pos)
1691 break; 1692 break;
1692 if (code_table) { 1693 if (l) {
1693 code = get_vlc2(&s->gb, vlc->table, 8, 3); 1694 y = get_vlc2(&s->gb, vlc->table, 8, 3);
1694 if (code < 0)
1695 return -1;
1696 y = code_table[code];
1697 x = y >> 4; 1695 x = y >> 4;
1698 y = y & 0x0f; 1696 y = y & 0x0f;
1699 } else { 1697 } else {
1700 x = 0; 1698 x = 0;
1701 y = 0; 1699 y = 0;
2230 /* convert region offsets to region sizes and truncate 2228 /* convert region offsets to region sizes and truncate
2231 size to big_values */ 2229 size to big_values */
2232 g->region_size[2] = (576 / 2); 2230 g->region_size[2] = (576 / 2);
2233 j = 0; 2231 j = 0;
2234 for(i=0;i<3;i++) { 2232 for(i=0;i<3;i++) {
2235 k = g->region_size[i]; 2233 k = FFMIN(g->region_size[i], g->big_values);
2236 if (k > g->big_values)
2237 k = g->big_values;
2238 g->region_size[i] = k - j; 2234 g->region_size[i] = k - j;
2239 j = k; 2235 j = k;
2240 } 2236 }
2241 2237
2242 /* compute band indexes */ 2238 /* compute band indexes */
2250 else if (s->sample_rate_index != 8) 2246 else if (s->sample_rate_index != 8)
2251 g->long_end = 6; 2247 g->long_end = 6;
2252 else 2248 else
2253 g->long_end = 4; /* 8000 Hz */ 2249 g->long_end = 4; /* 8000 Hz */
2254 2250
2255 if (s->sample_rate_index != 8) 2251 g->short_start = 2 + (s->sample_rate_index != 8);
2256 g->short_start = 3;
2257 else
2258 g->short_start = 2;
2259 } else { 2252 } else {
2260 g->long_end = 0; 2253 g->long_end = 0;
2261 g->short_start = 0; 2254 g->short_start = 0;
2262 } 2255 }
2263 } else { 2256 } else {