comparison ac3dec.c @ 5456:2335f18d1b47 libavcodec

use floating-point mantissa dequantization tables
author jbr
date Sat, 04 Aug 2007 03:21:17 +0000
parents 5afadd8cad2a
children 0a5849a4858b
comparison
equal deleted inserted replaced
5455:5afadd8cad2a 5456:2335f18d1b47
50 static float scale_factors[25]; 50 static float scale_factors[25];
51 51
52 /** table for grouping exponents */ 52 /** table for grouping exponents */
53 static uint8_t exp_ungroup_tbl[128][3]; 53 static uint8_t exp_ungroup_tbl[128][3];
54 54
55 static int16_t l3_quantizers_1[32]; 55
56 static int16_t l3_quantizers_2[32]; 56 /** tables for ungrouping mantissas */
57 static int16_t l3_quantizers_3[32]; 57 static float b1_mantissas[32][3];
58 58 static float b2_mantissas[128][3];
59 static int16_t l5_quantizers_1[128]; 59 static float b3_mantissas[8];
60 static int16_t l5_quantizers_2[128]; 60 static float b4_mantissas[128][2];
61 static int16_t l5_quantizers_3[128]; 61 static float b5_mantissas[16];
62 62
63 static int16_t l7_quantizers[7]; 63 /**
64 64 * Quantization table: levels for symmetric. bits for asymmetric.
65 static int16_t l11_quantizers_1[128]; 65 * reference: Table 7.18 Mapping of bap to Quantizer
66 static int16_t l11_quantizers_2[128]; 66 */
67 67 static const uint8_t qntztab[16] = {
68 static int16_t l15_quantizers[15]; 68 0, 3, 5, 7, 11, 15,
69 69 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
70 static const uint8_t qntztab[16] = { 0, 5, 7, 3, 7, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 }; 70 };
71 71
72 /* Adjustmens in dB gain */ 72 /* Adjustmens in dB gain */
73 #define LEVEL_MINUS_3DB 0.7071067811865476 73 #define LEVEL_MINUS_3DB 0.7071067811865476
74 #define LEVEL_MINUS_4POINT5DB 0.5946035575013605 74 #define LEVEL_MINUS_4POINT5DB 0.5946035575013605
75 #define LEVEL_MINUS_6DB 0.5000000000000000 75 #define LEVEL_MINUS_6DB 0.5000000000000000
191 sum++; 191 sum++;
192 for (i = 0; i < 256; i++) 192 for (i = 0; i < 256; i++)
193 window[i] = sqrt(local_window[i] / sum); 193 window[i] = sqrt(local_window[i] / sum);
194 } 194 }
195 195
196 /* 196 static inline float
197 * Generate quantizer tables. 197 symmetric_dequant(int code, int levels)
198 */ 198 {
199 static void generate_quantizers_table(int16_t quantizers[], int level, int length) 199 return (code - (levels >> 1)) * (2.0f / levels);
200 {
201 int i;
202
203 for (i = 0; i < length; i++)
204 quantizers[i] = ((2 * i - level + 1) << 15) / level;
205 }
206
207 static void generate_quantizers_table_1(int16_t quantizers[], int level, int length1, int length2, int size)
208 {
209 int i, j;
210 int16_t v;
211
212 for (i = 0; i < length1; i++) {
213 v = ((2 * i - level + 1) << 15) / level;
214 for (j = 0; j < length2; j++)
215 quantizers[i * length2 + j] = v;
216 }
217
218 for (i = length1 * length2; i < size; i++)
219 quantizers[i] = 0;
220 }
221
222 static void generate_quantizers_table_2(int16_t quantizers[], int level, int length1, int length2, int size)
223 {
224 int i, j;
225 int16_t v;
226
227 for (i = 0; i < length1; i++) {
228 v = ((2 * (i % level) - level + 1) << 15) / level;
229 for (j = 0; j < length2; j++)
230 quantizers[i * length2 + j] = v;
231 }
232
233 for (i = length1 * length2; i < size; i++)
234 quantizers[i] = 0;
235
236 }
237
238 static void generate_quantizers_table_3(int16_t quantizers[], int level, int length1, int length2, int size)
239 {
240 int i, j;
241
242 for (i = 0; i < length1; i++)
243 for (j = 0; j < length2; j++)
244 quantizers[i * length2 + j] = ((2 * (j % level) - level + 1) << 15) / level;
245
246 for (i = length1 * length2; i < size; i++)
247 quantizers[i] = 0;
248 } 200 }
249 201
250 /* 202 /*
251 * Initialize tables at runtime. 203 * Initialize tables at runtime.
252 */ 204 */
253 static void ac3_tables_init(void) 205 static void ac3_tables_init(void)
254 { 206 {
255 int i; 207 int i;
256 208
257 /* Quantizer ungrouping tables. */ 209 /* generate grouped mantissa tables
258 // for level-3 quantizers 210 reference: Section 7.3.5 Ungrouping of Mantissas */
259 generate_quantizers_table_1(l3_quantizers_1, 3, 3, 9, 32); 211 for(i=0; i<32; i++) {
260 generate_quantizers_table_2(l3_quantizers_2, 3, 9, 3, 32); 212 /* bap=1 mantissas */
261 generate_quantizers_table_3(l3_quantizers_3, 3, 9, 3, 32); 213 b1_mantissas[i][0] = symmetric_dequant( i / 9 , 3);
262 214 b1_mantissas[i][1] = symmetric_dequant((i % 9) / 3, 3);
263 //for level-5 quantizers 215 b1_mantissas[i][2] = symmetric_dequant((i % 9) % 3, 3);
264 generate_quantizers_table_1(l5_quantizers_1, 5, 5, 25, 128); 216 }
265 generate_quantizers_table_2(l5_quantizers_2, 5, 25, 5, 128); 217 for(i=0; i<128; i++) {
266 generate_quantizers_table_3(l5_quantizers_3, 5, 25, 5, 128); 218 /* bap=2 mantissas */
267 219 b2_mantissas[i][0] = symmetric_dequant( i / 25 , 5);
268 //for level-7 quantizers 220 b2_mantissas[i][1] = symmetric_dequant((i % 25) / 5, 5);
269 generate_quantizers_table(l7_quantizers, 7, 7); 221 b2_mantissas[i][2] = symmetric_dequant((i % 25) % 5, 5);
270 222
271 //for level-4 quantizers 223 /* bap=4 mantissas */
272 generate_quantizers_table_2(l11_quantizers_1, 11, 11, 11, 128); 224 b4_mantissas[i][0] = symmetric_dequant(i / 11, 11);
273 generate_quantizers_table_3(l11_quantizers_2, 11, 11, 11, 128); 225 b4_mantissas[i][1] = symmetric_dequant(i % 11, 11);
274 226 }
275 //for level-15 quantizers 227 /* generate ungrouped mantissa tables
276 generate_quantizers_table(l15_quantizers, 15, 15); 228 reference: Tables 7.21 and 7.23 */
277 /* End Quantizer ungrouping tables. */ 229 for(i=0; i<7; i++) {
230 /* bap=3 mantissas */
231 b3_mantissas[i] = symmetric_dequant(i, 7);
232 }
233 for(i=0; i<15; i++) {
234 /* bap=5 mantissas */
235 b5_mantissas[i] = symmetric_dequant(i, 15);
236 }
278 237
279 //generate scale factors 238 //generate scale factors
280 for (i = 0; i < 25; i++) 239 for (i = 0; i < 25; i++)
281 scale_factors[i] = pow(2.0, -(i + 15)); 240 scale_factors[i] = pow(2.0, -i);
282 241
283 /* generate exponent tables 242 /* generate exponent tables
284 reference: Section 7.1.3 Exponent Decoding */ 243 reference: Section 7.1.3 Exponent Decoding */
285 for(i=0; i<128; i++) { 244 for(i=0; i<128; i++) {
286 exp_ungroup_tbl[i][0] = i / 25; 245 exp_ungroup_tbl[i][0] = i / 25;
438 do { 397 do {
439 subbnd++; 398 subbnd++;
440 for(j=0; j<12; j++) { 399 for(j=0; j<12; j++) {
441 for(ch=1; ch<=ctx->nfchans; ch++) { 400 for(ch=1; ch<=ctx->nfchans; ch++) {
442 if(ctx->chincpl[ch-1]) 401 if(ctx->chincpl[ch-1])
443 ctx->transform_coeffs[ch][i] = ctx->transform_coeffs_cpl[i] * ctx->cplco[ch-1][bnd]; 402 ctx->transform_coeffs[ch][i] = ctx->transform_coeffs_cpl[i] * ctx->cplco[ch-1][bnd] * 8.0f;
444 } 403 }
445 i++; 404 i++;
446 } 405 }
447 } while((ctx->cplbndstrc >> subbnd) & 1); 406 } while((ctx->cplbndstrc >> subbnd) & 1);
448 } 407 }
449 } 408 }
450 409
451 typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */ 410 typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
452 int16_t l3_quantizers[3]; 411 float b1_mant[3];
453 int16_t l5_quantizers[3]; 412 float b2_mant[3];
454 int16_t l11_quantizers[2]; 413 float b4_mant[2];
455 int l3ptr; 414 int b1ptr;
456 int l5ptr; 415 int b2ptr;
457 int l11ptr; 416 int b4ptr;
458 } mant_groups; 417 } mant_groups;
459 418
460 /* Get the transform coefficients for particular channel */ 419 /* Get the transform coefficients for particular channel */
461 static int get_transform_coeffs_ch(AC3DecodeContext *ctx, int ch_index, mant_groups *m) 420 static int get_transform_coeffs_ch(AC3DecodeContext *ctx, int ch_index, mant_groups *m)
462 { 421 {
489 448
490 for (i = start; i < end; i++) { 449 for (i = start; i < end; i++) {
491 tbap = bap[i]; 450 tbap = bap[i];
492 switch (tbap) { 451 switch (tbap) {
493 case 0: 452 case 0:
494 coeffs[i] = (av_random(&ctx->dith_state) & 0xFFFF) * LEVEL_MINUS_3DB; 453 coeffs[i] = ((av_random(&ctx->dith_state) & 0xFFFF) * LEVEL_MINUS_3DB) / 32768.0f;
495 break; 454 break;
496 455
497 case 1: 456 case 1:
498 if (m->l3ptr > 2) { 457 if(m->b1ptr > 2) {
499 gcode = get_bits(gb, 5); 458 gcode = get_bits(gb, 5);
500 m->l3_quantizers[0] = l3_quantizers_1[gcode]; 459 m->b1_mant[0] = b1_mantissas[gcode][0];
501 m->l3_quantizers[1] = l3_quantizers_2[gcode]; 460 m->b1_mant[1] = b1_mantissas[gcode][1];
502 m->l3_quantizers[2] = l3_quantizers_3[gcode]; 461 m->b1_mant[2] = b1_mantissas[gcode][2];
503 m->l3ptr = 0; 462 m->b1ptr = 0;
504 } 463 }
505 coeffs[i] = m->l3_quantizers[m->l3ptr++]; 464 coeffs[i] = m->b1_mant[m->b1ptr++];
506 break; 465 break;
507 466
508 case 2: 467 case 2:
509 if (m->l5ptr > 2) { 468 if(m->b2ptr > 2) {
510 gcode = get_bits(gb, 7); 469 gcode = get_bits(gb, 7);
511 m->l5_quantizers[0] = l5_quantizers_1[gcode]; 470 m->b2_mant[0] = b2_mantissas[gcode][0];
512 m->l5_quantizers[1] = l5_quantizers_2[gcode]; 471 m->b2_mant[1] = b2_mantissas[gcode][1];
513 m->l5_quantizers[2] = l5_quantizers_3[gcode]; 472 m->b2_mant[2] = b2_mantissas[gcode][2];
514 m->l5ptr = 0; 473 m->b2ptr = 0;
515 } 474 }
516 coeffs[i] = m->l5_quantizers[m->l5ptr++]; 475 coeffs[i] = m->b2_mant[m->b2ptr++];
517 break; 476 break;
518 477
519 case 3: 478 case 3:
520 coeffs[i] = l7_quantizers[get_bits(gb, 3)]; 479 coeffs[i] = b3_mantissas[get_bits(gb, 3)];
521 break; 480 break;
522 481
523 case 4: 482 case 4:
524 if (m->l11ptr > 1) { 483 if(m->b4ptr > 1) {
525 gcode = get_bits(gb, 7); 484 gcode = get_bits(gb, 7);
526 m->l11_quantizers[0] = l11_quantizers_1[gcode]; 485 m->b4_mant[0] = b4_mantissas[gcode][0];
527 m->l11_quantizers[1] = l11_quantizers_2[gcode]; 486 m->b4_mant[1] = b4_mantissas[gcode][1];
528 m->l11ptr = 0; 487 m->b4ptr = 0;
529 } 488 }
530 coeffs[i] = m->l11_quantizers[m->l11ptr++]; 489 coeffs[i] = m->b4_mant[m->b4ptr++];
531 break; 490 break;
532 491
533 case 5: 492 case 5:
534 coeffs[i] = l15_quantizers[get_bits(gb, 4)]; 493 coeffs[i] = b5_mantissas[get_bits(gb, 4)];
535 break; 494 break;
536 495
537 default: 496 default:
538 coeffs[i] = get_sbits(gb, qntztab[tbap]) << (16 - qntztab[tbap]); 497 coeffs[i] = get_sbits(gb, qntztab[tbap]) * scale_factors[qntztab[tbap]-1];
539 break; 498 break;
540 } 499 }
541 coeffs[i] *= scale_factors[exps[i]]; 500 coeffs[i] *= scale_factors[exps[i]];
542 } 501 }
543 502
585 { 544 {
586 int i, end; 545 int i, end;
587 int got_cplchan = 0; 546 int got_cplchan = 0;
588 mant_groups m; 547 mant_groups m;
589 548
590 m.l3ptr = m.l5ptr = m.l11ptr = 3; 549 m.b1ptr = m.b2ptr = m.b4ptr = 3;
591 550
592 for (i = 0; i < ctx->nfchans; i++) { 551 for (i = 0; i < ctx->nfchans; i++) {
593 /* transform coefficients for individual channel */ 552 /* transform coefficients for individual channel */
594 if (get_transform_coeffs_ch(ctx, i, &m)) 553 if (get_transform_coeffs_ch(ctx, i, &m))
595 return -1; 554 return -1;
745 ctx->dither_all = 0; 704 ctx->dither_all = 0;
746 } 705 }
747 706
748 if (get_bits1(gb)) { /* dynamic range */ 707 if (get_bits1(gb)) { /* dynamic range */
749 dynrng = get_sbits(gb, 8); 708 dynrng = get_sbits(gb, 8);
750 ctx->dynrng = ((((dynrng & 0x1f) | 0x20) << 13) * scale_factors[3 - (dynrng >> 5)]); 709 ctx->dynrng = (((dynrng & 0x1f) | 0x20) << 13) * pow(2.0, -(18 - (dynrng >> 5)));
751 } else if(blk == 0) { 710 } else if(blk == 0) {
752 ctx->dynrng = 1.0; 711 ctx->dynrng = 1.0;
753 } 712 }
754 713
755 if(acmod == AC3_ACMOD_DUALMONO) { /* dynamic range 1+1 mode */ 714 if(acmod == AC3_ACMOD_DUALMONO) { /* dynamic range 1+1 mode */
756 if(get_bits1(gb)) { 715 if(get_bits1(gb)) {
757 dynrng = get_sbits(gb, 8); 716 dynrng = get_sbits(gb, 8);
758 ctx->dynrng2 = ((((dynrng & 0x1f) | 0x20) << 13) * scale_factors[3 - (dynrng >> 5)]); 717 ctx->dynrng2 = (((dynrng & 0x1f) | 0x20) << 13) * pow(2.0, -(18 - (dynrng >> 5)));
759 } else if(blk == 0) { 718 } else if(blk == 0) {
760 ctx->dynrng2 = 1.0; 719 ctx->dynrng2 = 1.0;
761 } 720 }
762 } 721 }
763 722
805 mstrcplco = 3 * get_bits(gb, 2); 764 mstrcplco = 3 * get_bits(gb, 2);
806 for (bnd = 0; bnd < ctx->ncplbnd; bnd++) { 765 for (bnd = 0; bnd < ctx->ncplbnd; bnd++) {
807 cplcoexp = get_bits(gb, 4); 766 cplcoexp = get_bits(gb, 4);
808 cplcomant = get_bits(gb, 4); 767 cplcomant = get_bits(gb, 4);
809 if (cplcoexp == 15) 768 if (cplcoexp == 15)
810 cplcomant <<= 14; 769 ctx->cplco[i][bnd] = cplcomant / 16.0f;
811 else 770 else
812 cplcomant = (cplcomant | 0x10) << 13; 771 ctx->cplco[i][bnd] = (cplcomant + 16.0f) / 32.0f;
813 ctx->cplco[i][bnd] = cplcomant * scale_factors[cplcoexp + mstrcplco]; 772 ctx->cplco[i][bnd] *= scale_factors[cplcoexp + mstrcplco];
814 } 773 }
815 } 774 }
816 775
817 if (acmod == AC3_ACMOD_STEREO && ctx->phsflginu && (ctx->cplcoe & 1 || ctx->cplcoe & 2)) 776 if (acmod == AC3_ACMOD_STEREO && ctx->phsflginu && (ctx->cplcoe & 1 || ctx->cplcoe & 2))
818 for (bnd = 0; bnd < ctx->ncplbnd; bnd++) 777 for (bnd = 0; bnd < ctx->ncplbnd; bnd++)